方法一:urllib2
结合cookielib及urllib2,Python2时期比较常用的方法,年代比较久远了。个人觉得太麻烦,改用requests.
▲需要注意的是cookielib在python3中已经改成了http.cookiejar
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 #该方法本人未测试 import urllib2 import cookielib #将cookie保存在文件中 def saveCookie(): #设置保存cookie的文件 filename = 'cookie.txt' #声明一个MozillaCookieJar对象来保存cookie,之后写入文件 cookie = cookielib.MozillaCookieJar(filename) #创建cookie处理器 handler = urllib2.HTTPCookieProcessor(cookie) #构建opener opener = urllib2.build_opener(handler) #创建请求 res = opener.open('http://www.baidu.com') #保存cookie到文件 #ignore_discard的意思是即使cookies将被丢弃也将它保存下来 #ignore_expires的意思是如果在该文件中cookies已经存在,则覆盖原文件写入 cookie.save(ignore_discard=True,ignore_expires=True) #从文件中获取cookie并且访问(我们通过这个方法就可以打开保存在本地的cookie来模拟登录) def getCookie(): #创建一个MozillaCookieJar对象 cookie = cookielib.MozillaCookieJar() #从文件中的读取cookie内容到变量 cookie.load('cookie.txt',ignore_discard=True,ignore_expires=True) #打印cookie内容,证明获取cookie成功 for item in cookie: print 'name:' + item.name + '-value:' + item.value #利用获取到的cookie创建一个opener handler = urllib2.HTTPCookieProcessor(cookie) opener = urllib2.build_opener(handler) res = opener.open('http://www.baidu.com') print res.read()
方法二:
使用requests.cookie
读取cookies
在这里我用的是LWPCookieJar保存在txt文件中,还有个是MozillaCookieJar,都是由FileCookieJar 派生而来,实现了save()方法,而FileCookieJar 没有实现save()
MozillaCookieJar (filename,delayload=None,policy=None):从FileCookieJar派生而来,创建与Mozilla浏览器 cookies.txt兼容的FileCookieJar实例。
LWPCookieJar (filename,delayload=None,policy=None):从FileCookieJar派生而来,创建与libwww-perl标准的 Set-Cookie3 文件格式兼容的FileCookieJar实例。
1 2 3 4 5 6 7 8 9 #实例化一个LWPCookieJar对象 load_cookiejar = cookielib.LWPCookieJar() #从文件中加载cookies(LWP格式) load_cookiejar.load('cookies.txt', ignore_discard=True, ignore_expires=True) #工具方法转换成字典 load_cookies = requests.utils.dict_from_cookiejar(load_cookiejar) #工具方法将字典转换成RequestsCookieJar,赋值给session的cookies. self.session.cookies = requests.utils.cookiejar_from_dict(load_cookies)
存储cookies
将cookies转换成LWP格式然后保存为文本格式
1 2 3 4 5 6 7 8 9 #实例化一个LWPcookiejar对象 new_cookie_jar = cookielib.LWPCookieJar('cookie.txt') #将转换成字典格式的RequestsCookieJar(这里我用字典推导手动转的)保存到LWPcookiejar中 ===>RequestsCookieJar没有实现save()方法 requests.utils.cookiejar_from_dict({c.name: c.value for c in self.session.cookies}, new_cookie_jar) #保存到本地文件 new_cookie_jar.save('cookies.txt', ignore_discard=True, ignore_expires=True)
方法三:
将cookie字典弄成字典形式然后pickle或者json写入文件中
存储cookie
1 2 3 4 5 6 7 8 import requests,json,pprint s = requests.session() s.headers = {...} a = s.get("https://www.baidu.com") cookies = requests.utils.dict_from_cookiejar(s.cookies) with open(".\\cook.txt", "w") as fp: json.dump(cookies, fp) pprint.pprint(cookies,width=5)
读取cookie
1 2 3 with open(".\cook.txt", "w") as fp: load_cookies=son.load(fp) session.cookie = requests.utils.cookiejar_from_dict(load_cookies)
方法四:
将requests.cookie设置为LWPCookieJar、或MozillaCookieJar保存
1 2 3 4 5 6 session = requests.Session() #创建个 LWPCookieJar对象 session.cookies = LWPCookieJar(filename='cook.txt') s.get('https://www.baidu.com/',headers=headers) session.cookies.save(ignore_discard=True, ignore_expires=True) #如果save()时没有写filename参数,则默认为实例化LWPCookieJar时给的文件名
save()方法的两个重要参数
ignore_discard: save even cookies set to be discarded.
ignore_expires: save even cookies that have expired.The file is overwritten if it already exists
ignore_discard的意思是即使cookies将被丢弃也将它保存下来,ignore_expires的意思是如果cookies已经过期也将它保存并且文件已存在时将覆盖
总结方法二和方法三可以看出,就是要将cookie转换成然后save()
简单介绍下cookielib模块 作用,科普下实现cookie知识
python3中将cookielib模块改为了http.cookiejar
1 2 3 4 5 6 7 8 9 10 > cookielib模块的主要作用是提供可存储cookie的对象,以便于与urllib2模块配合使用来访问Internet资源。例如可以利用本模块 的CookieJar类的对象来捕获cookie并在后续连接请求时重新发送。coiokielib模块用到的对象主要有下面几个:CookieJar、 FileCookieJar、MozillaCookieJar、LWPCookieJar。其中他们的关系如下: > > CookieJar > > | > > FileCookieJar > > / \ >
MozillaCookieJar LWPCookieJar