Scrapy脚本本地运行正常,Ubuntu服务器返回无法识别的乱码响应
Scrapy 服务器返回乱码问题解决
这个现象是典型的响应压缩格式未被正确解压导致的,本地环境预装了对应依赖可以正常解压,服务器环境缺失依赖/配置错误就会直接返回原始二进制压缩内容,按以下步骤排查修复:
1. 确认响应压缩类型
在解析函数中打印响应头的编码标识,确认压缩格式:
def parse(self, response): # 输出内容大概率是 gzip、deflate、br 其中一种 print(response.headers.get("Content-Encoding", b"").decode())
2. 对应修复方案
- 缺失解压依赖:如果输出是
br(Brotli压缩),需要在服务器环境安装对应依赖:pip install brotli - 手动指定解压:如果不想安装额外依赖,也可以手动对响应体解压后再解析:
import gzip from io import BytesIO def parse(self, response): # 示例为gzip格式解压,Brotli格式对应使用brotli.decompress方法 content = gzip.GzipFile(fileobj=BytesIO(response.body)).read() print(content.decode("utf-8")) - 禁用压缩请求:在请求头中指定不接受压缩内容,让服务器直接返回明文:
yield scrapy.Request( url=目标链接, headers={"Accept-Encoding": "identity"} )
3. 配置排查
如果以上方案无效,检查项目settings.py中是否禁用了默认的压缩解压中间件,确保以下配置存在且未被注释:
DOWNLOADER_MIDDLEWARES = { 'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware': 590, }
内容的提问来源于stack exchange,提问作者Aiisc Sunday
相关产品推荐
相关产品推荐

