【问题标题】:How do I load session and cookies from Selenium browser to requests library in Python?如何从 Selenium 浏览器加载会话和 cookie 到 Python 中的请求库?
【发布时间】:2015-04-10 13:56:12
【问题描述】:

如何从 Selenium 浏览器加载会话和 cookie?以下代码:

import requests

cookies = [{u'domain': u'academics.vit.ac.in',
            u'name': u'ASPSESSIONIDAEQDTQRB',
            u'value': u'ADGIJGJDDGLFIIOCEZJHJCGC',
            u'expiry': None, u'path': u'/',
            u'secure': True}]
response = requests.get(url2, cookies=cookies)

给了我以下异常:

Traceback (most recent call last):
  File "F:\PYTHON\python_scripts\cookies\cookies3.py", line 23, in <module>
    response = requests.get(url2, cookies=cookies)
  File "C:\Python27\lib\site-packages\requests\api.py", line 68, in get
    return request('get', url, **kwargs)<br/>
  File "C:\Python27\lib\site-packages\requests\sessions.py", line 450, in request
    prep = self.prepare_request(req)
    cookies = cookiejar_from_dict(cookies)
  File "C:\Python27\lib\site-packages\requests\cookies.py", line 439, in cookiejar_from_dict
    cookiejar.set_cookie(create_cookie(name, cookie_dict[name]))
TypeError: list indices must be integers, not dict

【问题讨论】:

  • 是的,有可能,但你为什么要这么做?
  • @That1Guy 正在使用 selenium 来克服基于验证码的登录。然后,我需要解析 1000 多个 url 以获取 xml 信息。但如果我使用 selenium,我将不得不使用浏览器加载页面,但我只需要在后台执行此操作
  • @That1Guy 问题已更新

标签: python selenium-webdriver python-requests


【解决方案1】:

首先,您必须从驱动程序实例中获取 cookie:

cookies = driver.get_cookies()

这将为您的会话返回 cookie dictionaries

接下来,将这些 cookie 设置在 requests:

s = requests.Session()
for cookie in cookies:
    s.cookies.set(cookie['name'], cookie['value'])

【讨论】:

  • getting error in this line s.cookies.set(**cookie) TypeError: create_cookie() got unexpected keyword arguments: [u'expiry'] 打印出来的 cookie 是这样的 [{u' domain': u'acemics.it.ac.in', u'secure': True, u'value': u'PBHHJGJDHMSEEHGCDJLICARE', u'expiry': None, u'path': u'/', u'名称': u'ASPSESSIONIDAEQDTQRB'}]
  • 错误 a = requests.get(url2, cookies=cookies) TypeError: list indices must be integers, not dict
  • That1Guy,很可能是因为你不关心额外的参数,比如 http、路径等。不过,这只是一个有根据的猜测,你知道的。
  • 我会支持你,你为我节省了一天的工作 - 谢谢。
  • @MichaelCGood 我首先从 selenium 驱动程序中导出了 cookie。然后在发出下一个请求之前启动它以请求会话对象。
【解决方案2】:

您可以使用 3rd 方包,例如 selenium-requests 或 requestium。它们提供了在请求和 selenium 之间共享 cookie 的功能。

【讨论】:

    【解决方案3】:

    我做了这个解决方案,它解决了意外的关键字参数到期

    def set_cookies(cookies, s):
        for cookie in cookies:
            if 'httpOnly' in cookie:
                httpO = cookie.pop('httpOnly')
                cookie['rest'] = {'httpOnly': httpO}
            if 'expiry' in cookie:
                cookie['expires'] = cookie.pop('expiry')
            s.cookies.set(**cookie)
        return s
    

    【讨论】:

      【解决方案4】:

      我认为这并不能直接回答问题,但如果您的目标是让请求伪装成与 selenium 相同的会话,您可以这样做:

      resp = browser.execute_script(f'''
          var xmlHttp = new XMLHttpRequest();
          xmlHttp.open( "GET", "{yourUrl}", false );
          xmlHttp.send( null );
          return xmlHttp.responseText;
      '''
      )
      

      【讨论】:

        猜你喜欢
        • 2021-08-02
        • 1970-01-01
        • 2019-10-31
        • 2019-07-29
        • 1970-01-01
        • 2016-06-03
        • 1970-01-01
        • 2020-01-20
        • 1970-01-01
        相关资源
        最近更新 更多