requests有关cookie的使用

时间:2023-01-19 01:40:23

requests有关cookie的使用


最近用requests把百度贴吧的脚本重写了一遍,把用urllib模拟登陆的部分全部重写了一遍,算是渗入接触了一下requests,感觉确实方便了很多。

基本使用

get_req = requests.get(url, [cookies, headers])
post_req = requests.post(url, data, [cookies, headers])

req.text #unicode格式的内容,有些gzip格式的返回数据用这个可以直接显示,很方便
req.content #我猜是原始内容?
req.cookies #获取的cookies,可以用keys()和values()看内容,但本身不是字典格式,以下可以打印出字典方式查看
print {c.name: c.value for c in req.cookies}

高级用法

这里主要用了session类,因为我需要把从登陆开始的cookies数据保存着一直都要用,只用单个的req然后cookies存来存去肯定不方便,用Session类就方便很多了。

bd_session = requests.Session()
bd_session.get(...)
bd_session.post(...)

我的代码中会把登陆之后得到的cookies保存在本地,下次先尝试用cookies登陆,失败再重新登陆,所以有一个cookies保存到本地的问题。
requests库中的cookies类型,在文档中看到是RequestsCookieJar这么一个类,详细说明如下:

class requests.cookies.RequestsCookieJar(policy=None)

Compatibility class; is a cookielib.CookieJar, but exposes a dict interface.

This is the CookieJar we create by default for requests and sessions that don’t specify one, since some clients may expect response.cookies and session.cookies to support dict operations.

Requests does not use the dict interface internally; it’s just for compatibility with external client code. All requests code should work out of the box with externally provided instances of CookieJar, e.g. LWPCookieJar and FileCookieJar.

Unlike a regular CookieJar, this class is pickleable.

对于cookies格式的转化,提供了三个工具方法:

requests.utils.dict_from_cookiejar(cj)

Returns a key/value dictionary from a CookieJar.
Parameters: cj – CookieJar object to extract cookies from.

requests.utils.cookiejar_from_dict(cookie_dict, cookiejar=None, overwrite=True)

Returns a CookieJar from a key/value dictionary.
Parameters:

cookie_dict – Dict of key/values to insert into CookieJar.
cookiejar – (optional) A cookiejar to add the cookies to.
overwrite – (optional) If False, will not replace cookies already in the jar with new ones.

requests.utils.add_dict_to_cookiejar(cj, cookie_dict)

Returns a CookieJar from a key/value dictionary.
Parameters:

cj – CookieJar to insert cookies into.
cookie_dict – Dict of key/values to insert into CookieJar.

但都是cookiejar和字典格式之间的转换,并没有几种cookies格式相互的转换,所以我是以字典为中间格式进行转换的。

读取cookies

在这里我用的是LWPCookieJar保存在txt文件中

#实例化一个LWPCookieJar对象
load_cookiejar = cookielib.LWPCookieJar()
#从文件中加载cookies(LWP格式)
load_cookiejar.load('cookies/' + self.username + '.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格式然后保存为文本格式

#实例化一个LWPcookiejar对象
new_cookie_jar = cookielib.LWPCookieJar(self.username + '.txt')

#将转换成字典格式的RequestsCookieJar(这里我用字典推导手动转的)保存到LWPcookiejar中
requests.utils.cookiejar_from_dict({c.name: c.value for c in self.session.cookies}, new_cookie_jar)

#保存到本地文件
new_cookie_jar.save('cookies/' + self.username + '.txt', ignore_discard=True, ignore_expires=True)