Scrapy请求站点返回505状态码但浏览器可正常访问的原因及解决方法
问题成因
- Scrapy默认使用的HTTP协议版本与目标站点支持的版本不匹配:部分低版本Scrapy默认采用HTTP/1.0发送请求,当前绝大多数站点已停止对HTTP/1.0的支持,会直接返回505状态码。
- 未启用HTTP/2支持:目标站点强制要求使用HTTP/2协议通信,Scrapy默认关闭HTTP/2支持,使用HTTP/1.1发送的请求会被服务端直接拒绝。
- 底层依赖版本过低:Scrapy依赖的Twisted、cryptography等库版本过旧时,TLS握手阶段无法协商到站点支持的HTTP版本,会触发服务端返回505错误。
- 请求头校验不通过:部分站点会额外校验请求头的User-Agent、Connection等字段,如果请求头不符合规范,也会被误判为使用不支持的HTTP版本返回错误。
修复方案
调整默认HTTP版本配置
在项目的settings.py中添加如下配置,指定使用HTTP/1.1发送请求:DOWNLOADER_HTTP_VERSION = '1.1'若仅临时在scrapy shell中测试,可直接执行带参数的命令:
scrapy shell -s DOWNLOADER_HTTP_VERSION='1.1' 'https://xiaohua.zol.com.cn/detail60/59411.html'开启HTTP/2支持
首先安装HTTP/2相关依赖:pip install scrapy[http2]之后在
settings.py中修改下载处理器配置,启用HTTP/2的下载 handler:DOWNLOAD_HANDLERS = { 'https': 'scrapy.core.downloader.handlers.http2.H2DownloadHandler', }临时测试的命令如下:
scrapy shell -s DOWNLOAD_HANDLERS='{"https": "scrapy.core.downloader.handlers.http2.H2DownloadHandler"}' 'https://xiaohua.zol.com.cn/detail60/59411.html'模拟浏览器请求头
在请求中添加和浏览器一致的请求头,绕过站点基础反爬校验,scrapy shell中测试示例:from scrapy import Request req = Request( url='https://xiaohua.zol.com.cn/detail60/59411.html', headers={ 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36' } ) fetch(req)升级底层依赖
将Scrapy及相关依赖更新到最新版本,避免版本兼容问题:pip install --upgrade scrapy twisted cryptography
内容的提问来源于stack exchange,提问作者Andrey Epifantsev
相关产品推荐
相关产品推荐

