如何使用Scrapy自动获取Request Headers?

How to get Request Headers automatically using Scrapy?

如果这个问题太愚蠢,请原谅我。 我们知道,在浏览器中,可以转到 Inspect -> Network -> XHR -> Headers 并获取 Request Headers。然后可以将这些 Headers 添加到 Scrapy 请求中。

但是,有没有办法使用 Scrapy 请求自动获取这些请求 Headers,而不是手动?

我尝试使用:response.request.headers 但此信息还不够:

{b'Accept': [b'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'], b'Accept-Language': [b'en'], b'User-Agent': [b'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.129 S afari/537.36'], b'Accept-Encoding': [b'gzip,deflate']}

我们在浏览器中看到了很多请求 Headers 的信息。如何获取这些信息?

Scrapy 使用这些 headers 来抓取网页。有时,如果网站需要 headers 中的一些特殊键(例如 API),您会注意到 scrapy 无法抓取网页。

但是有一个解决方法,在 DownloaMiddilewares 中,您可以实现 Selenium。因此,将使用 selenium 自动浏览器下载请求的网页。那么当 selenium 启动实际浏览器时,您将能够提取完整的 headers。

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

您可以使用上面的代码获取请求headers。这必须放在 Scrapy 的 DownlaodMiddleware 中,这样两者才能一起工作。