【问题标题】:Python requests.Session() not updating all cookies?Python requests.Session() 没有更新所有 cookie?
【发布时间】:2020-11-09 23:31:49
【问题描述】:

我正在尝试从网站上抓取数据,但在我使用 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")

picture 有 2 个 GET 请求,我不明白为什么 cookie 像:pmaCookieVer、pma_lang.. 等会“丢失”。

PS:我将使用不同的网站来抓取数据,我的本地网站仅用于测试目的。

【问题讨论】:

    标签: python-3.x cookies python-requests


    【解决方案1】:

    由于您使用分配给srequests.Session 实例来管理您的请求,因此s.get 返回的各个Response 实例将不包含cookie,但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 中累积的,而不是在返回的请求对象上(例如,使用 s.cookies 作为保存参数,而不是 r.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'}}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-12
      相关资源
      最近更新 更多