首页 > 解决方案 > 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:我将使用不同的网站来抓取数据,我的本地网站仅用于测试目的。

标签: python-3.xcookiespython-requests

解决方案


由于您使用requests.Session的是分配给管理请求的实例,因此返回s的各个实例将不包含 cookie,但实例将包含。这是一个演示:Responses.getrequests.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.cookiess.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'}}

推荐阅读