【问题标题】:Scrapy capitalizes request headersScrapy 将请求标头大写
【发布时间】:2020-12-09 10:42:06
【问题描述】:

我正在按照以下方式设置标题

headers = {
    'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
    'cache-control': 'no-cache',
...
}

然后像这样调用请求:

yield scrapy.Request(url='https:/myurl.com/', callback=self.parse, 
headers=headers, cookies=cookies, meta={'proxy': 'http://localhost:8888'})

它使scrapy将所有这些标头大写,看起来像这样(我正在使用Charles代理进行调试):

Accept: 
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Cache-Control: no-cache

这对我的情况来说不能正常工作。

如果我使用 curl 并将标题设置为小写

accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
cache-control: no-cache

一切都像魅力一样。

有什么方法可以在 Scrapy 中禁用这种大写行为? 感谢您的帮助!

【问题讨论】:

  • 你确定是这个问题吗? HTTP 标头应该不区分大小写。
  • 您可以通过使用带有大写标题的curl 并检查它是否给出相同的输出来回答上述问题。如果是这样,你的问题就不是你想的那样。
  • 是的,我很确定。我想我正在尝试解析的网站正在以某种特殊方式处理它。

标签: python scrapy


【解决方案1】:

这不能使用 Scrapy 开箱即用地完成。

原因:它在设计上以不区分大小写的方式管理标头(请参阅:https://github.com/scrapy/scrapy/blob/master/scrapy/http/headers.py)。猜他们这样做是为了避免重复标题的麻烦。

所以很可能你必须做一个 fork 并滚动你自己的 header 处理实现,或者至少做一些猴子补丁。

但我想知道这是否真的是您需要的。我知道有些网站确实请求标头指纹来检测机器人,但与您要为请求生成的全小写标头相比,scrapy 生成的大写标头看起来更像非机器人。

【讨论】:

    【解决方案2】:

    这是我的解决方法。在您的蜘蛛文件中,您首先创建一个从 Headers 派生的类。

    from copy import deepcopy
    from scrapy.http import Headers
    class Headers2(Headers):
    
        def __init__(self, seq=None, encoding='utf-8'):
    
            Headers.__init__(self, seq, encoding)
    
        def normkey(self, key):
            """Method to normalize dictionary key access"""
            return key.lower()
    

    然后在你的蜘蛛代码中

    req = scrapy.Request(
                    url=url,
                    headers=header,
                    callback=self.get_parcel_url
                )
    
    h = Header2(copy.deepcopy(req.headers))
    req.headers = h
    

    【讨论】:

      【解决方案3】:

      因此,我遇到了两个网站的屏蔽问题。这是我两次都有效的解决方法:

      headers={
          "":"accept-encoding: gzip, deflate, br",
          "":"accept-language: en-US,en;q=0.9,hi;q=0.8,pt;q=0.7",
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-12-22
        • 2018-11-29
        • 1970-01-01
        • 2019-11-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多