【问题标题】:How to get request headers in Selenium如何在 Selenium 中获取请求标头
【发布时间】:2020-06-08 12:38:41
【问题描述】:
https://www.sahibinden.com/en

如果您在隐身窗口中打开它并在 Fiddler 中检查标题,那么您将获得以下两个主要标题:

当我单击最后一个并检查请求标头时,这就是我得到的

我想在 Python 中获取这些标头。有什么方法可以使用 Selenium 获得这些?我在这里有点不知所措。

【问题讨论】:

    标签: python selenium fiddler


    【解决方案1】:

    您可以使用硒线。它是专门为此目的而开发的 Selenium 扩展。

    https://pypi.org/project/selenium-wire/

    pip install 后的例子:

    ##  Import webdriver from Selenium Wire instead of Selenium
    from seleniumwire import webdriver
    
    ##  Get the URL
    driver = webdriver.Chrome("my/path/to/driver", options=options)
    driver.get("https://my.test.url.com")
    
    ##  Print request headers
    for request in driver.requests:
      print(request.url) # <--------------- Request url
      print(request.headers) # <----------- Request headers
      print(request.response.headers) # <-- Response headers
    

    【讨论】:

    • 有没有机会知道 ruby​​ 是否存在类似的东西? :)
    • 不幸的是,我只在 Python 中使用过 selenium:/
    • 上述软件包所做的是在 selenium 上设置 mitm 代理,您可以使用 mitmproxy 手动执行此操作,您可能还需要安装 selenium 浏览器的证书才能使其正常运行跨度>
    【解决方案2】:

    你可以这样运行JS命令;

    var req = new XMLHttpRequest()
    req.open('GET', document.location, false)
    req.send(null)
    return req.getAllResponseHeaders()
    

    在 Python 上;

    driver.get("https://t.me/codeksiyon")
    headers = driver.execute_script("var req = new XMLHttpRequest();req.open('GET', document.location, false);req.send(null);return req.getAllResponseHeaders()")
    
    # type(headers) == str
    
    headers = headers.splitlines()
    

    【讨论】:

    • 这些是响应标头。 OP 想要 REQUEST 标头
    【解决方案3】:

    底线是,,您无法使用Selenium 检索请求标头。


    详情

    长期以来,Selenium 用户一直要求添加 WebDriver 方法以从 HTTP 响应中读取 HTTP 状态代码和标头。我们已经在WebDriver lacks HTTP response header and status code methods 讨论中详细讨论了通过 Selenium 实现此功能。

    然而,Jason Leyba(Selenium 贡献者)在他的comment 中直截了当地提到:

    我们不会将此功能添加到 WebDriver API,因为它超出了我们当前的范围(模拟用户操作)。

    Ashley Leyba 进一步补充说,试图使 WebDriver 成为理想的 Web 测试工具将影响整体质量,因为 driver.get(url) 会阻塞,直到浏览器加载页面并返回最终加载页面的响应。因此,在登录重定向的情况下,状态代码和标头将始终以 200 而不是您要查找的 302 结尾。

    最后,Simon M Stewart(WebDriver 创建者)在他的comment 中得出结论:

    此功能不会发生。推荐的方法是扩展HtmlUnitDriver 以访问您需要的信息或使用公开此信息的外部代理,例如BrowserMob Proxy

    【讨论】:

      【解决方案4】:

      无法使用 Selenium 获取标头。 Further information

      但是,您可以使用其他库(例如 requestsBeautifulSoup)来获取标头。

      【讨论】:

      • 这些标题仅在首次访问网站时显示在 icognito 窗口中。然后cookies被存储,这个页面不会被访问。 BS 是否能够在每次运行时捕获这些标头?
      • 可以分享资源吗?
      • 您可以使用请求来获取 HTML 内容和标头。默认情况下不缓存。 (stackoverflow.com/questions/20198274/…) 然后,如有必要,您可以使用 BeautifulSoup 解析此 HTML。
      • 我需要请求标头而不是响应标头
      • 我可以拦截对 url 的请求吗?
      【解决方案5】:

      也许您可以为此使用 BrowserMob 代理。这是一个例子:

      import settings
      
      from browsermobproxy import Server
      from selenium.webdriver import DesiredCapabilities
      
      config = settings.Config
      
      server = Server(config.BROWSERMOB_PATH)
      server.start()
      proxy = server.create_proxy()
      
      from selenium import webdriver
      chrome_options = webdriver.ChromeOptions()
      chrome_options.add_argument('--proxy-server=%s' % proxy.proxy)
      chrome_options.add_argument('--headless')
      
      capabilities = DesiredCapabilities.CHROME.copy()
      capabilities['acceptSslCerts'] = True
      capabilities['acceptInsecureCerts'] = True
      
      driver = webdriver.Chrome(options=chrome_options,
          desired_capabilities=capabilities,
         executable_path=config.CHROME_PATH)
      
      proxy.new_har("sahibinden", options={'captureHeaders': True})
      driver.get("https://www.sahibinden.com/en")
      
      entries = proxy.har['log']["entries"]
      for entry in entries:
          if 'request' in entry.keys():
              print(entry['request']['url'])
              print(entry['request']['headers'])
              print('\n')
      
      proxy.close()
      driver.quit()
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-02-27
        • 2020-06-14
        • 2020-10-15
        • 2013-03-16
        • 2013-10-25
        • 2015-02-19
        • 2011-06-26
        • 1970-01-01
        相关资源
        最近更新 更多