Scrapy爬取Adidas站点遇连接超时,求助移除默认Connection:close请求头
解决Scrapy爬取Adidas站点的Connection超时问题
问题回顾
你在使用Scrapy爬取Adidas美国站的男鞋页面(http://www.adidas.com/us/men-shoes)时遇到了超时错误,即便Chrome能正常访问该页面,且你已经添加了自定义User-Agent和请求头,问题依然存在。通过Fiddler分析后发现,根源在于Scrapy默认发送的Connection: close请求头,移除该头后请求即可正常响应,现在需要解决如何移除Scrapy默认的这个请求头。
解决方案
Scrapy默认会在请求中附加Connection: close头,我们可以通过两种方式覆盖或调整这个默认行为:
1. 在单个请求中显式覆盖Connection头
直接在你的start_requests方法的headers里将Connection设置为keep-alive,这样会覆盖Scrapy的默认值。修改后的代码如下:
import scrapy class AdidasSpider(scrapy.Spider): name = "adidas" def start_requests(self): urls = ['http://www.adidas.com/us/men-shoes'] headers = { "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8", "Accept-Encoding": "gzip, deflate", "Accept-Language": "en-US,en;q=0.9", "Cache-Control": "max-age=0", "Connection": "keep-alive", # 显式设置为keep-alive,覆盖默认的close "Host": "www.adidas.com", "Upgrade-Insecure-Requests": "1", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36" } for url in urls: yield scrapy.Request(url, self.parse, headers=headers) def parse(self, response): yield {'response_content': response.body.decode('utf-8')} # 转为字符串更易查看结果
2. 全局修改默认请求头(适用于所有爬虫)
如果希望所有爬虫请求都统一使用Connection: keep-alive,可以在Scrapy项目的settings.py文件中修改DEFAULT_REQUEST_HEADERS配置:
DEFAULT_REQUEST_HEADERS = { 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'Accept-Language': 'en', 'Connection': 'keep-alive' # 添加这一行,替换默认的close }
补充说明
- Chrome能正常访问的原因是:Chrome默认发送的是
Connection: keep-alive请求头,和Scrapy的默认行为不同,Adidas服务器对这两种请求的处理逻辑存在差异。 - 如果你确实需要完全移除
Connection头而非覆盖,可以通过自定义下载中间件实现,但一般来说,直接覆盖为keep-alive就足够解决当前问题。
内容的提问来源于stack exchange,提问作者Biswajit Chopdar
相关产品推荐
相关产品推荐

