【发布时间】:2020-06-08 12:38:41
【问题描述】:
https://www.sahibinden.com/en
如果您在隐身窗口中打开它并在 Fiddler 中检查标题,那么您将获得以下两个主要标题:
我想在 Python 中获取这些标头。有什么方法可以使用 Selenium 获得这些?我在这里有点不知所措。
【问题讨论】:
https://www.sahibinden.com/en
如果您在隐身窗口中打开它并在 Fiddler 中检查标题,那么您将获得以下两个主要标题:
我想在 Python 中获取这些标头。有什么方法可以使用 Selenium 获得这些?我在这里有点不知所措。
【问题讨论】:
您可以使用硒线。它是专门为此目的而开发的 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
【讨论】:
你可以这样运行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 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
【讨论】:
无法使用 Selenium 获取标头。 Further information
但是,您可以使用其他库(例如 requests、BeautifulSoup)来获取标头。
【讨论】:
也许您可以为此使用 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()
【讨论】: