Scrapy将请求标头大写

时间:2017-04-17 16:30:11

标签: 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, 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中禁用这种大写行为? 谢谢你的帮助!

3 个答案:

答案 0 :(得分:1)

这不能用Scrapy开箱即用。

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

所以很可能你必须做一个fork和roll自己的头文件处理实现,或至少做一些猴子修补。

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

答案 1 :(得分:0)

这是我的解决方法。在蜘蛛文件中,您首先创建一个从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

答案 2 :(得分:0)

由于这个原因,我在两个站点上遇到了阻止问题。这是我的解决方法,两次都起作用:

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