http://blog.csdn.net/uestcyao/article/details/7896184
对去哪儿网请求发送http查询:
方法中,url必须是无一个dns查询的url,不能够包含Url中的子目录;比如www.baidu.com是一个有效的url,而 www.baidu.com/file/ 就不是一个有效的url
post的时候header中的refer那个参数很重要。
def get(self, url, searchDepartureAirport=None, searchArrivalAirport=None, searchDepartureTime=None, searchArrivalTime=None):
'''''
the get method: interface for get the page including information we gave to them
'''
resultHtml=httplib.HTTPConnection(url, 80, False)
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',
headers = {"Host":"flight.qunar.com\r\n",
"User-Agent": "Mozilla/5.0 (Windows NT 6.1; rv:14.0) Gecko/20100101 Firefox/14.0.1\r\n"})
page=resultHtml.getresponse(False)
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