【问题标题】:requests.Session() load cookies from CookieJarrequests.Session() 从 CookieJar 加载 cookie
【发布时间】:2015-03-22 22:01:26
【问题描述】:

如何将 CookieJar 加载到新的 requests.Session 对象中?

cj = cookielib.MozillaCookieJar("mycookies.txt")
s = requests.Session()

这是我创建的,现在会话将存储 cookie,但我希望它从文件中获取我的 cookie
(会话应该加载 cookieJar)。 如何做到这一点?
我搜索了文档,但只能找到代码示例,它们从不加载 cookieJar,只是在一个会话期间保存 cookie。

【问题讨论】:

    标签: python httprequest python-requests cookiejar


    【解决方案1】:

    Python 3.x 代码,完全工作且实现良好的示例。代码一目了然。

    此代码正确处理“会话 cookie”,在运行之间保留它们。默认情况下,这些不会保存到磁盘,这意味着大多数网站会要求您在运行之间不断登录。但是使用下面的技术,所有会话 cookie 也会被保留!

    这是您要查找的代码。

    import os
    import pathlib
    import requests
    from http.cookiejar import MozillaCookieJar
    
    
    cookiesFile = str(pathlib.Path(__file__).parent.absolute() / "cookies.txt")  # Places "cookies.txt" next to the script file.
    cj = MozillaCookieJar(cookiesFile)
    if os.path.exists(cookiesFile):  # Only attempt to load if the cookie file exists.
        cj.load(ignore_discard=True, ignore_expires=True)  # Loads session cookies too (expirydate=0).
    
    s = requests.Session()
    s.headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36",
        "Accept-Language": "en-US,en"
    }
    s.cookies = cj  # Tell Requests session to use the cookiejar.
    
    # DO STUFF HERE WHICH REQUIRES THE PERSISTENT COOKIES...
    s.get("https://www.somewebsite.com/")
    
    cj.save(ignore_discard=True, ignore_expires=True)  # Saves session cookies too (expirydate=0).
    

    【讨论】:

      【解决方案2】:

      在 Python 3.x 中

      import requests
      import http.cookiejar
      
      s = requests.Session()
      s.cookies = http.cookiejar.MozillaCookieJar("anything.txt")
      
      

      例如,我将访问 google 站点并将 cookiejar 保存到文件“anything.txt”

      s.get("https://google.com")
      s.cookies.save()
      

      以后,我会用我的 cookiejar 再次访问谷歌。

      s.cookies.load()
      s.get("https://google.com")
      

      【讨论】:

      • LWPCookieJar 很奇怪(晦涩的 Perl 风格的 cookie)。大多数人应该改用MozillaCookieJar,这是行业标准的cookies.txt格式。
      【解决方案3】:

      可以为requests.Session(以及请求)对象提供可选的cookies=

      cookies = 无

      一个 CookieJar 包含所有当前在此设置的未完成的 cookie 会议。默认情况下它是一个 RequestsCookieJar,但可以是任何其他 cookielib.CookieJar 兼容的对象。

      见:https://2.python-requests.org/en/latest/api/#requests.Session.cookies

      这样就变成了:

      s = requests.Session(cookies=cj)
      

      更新:我混淆了 requests.getrequest.post 等...,正如 cmets 中的 mata 正确指出的那样 - cookies 是会话的一个属性对象,而不是初始化参数,所以这不起作用。 s.cookies = cj 构建会话后会

      因此,使用:

      s = requests.Session()
      s.cookies = cj
      

      【讨论】:

      • cookies 是会话对象的 属性,而不是 init 参数,所以这不起作用。 s.cookies = cj构建会话后会。
      • @mata 你说得对-谢谢-编辑
      • 这不再有效:TypeError: __init__() got an unexpected keyword argument 'cookies'
      • 我相信这里记录了重大变化:github.com/kennethreitz/requests/blob/…
      猜你喜欢
      • 2013-01-12
      • 1970-01-01
      • 2011-06-08
      • 2011-08-23
      • 2011-10-16
      • 1970-01-01
      • 1970-01-01
      • 2017-06-22
      • 2015-04-18
      相关资源
      最近更新 更多