我按照下面的方式设置头文件
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进行调试):
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中禁用这种大写行为?谢谢你的帮助!
发布于 2017-04-18 04:47:52
这不能用Scrapy开箱即用。
原因:它在设计上以不区分大小写的方式管理头文件(参见:https://github.com/scrapy/scrapy/blob/master/scrapy/http/headers.py)。我猜他们这么做是为了避免重复报头带来的麻烦。
因此,最有可能的是,你将不得不做一个分支,并滚动你自己的头处理实现,或者至少做一些简单的修补。
但我想知道这是否真的是你所需要的。我知道有些网站确实会请求报头指纹识别来检测机器人,但scrapy生成的大写报头看起来比你想要为你的请求生成的全小写报头更像是非机器人报头。
发布于 2019-09-04 21:00:29
这是我的变通方法。在爬虫文件中,首先创建一个从头文件派生的类。
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发布于 2020-12-09 10:42:06
由于这个原因,我遇到了两个网站的拦截问题。以下是我的变通方法,这两次都有效:
headers={
"":"accept-encoding: gzip, deflate, br",
"":"accept-language: en-US,en;q=0.9,hi;q=0.8,pt;q=0.7",
}https://stackoverflow.com/questions/43455417
复制相似问题