Python Scrapy将请求头大写

Python Scrapy将请求头大写,python,scrapy,Python,Scrapy,我将按照以下方式设置标题 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,

我将按照以下方式设置标题

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 proxy进行调试):

这对我的案子不起作用

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

accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
cache-control: no-cache
每件事都很有魅力

有没有办法在Scrapy中禁用这种资本化行为?
谢谢你的帮助

这不能用Scrapy一次性完成

原因:它通过设计以不区分大小写的方式管理头(请参阅)。我猜他们这样做是为了避免重复标题的麻烦

因此,最有可能的情况是,您必须执行一个fork并滚动您自己的头处理实现,或者至少执行一些monkey补丁


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

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

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

由于这个原因,我在两个网站上遇到了阻塞问题。以下是我两次都有效的变通方法:

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

你确定这就是问题所在吗?HTTP头应该不区分大小写。您可以通过将
curl
与大写头一起使用并检查它是否提供相同的输出来回答上述问题。如果是这样的话,你的问题就不是你想的那样了。是的,我很确定。我想我试图解析的网站是以某种特殊的方式处理的。
headers={
    "":"accept-encoding: gzip, deflate, br",
    "":"accept-language: en-US,en;q=0.9,hi;q=0.8,pt;q=0.7",
}