如何将urllib python3 cookie保存到文件中



试图在代码执行之间存储/重用cookie,类似于这个问题,,但仅使用python3的urllib

由于这个答案,创建了一个在urllib.request.Request调用中自动使用的cookiejar的过程:

cookie_jar = http.cookiejar.CookieJar()
opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cookie_jar))
urllib.request.install_opener(opener)

对cookie存储的初始搜索导致了关于requests(模块(+cookie的SO问题,但不幸的是,http.cookiejar对象不能被腌制(如下(,而它们的requests兄弟可以

>>> pickle.dumps(cookie_jar)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: can't pickle _thread.RLock objects

其他查询的结果大多指向python3文档:https://docs.python.org/3/library/http.cookiejar.html#http.cookiejar.FileCookieJar

FileCookieJar类导致在描述中注意到:A CookieJar which can load cookies from, and *perhaps* save cookies to, a file on disk.和相关错误:

>>> FCJ=cookiejar.FileCookieJar("unversioned.cookies")              
>>> FCJ.save()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python3.7/http/cookiejar.py", line 1785, in save
raise NotImplementedError()

这两个答案都得到了澄清——建议使用LWPCookieJar(以及其他(,但我找不到任何关于如何在实践中使用此类的现有示例。

LWPCookieJar是答案:

  1. 创建cookie Jar+尝试从任何现有的cookie文件加载:
cookie_filename = "unversioned.cookies"
cookie_jar = cookiejar.LWPCookieJar(cookie_filename)
try:
cookie_jar.load()
except FileNotFoundError as fnfe:
# No existing/adjacent cookie file
pass
opener = request.build_opener(request.HTTPCookieProcessor(cookie_jar))
request.install_opener(opener)
  1. 完成填充cookie的任何urllib.request.Request调用
  2. 将cookie存储到文件(在构造函数中命名(:
cookie_jar.save()

确认,在之前的执行运行中保存了一些cookie后:

  1. 准备cookiejar,但不要调用.load()
  2. 测试请求页面->收到注销版本
  3. 呼叫cookiejar.load()
  4. 测试请求页面->已登录收到的版本

最新更新