本文介绍如何使用 Python 将前次会话的 Cookies 保存下来供下次使用。
Python 第三方库中有名的 requests
库,自带了 Session 对象,用于处理会话。保存前次请求中的信息(包括 Cookies)。
了解Session模块
requests
库提供名叫 Session
的类用于管理会话,将其实例化后可以直接发起请求。基本的用法是:
import requests
requests.Session().get(some_url)
Session
类有一个属性名叫 cookies
,其变量类型是 python 自带的 CookieJar
类型
Python 自带的 cookies 管理
python 2.7 有一个 cookielib 库,其中包含一个名叫CookieJar 的类。文档中是这么介绍的:
从上面的介绍中看出,CookieJar
用于解析cookies,还能派生出其他子类,用于将 Cookies 保存在文件或者数据库中。
然而到了 Python 3 的时代,CookieJar 类被重新分配到了 http.cookiejar 的模块。
所以当使用 Python 3的时候,我们可以自行实例化 http.cookiejar.CookieJar
及其子类,然后直接替换 session.cookies
,就可以实现灵活的保存 Cookies
CookieJar 的子类
CookieJar
的子类派生关系如下图所示:
CookieJar
直接派生出了 FileCookieJar
子类,但是 FileCookieJar
仅仅用作基类,不能直接实例化。提供的 save()
接口被调用时,将抛出 NotImplementedError
,
FileCookieJar
派生出两个子类:MozillaCookieJar
和 LWPCookieJar
,我们可以使用后者保存 Cookies 到文件。
获取 Cookies
一般可以用下面的写法来发起请求,获取 Cookies:
import requests
s = requests.Session()
s.get(some_url)
当请求成功后, s.cookies
(默认是CookieJar
类型)中就自动保存了此次请求回来的 Cookies.
保存到文件
我们下面以 Python3 为例,给一个简单的示例:
import requests
import http.cookiejar
s = requests.Session()
s.cookies = http.cookiejar.LWPCookieJar('cookies.txt')
s.get('https://www.baidu.com')
s.cookies.save()
执行后,在 cookies.txt 文件里就得到了下面的内容:
#LWP-Cookies-2.0\
Set-Cookie3: BDORZ=27315; path="/"; domain=".baidu.com"; path_spec; domain_dot; expires="2023-12-22 12:13:05Z"; version=0
注意这里必须明确的调用 LWPCookieJar.save()
方法,不然不会自动输出到文件。
从文件中读取
读取 cookies的工作仍然是由 LWPCookieJar
子类完成。下面以 Python3 为例,给一个简单的示例:
import requests
import http.cookiejar
s = requests.Session()
s.cookies = http.cookiejar.LWPCookieJar('cookies.txt')
s.cookies.load()
s.get('https://www.baidu.com') # 发起请求时将携带 cookies.txt 中的内容
自定义 cookies 文件格式
上面的保存、读取过程中,cookies 的内容位于黑盒内,调用者并不干涉其内容。
如果想读取 cookies 的个别字段或者按照自己希望的格式保存到文件,就需要 requests
库提供的工具 dict_from_cookiejar()
将 CookieJar 转换为 dict 格式。
下面仍然以上面为例子:
import requests
import http.cookiejar
s = requests.Session()
s.get('https://www.baidu.com')
cj = requests.utils.dict_from_cookiejar(s.cookies)
print(cj)
得到
{'BDORZ': '27315'}
如果您对本文有疑问或者寻求合作,欢迎 联系邮箱 。邮箱已到剪贴板
精彩评论
本站 是个人网站,采用 署名协议 CC-BY-NC 授权。
欢迎转载,请保留原文链接 https://www.lfhacks.com/tech/python-save-cookies-to-file/ ,且不得用于商业用途。