【问题标题】:How to get Request Headers automatically using Scrapy?如何使用 Scrapy 自动获取请求标头?
【发布时间】:2021-05-21 18:55:52
【问题描述】:

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

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

我尝试使用: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']}

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

【问题讨论】:

    标签: web-scraping scrapy


    【解决方案1】:

    Scrapy 使用这些标题来抓取网页。有时,如果网站需要在标头中添加一些特殊键(如 API),您会注意到 scrapy 无法抓取网页。

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

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

    您可以使用上面的代码来获取请求标头。这必须放在 Scrapy 的 DownlaodMiddleware 中,这样两者才能协同工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-16
      • 1970-01-01
      • 1970-01-01
      • 2016-03-21
      • 1970-01-01
      • 2018-02-27
      • 2014-04-22
      • 2017-08-09
      相关资源
      最近更新 更多