(图片来自互联网)
cookielib是一个自动处理cookies的模块,如果我们在使用爬虫等技术的时候需要保存cookie,那么cookielib会让你事半功倍!他最常见的搭档模块就是python下的urllib和request。
但是老高在使用cookielib的时候总是碰到这样那样的问题,在查看cookielib的源码后,有所感悟。
核心类
Cookie
该类实现了Netscape and RFC 2965 cookies定义的cookie标准,基本可以理解为某一条cookie数据。
部分代码如下,很多属性是不是很眼熟?
self.domain_initial_dot = domain_initial_dot
self.path = path
self.path_specified = path_specified
self.secure = secure
self.expires = expires
self.discard = discard
self.comment = comment
self.comment_url = comment_url
self.rfc2109 = rfc2109
CookiePolicy
该类的主要功能是收发cookie,即确保正确的cookie发往对应的域名,反之一样。
DefaultCookiePolicy
该类实现了CookiePolicy的接口。
CookieJar
CookieJar是cookie的集合,可以包含有很多Cookie类,是我们的主要操作对象。里面有一系列的方法可以支持更加细致的操作!
FileCookieJar
该类继承自CookieJar,CookieJar只是在内存中完成自己的生命周期,FileCookieJar的子类能够实现数据持久化,定义了save、load、revert三个接口。
MozillaCookieJar & LWPCookieJar
两个实现类,继承关系如下:
使用
简单例子
一段简单的使用代码
#!/usr/bin/env python
# encoding: utf-8
import requests
import cookielib
url = 'http://www.baidu.com/'
jar = cookielib.LWPCookieJar('cookie.txt')
# 试着载入cookie
# 提一个问题,为什么要加入ignore_discard属性?
try:
jar.load(ignore_discard=True)
except:
pass
# 建立一个session
s = requests.Session()
# 设定 headers与cookies
s.headers = {'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.93 Safari/537.36'}
s.cookies = jar
# 访问url
r = s.get(url)
# 持久化cookie
jar.save(ignore_discard=True)
# 打印cookie
for item in jar:
print "cookie name : %s ---- value: %s" % (item.name, item.value)
我们得到如下cookie
cat cookie.txt
#LWP-Cookies-2.0
Set-Cookie3: BAIDUID="2F5340B39928231AA09353CDAE3DA14D:FG=1"; path="/"; domain=".baidu.com"; path_spec; domain_dot; expires="2083-07-09 16:27:51Z"; version=0
Set-Cookie3: BIDUPSID=2F5340B39928231AA09353CDAE3DA14D; path="/"; domain=".baidu.com"; path_spec; domain_dot; expires="2083-07-09 16:27:51Z"; version=0
Set-Cookie3: H_PS_PSSID=14872_1457_14412_14509_14444_12826_10812_14430_12868_14871_12723_14962_14919_14902_15384_12095_13937_15963; path="/"; domain=".baidu.com"; path_spec; domain_dot; discard; version=0
Set-Cookie3: PSTM=1434892424; path="/"; domain=".baidu.com"; path_spec; domain_dot; expires="2083-07-09 16:27:51Z"; version=0
Set-Cookie3: BDSVRTM=0; path="/"; domain="www.baidu.com"; path_spec; discard; version=0
Set-Cookie3: BD_HOME=0; path="/"; domain="www.baidu.com"; path_spec; discard; version=0
生成一个Cookie类
我们由Cookie的定义可以简单的生成一条cookie
import cookielib
class Cookie:
def __init__(self, version, name, value,
port, port_specified,
domain, domain_specified, domain_initial_dot,
path, path_specified,
secure,
expires,
discard,
comment,
comment_url,
rest,
rfc2109=False,
):
.....
# 初始化一个cookie
def createCookie(name, value, domain, expires=None):
return cookielib.Cookie(
version=None,
name=name,
value=value,
port='80',
port_specified=True,
domain=domain,
domain_specified=True,
domain_initial_dot=False,
path='/',
path_specified=True,
secure=False,
expires=expires,
discard=False,
comment=None,
comment_url=None,
rest=None,
rfc2109=False
)
new_cookie = createCookie('phpgao', 'laogao', 'www.phpgao.com', '1434977736')
# 加入到现有cookies
mycookie = cookielib.CookieJar()
mycookie.set_cookie(new_cookie)
扩展阅读
官方文档