python http请求以及Cookie的模拟

对去哪儿网请求发送http查询:

方法中,url必须是无一个dns查询的url,不能够包含Url中的子目录;比如www.baidu.com是一个有效的url,而 www.baidu.com/file/ 就不是一个有效的url

post的时候header中的refer那个参数很重要。

  1. def get(self, url,  searchDepartureAirport=None, searchArrivalAirport=None, searchDepartureTime=None, searchArrivalTime=None):  
  2.         ''''' 
  3.         the get method: interface for get the page including information we gave to them 
  4.         '''  
  5.         resultHtml=httplib.HTTPConnection(url, 80False)  
  6.         resultHtml.request('GET''/site/oneway_list.htm?searchDepartureAirport=成都&searchArrivalAirport=天津&searchDepartureTime=2012-08-24&searchArrivalTime=2012-08-27&nextNDays=0&startSearch=true&from=fi_ont_search',  
  7.                            headers = { "Host":"flight.qunar.com\r\n",  
  8.                                       "User-Agent""Mozilla/5.0 (Windows NT 6.1; rv:14.0) Gecko/20100101 Firefox/14.0.1\r\n"})  
  9.         page=resultHtml.getresponse(False)  
  10.         return page.read()  


在获取其数据的时候,应该多次抓取,多次发送请求,看是否有新数据到来,并获取相应的数据。之前在做实验的时候,总是把前提放在只抓一次条件下,造成每次都只能够抓取到部分数据,如果有个人告诉我,那你抓很多次好了,估计我就能想起来了。哎,总算是问人解决了,以后在这个问题上吸取教训,下次就以这个问题作为思考的典型反例。



几乎所有脚本语言都提供了方便的 HTTP 客户端处理的功能,Python 也不例外,使用 urllib 和 urllib2 可以很方便地进行 HTTP GET 和 POST 等各种操作。并且还允许以类似于插件的形式加入一些 handler ,来定制 request 和 response ,比如代理的支持和 cookie 的支持都是这样添加进来的。具体来说,通过如下方式构造一个 opener :opener = urllib2.build_opener(urllib2.HTTPCookieProcessor())然后这个 opener 就可以处理 cookie 了,相当方便,并且可定制性也……好吧,总之,现在我希望能在客户端手动插入一些 cookie 值,但是不管是 HTTPCookieProcessor 还是 cookielib 里的 CookieJar 都没有提供类似的方法可以来实现。看起来,也并不是我一个人有这样的需求,因为我在查找解决方案的时候,还找到了有人给 Python 提交的这个 Patch,就是添加这个功能。不过看起来好像还没有被 accept 的样子,这样对标准库做暴力 patch 的方式可移植性似乎也不好。所以我还是另外找了解决方案,其实也很简单:看了 HTTPCookieProcessor 的实现代码之后,发现我可以做类似的事情,也就是在写一个 handler ,把我想要的 cookie 值强制放到 request 对象的 header 中去。于是我查了 Python 的文档,对于 handler 的接口好像几乎没有描述,于是我就照着 HTTPCookieProcessor 来写了。这个 handler 应该放在正常的 cookie 处理 handler 的后面,然后检查已经存在的 cookie header ,再进行合并一下。不过比较诡异的是在 Python 的文档里并没有找到 Request 对象有 get_header 之类的方法可以得到已经存在的 header 项的值,觉得很诡异,于是直接查了源代码,才找到了,确实有这个方法。之前有听人说过 Ruby 的文档做得如何如何的烂,Python 的文档做得如何如何的好,我虽然没觉得 Ruby 的文档很烂,但是也觉得 Python 的文档确实不错,我最喜欢它末尾的 Examples 。两个文档系统倒是走的不同的路,Ruby 的文档是从代码中抽取(特定格式的)注释来自动生成的,类似于 javadoc ;而 Python 现在用的是独立于源代码的文档系统,人工写的,不过到头来居然连函数都漏掉了,课件人工维护文档的弊端还是很明显的。其实我见过的文档系统,最好用的应该还是属于 Emacs/Elisp 了吧。 不过,废话少讲,handler 如下:

复制代码
  
  
  
class SimpleCookieHandler(urllib2.BaseHandler):
def http_request(self, req):
simple_cookie
= ' cc98Simple=1 '
if not req.has_header( ' Cookie
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值