python http请求以及Cookie的模拟

来源:互联网 发布:青华五轴编程视频教程 编辑:程序博客网 时间:2024/05/17 00:58

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

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

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

[python] view plain copy
  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'):
req.add_unredirected_header(
'Cookie', simple_cookie)
else:
cookie
= req.get_header('Cookie')
req.add_unredirected_header(
'Cookie', simple_cookie + '; ' + cookie)
return req
复制代码

 

然后,构造 opener 的时候加上这个 handler 就可以了:opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(), SimpleCookieHandler())但总归是一个 workaround ,期待那个 patch 被加入到标准库中吧。

 

转自:http://www.javaeye.com/articles/1695

 

最近在学习如何用Python模拟网站的表单登录,老是无法登录,在本地测试可以得到传递的参数,原来是cookie 的问题。。嘿嘿。。记录一下相关资料^^

 

使用已有的cookie访问网站

 

复制代码
import cookielib, urllib2

ckjar
= cookielib.MozillaCookieJar(os.path.join('C:\Documents and Settings\tom\Application Data\Mozilla\Firefox\Profiles\h5m61j1i.default', 'cookies.txt'))

req
= urllib2.Request(url, postdata, header)

req.add_header(
'User-Agent', \
'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)')

opener
= urllib2.build_opener(urllib2.HTTPCookieProcessor(ckjar) )

f
= opener.open(req)
htm
= f.read()
f.close()
复制代码

 

 

访问网站获得cookie,并把获得的cookie保存在cookie文件中
复制代码
import cookielib, urllib2

req
= urllib2.Request(url, postdata, header)
req.add_header(
'User-Agent', \
'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)')

ckjar
= cookielib.MozillaCookieJar(filename)
ckproc
= urllib2.HTTPCookieProcessor(ckjar)

opener
= urllib2.build_opener(ckproc)

f
= opener.open(req)
htm
= f.read()
f.close()

ckjar.save(ignore_discard
=True, ignore_expires=True)
复制代码


使用指定的参数生成cookie,并用这个cookie访问网站
复制代码
import cookielib, urllib2

cookiejar
= cookielib.CookieJar()
urlOpener
= urllib2.build_opener(urllib2.HTTPCookieProcessor(cookiejar))
values
= {'redirect':", 'email':'abc@abc.com',
'password':'password', 'rememberme':", 'submit':'OK, Let Me In!'}
data = urllib.urlencode(values)

request
= urllib2.Request(url, data)
url
= urlOpener.open(request)
print url.info()
page
= url.read()

request
= urllib2.Request(url)
url
= urlOpener.open(request)
page
= url.read()
print page
1 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 踢足球上肢和下肢不协调怎么办 ppt文字放映时重叠怎么办 月子8天腰背疼怎么办 生完五天腰背疼怎么办 生完孩子腰不好怎么办 养了个白眼狼怎么办 孩子学东西很慢怎么办 手不小心碰肿了怎么办 腿中间摩擦的疼怎么办 晚上睡觉时双腿酸胀怎么办 腿擦破皮了怎么办 快速好 宝宝腿擦破皮了怎么办 新生儿睡觉腿喜欢弯曲怎么办 孩子八个月交叉走路怎么办 胫椎引起双腿发热怎么办 婴儿头型睡扁了怎么办 膝盖抻筋了疼怎么办 小腿肚子抻筋了怎么办 后背抻筋了 很疼怎么办 运动膝盖抻着了怎么办 大腿内侧抻着了怎么办 大腿抻筋了 很疼怎么办 小腿肚子聚筋了怎么办 6个月婴儿腿弯怎么办 胳膊抻筋拉伤了怎么办 宝宝抻着了怎么办妙招 拎东西胳膊抻了怎么办 小臂一用力筋疼怎么办 摔破胳膊很痛怎么办 胳膊的筋扭伤了怎么办 小孩胳膊抻筋了怎么办 肩膀抻着了怎么办妙招 右边肩膀抻着了怎么办 胳膊因劳累很痛怎么办 宝宝胳膊摔了疼怎么办 宝宝胳膊抻筋了怎么办 孕妇胳膊筋伤了怎么办 刚进公司就怀孕怎么办 撞到胳膊麻筋了怎么办 腰抻了怎么办多久能好 腰突然抻了一下怎么办