Scrapy爬取亚马逊无错误码返回空响应问题咨询
问题原因
这是亚马逊典型的软反爬拦截,和常规返回错误状态码的拦截逻辑不同,这类拦截会默认返回200状态码,但响应体是无有效内容的空白页,不会给出明确的拦截提示:
- 仅修改User-Agent完全绕不过亚马逊的反爬校验:不管是伪装Googlebot还是用随机UA轮换,都只覆盖了UA识别这一个最基础的校验环节,剩下的TLS指纹校验、IP信誉校验、请求行为校验没通过的话,一样会被拦截。
- 你用的0.1.1版本scrapy-user-agents库已经停止维护多年,内置的UA池大量是过时、被标记为爬虫特征的UA,随机轮换反而更容易触发反爬规则。另外伪装Googlebot的方案本身风险极高——亚马逊会反向校验请求源IP是否属于谷歌官方爬虫IP段,非谷歌IP用Googlebot UA会直接被标记为高风险恶意流量,拦截等级更高。
- Scrapy默认的HTTP请求客户端TLS指纹和真实Chrome、Edge等主流浏览器差异非常明显,亚马逊通过JA3指纹识别可以直接判定请求来自爬虫客户端,不管UA怎么修改都会命中拦截。
- 你的请求没有携带站点强制校验的Cookie、常规请求头字段,也会被判定为异常流量,返回空白响应。
解决方案
- 替换Scrapy默认的请求客户端:这是绕过软拦截的核心步骤,不要用原生
scrapy.Request发请求,接入scrapy-playwright或者curl_cffi模拟真实浏览器的TLS指纹,其中curl_cffi可以直接模拟最新版Chrome的JA3指纹,资源占用比浏览器自动化低很多。 - 废弃旧的UA中间件:手动维护近期更新的真实桌面端Chrome、Edge UA做轮换,不要用爬虫库自带的过时UA池,也不要再用Googlebot伪装UA。
- 补全请求校验逻辑:首次请求先访问站点首页获取完整的下发Cookie,后续所有列表页、商品页请求都必须携带上一跳返回的Cookie,同时补全真实浏览器会携带的
Accept、Accept-Language、Referer字段,不要发送无上下文的裸请求。 - 控制请求节奏:单IP的请求间隔不要低于3秒,不要用固定间隔,加1-2秒的随机浮动,连续请求20次左右更换一次IP,优先用住宅IP,机房IP的拦截概率要高很多。
- 增加空白页重试机制:判断响应体长度,如果返回的页面源码长度低于10KB、且匹配不到目标内容的特征字段,直接触发重试,重试时同步更换IP和UA,不要直接处理空白响应。
内容的提问来源于stack exchange,提问作者Redwan Hossain Arnob
相关产品推荐
相关产品推荐

