2017-04-17 54 views
0

我设置标题下面的方式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 

而这对我的情况并不正确。

如果我使用卷曲和设置头小写

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

一切就像一个魅力。

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

+2

你确定是问题所在? HTTP标头应该不区分大小写。 – Chris

+0

你可以用'curl'和大写的标题来检查上面的问题,并检查它是否给出相同的输出。如果是这样,你的问题不是你认为的问题。 – holdenweb

+0

是的,我很确定。我想我想解析的网站正在处理它一些特殊的方式。 – kspi33

回答

1

这不能用Scrapy开箱即用。

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

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

但我想知道这是否真的是你需要的。我知道有些网站确实要求使用标题指纹来检测僵尸程序,但scrapy生成的大写标题看起来比您想为请求生成的所有小写标题看起来要多得多。