Python 保存 Cookies 到文件并再次读取

2023-12-21
标签: PYTHON

本文介绍如何使用 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 的类。文档中是这么介绍的:

The CookieJar class stores HTTP cookies. It extracts cookies from HTTP requests, and returns them in HTTP responses. CookieJar instances automatically expire contained cookies when necessary. Subclasses are also responsible for storing and retrieving cookies from a file or database.

从上面的介绍中看出,CookieJar 用于解析cookies,还能派生出其他子类,用于将 Cookies 保存在文件或者数据库中。

然而到了 Python 3 的时代,CookieJar 类被重新分配到了 http.cookiejar 的模块。

所以当使用 Python 3的时候,我们可以自行实例化 http.cookiejar.CookieJar 及其子类,然后直接替换 session.cookies ,就可以实现灵活的保存 Cookies

CookieJar 的子类

CookieJar 的子类派生关系如下图所示:

CookieJar 直接派生出了 FileCookieJar 子类,但是 FileCookieJar 仅仅用作基类,不能直接实例化。提供的 save() 接口被调用时,将抛出 NotImplementedError

FileCookieJar 派生出两个子类:MozillaCookieJarLWPCookieJar,我们可以使用后者保存 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’}

如果您对本站内容有疑问或者寻求合作,欢迎 联系邮箱邮箱已到剪贴板

标签: PYTHON

欢迎转载本文,惟请保留 原文出处 ,且不得用于商业用途。
本站 是个人网站,若无特别说明,所刊文章均为原创,并采用 署名协议 CC-BY-NC 授权。