python http请求以及Cookie的模拟

对去哪儿网请求发送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':'[email protected]',
' 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

你可能感兴趣的:(python)