Python中cookielib库(python3中为http.cookiejar)为存储和管理cookie提供客户端支持。
该模块主要功能是提供可存储cookie的对象。使用此模块捕获cookie并在后续连接请求时重新发送,还可以用来处理包含cookie数据的文件。
这个模块主要提供了这几个对象,CookieJar,FileCookieJar,MozillaCookieJar,LWPCookieJar。
1. CookieJar
CookieJar对象存储在内存中。
1
2
3
4
5
6
|
>>> import urllib2
>>> import cookielib
>>> cookie = cookielib.CookieJar()
>>> handler = urllib2.HTTPCookieProcessor(cookie)
>>> opener = urllib2.build_opener(handler)
>>> opener. open ( 'http://www.google.com.hk' )
|
访问google的cookie已经被捕捉了,来看下是怎样的:
|
>>> print cookie
<cookielib.CookieJar[<Cookie NID = 67 = B6YQoEIEjcqDj - adada_WmNYl_JvADsDEDchFTMtAgERTgRjK452ko6gr9G0Q5p9h1vlmHpCR56XCrWwg1pv6iqhZnaVlnwoeM - Ln7kIUWi92l - X2fvUqgwDnN3qowDW for .google.com.hk / >, <Cookie PREF = ID = 7ae0fa51234ce2b1 :FF = 0 :NW = 1 :TM = 1391219446 :LM = 1391219446 :S = cFiZ5X8ts9NY3cmk for .google.com.hk / >]>
|
看来是Cookie实例的集合,Cookie实例有name,value,path,expires等属性:
|
>>> for ck in cookie:
... print ck.name, ':' ,ck.value
...
NID : 67 = B6YQoEIEjcqDj - adada_WmNYl_JvADsDEDchFTMtAgERTgRjK452ko6gr9G0Q5p9h1vlmHpCR56XCrWwg1pv6iqhZnaVlnwoeM - Ln7kIUWi92l - X2fvUqgwDnN3qowDW
PREF : ID = 7ae0fa51234ce2b1 :FF = 0 :NW = 1 :TM = 1391219446 :LM = 1391219446 :S = cFiZ5X8ts9NY3cmk
一般,我们HTTP抓包得到的Cookie位于Request Header中,格式如下:
要使用该字符串发起HTTP请求,有几种方法:
它们各有不足:
使用httplib直接添加cookie到header如果不需要程序自己管理cookie,这个方法是极简单的。下面简单示例处理GET请求:
import httplib def request(url, cookie=''): if __name__ == '__main__': html_doc = request(url).read() request函数就是全部的内容,测试IP 192.168.1.253是我房间的无线路由器。第一次HTTP请求带Cookie,第二次不带Cookie,返回的标题不一样:
前篇介绍了直接使用httplib发送Cookie,简洁直观。创建cookielib.CookieJar对象自动管理Cookie稍繁琐一些,但是一旦创建,可供urllib2创建opener,后续的所有cookie更新和过期删除都是自动处理的。 1. 解析Cookie Str,得到Cookie.SimpleCookie对象我们得到的Request Header中,Cookie是这样的格式:
第一步是解析它,得到Cookie.SimpleCookie对象。通过字符串构造即可: Cookie.SimpleCookie(cookie_str) 得到的是一个dict-like对象,它的每一个值都是一个Set-Cookie语句,上述例子解析后是: 2. 用SimpleCookie创建cooklib.Cookie对象上述SimpleCookie不能直接使用,因为一个完整的Cookie,还必须包括额外的字段,如:domain、path、expires等。第二步工作是创建cooklib.Cookie对象,直接将key, value传入cooklib.Cookie类的构造函数即可。 得到一系列cookielib.Cookie对象,便可以依次用它们来更新CookieJar了。 3. 完整的示例代码import cookielib def build_opener_with_cookie_str(cookie_str, domain, path='/'): for c in simple_cookie: # Return opener
html_doc = urllib2.urlopen('http://192.168.1.253').read()
|