python-3.x - Python requests.Session() 没有更新所有 cookie?
问题描述
我正在尝试从网站上抓取数据,并且在使用 requests.session 时似乎在从网站获取/设置 cookie 时遇到问题
见下面的代码
import pickle
import re
import requests
def save_cookies(requests_cookiejar, filename):
with open(filename, 'wb') as f:
pickle.dump(requests_cookiejar, f)
def load_cookies(filename):
with open(filename, 'rb') as f:
return pickle.load(f)
s = requests.Session()
r = s.get("http://192.168.1.16/phpmyadmin/", cookies=load_cookies("Cookie.txt"))
r = s.get("http://192.168.1.16/phpmyadmin/")
save_cookies(r.cookies, "Cookie.txt")
查看 带有 2 个 GET 请求的图片,我不明白为什么 cookie 像:pmaCookieVer、pma_lang .. 等正在“丢失”。
PS:我将使用不同的网站来抓取数据,我的本地网站仅用于测试目的。
解决方案
由于您使用requests.Session
的是分配给管理请求的实例,因此返回s
的各个实例将不包含 cookie,但实例将包含。这是一个演示:Response
s.get
requests.Session
>>> import requests
>>> s = requests.Session()
>>> r1 = s.get('http://httpbin.org/cookies/set/sessioncookie/123456789')
>>> len(r1.cookies)
0
>>> len(s.cookies)
1
>>> print(s.cookies['sessioncookie'])
123456789
>>> r2 = s.get('http://httpbin.org/cookies/set/anothercookie/123456789')
>>> len(r2.cookies)
0
>>> len(s.cookies)
2
您可以看到 cookie 实际上是在会话的 cookie jar 中累积的,而不是在返回的请求对象上(例如,代替r.cookies
,s.cookies
用作保存的参数)。总结一下,使用不同的会话对象模拟 cookie 的保存和加载:
>>> save_cookies(s.cookies, 'cookies.txt')
>>> new_session = requests.Session()
>>> new_session.cookies = load_cookies('cookies.txt')
>>> r3 = new_session.get("http://httpbin.org/cookies")
>>> r3.json()
{'cookies': {'anothercookie': '123456789', 'sessioncookie': '123456789'}}
推荐阅读
- python - Keras fit_generator 问题
- python - 想从普通的 py 脚本中知道当前正在执行的 pytest 的测试/类名
- reactjs - 如何在 React Native 中使用一个信号获取玩家 ID?
- mysql - 如何在保持顺序下降的同时防止 MySQL 数据库中的重复列行
- java - 想要通过单击 menuitems 来更新片段中的现有 listView
- solr - SOLR 查询返回值,但 stats.countDistinct 仍然缺失
- julia - 如何将变量传递给宏并在宏执行之前对其进行评估?
- javascript - JS - 比较 2 个对象数组
- javascript - 设置了“overrideMimeType”时,“XMLHttpRequest”响应文本编码是什么?
- python - Python:[...] 在列表末尾