繁体   English   中英

如何在 Selenium 中获取请求标头

[英]How to get request headers in Selenium

https://www.sahibinden.com/en

如果您以隐身方式打开它 window 并检查 Fiddler 中的标头,那么您将获得以下两个主要标头: 在此处输入图像描述

当我单击最后一个并检查请求标头时,这就是我得到的在此处输入图像描述

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

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

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

pip 安装后的示例:

##  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

你可以像这样运行 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()

底线是,,您不能使用Selenium检索请求标头。


细节

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

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

我们不会将此功能添加到 WebDriver API,因为它不属于我们当前的 scope(模拟用户操作)。

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

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

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

使用 Selenium 无法获取标头。 更多信息

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

也许您可以为此使用 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()
js_headers = '''
    const _xhr = new XMLHttpRequest();
    _xhr.open("HEAD", document.location, false);
    _xhr.send(null);

    const _headers = {};

    _xhr.getAllResponseHeaders().trim().split(/[\\r\\n]+/).map((value) => value.split(/: /)).forEach((keyValue) => {
        _headers[keyValue[0].trim()] = keyValue[1].trim();
    });

    return _headers;
'''

page_headers = driver.execute_script(js_headers)

type(page_headers) # -> dict

您可以使用https://pypi.org/project/selenium-wire/插件替代 webdriver 添加请求/响应操作,即使对于 https 使用其自己的本地 ZF9D5C16A7F423203F8C1953A 证书。

from seleniumwire import webdriver
d = webdriver.Chrome() # make sure chrome/chromedriver is in path
d.get('https://en.wikipedia.org')
vars(d.requests[-1].headers)

将列出最后一个请求 object 列表中的标头:

{'policy': Compat32(), '_headers': [('content-length', '1361'), 
('content-type', 'application/json'), ('sec-fetch-site', 'none'), 
('sec-fetch-mode', 'no-cors'), ('sec-fetch-dest', 'empty'), 
('user-agent', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.5112.102 Safari/537.36'), 
('accept-encoding', 'gzip, deflate, br')],
'_unixfrom': None, '_payload': None, '_charset': None,
'preamble': None, 'epilogue': None, 'defects': [], '_default_type': 'text/plain'}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM