使用requests.get请求Powerball网站返回编码结果不一致问题排查
请求Powerball网站返回内容编码不一致的原因分析
问题描述
执行以下代码时,每次返回的内容格式不稳定:有时是可读的ASCII文本,有时却是非ASCII乱码格式,但page.encoding始终显示为utf-8。即使复制浏览器发送的HTTP请求头,问题依然存在。
HEADERS = ({'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36', 'Accept-Language': 'en-US,en;q=0.9', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7'}) page = requests.get('https://www.powerball.com/', headers=HEADERS) print(page.text) print(page.encoding)
核心原因
- 缺失
Accept-Encoding请求头导致压缩逻辑不稳定:你的请求头未指定支持的内容压缩格式(如gzip、br),服务器会随机选择返回压缩后的二进制数据或明文内容。当返回压缩数据时,若requests的自动解压缩逻辑未正确识别,就会显示为乱码;而page.encoding会被默认设置为utf-8,和实际压缩内容的编码不匹配。 - 服务器/CDN节点的动态分发差异:网站可能使用了负载均衡或CDN,不同节点对请求的处理逻辑不一致,部分节点返回压缩内容,部分返回明文,导致每次请求结果不同。
解决办法
- 在请求头中添加
Accept-Encoding字段,明确告知服务器支持的压缩格式,让服务器稳定返回可被正确解压缩的内容:HEADERS = ({'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36', 'Accept-Language': 'en-US,en;q=0.9', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7', 'Accept-Encoding': 'gzip, deflate, br'}) - 检查响应头的
Content-Encoding字段,确认服务器是否返回了压缩内容:print(page.headers.get('Content-Encoding')) - 若自动解压缩失效,可手动对响应内容进行解压缩(以gzip为例):
import gzip from io import BytesIO if page.headers.get('Content-Encoding') == 'gzip': content = gzip.decompress(page.content) print(content.decode('utf-8'))
内容的提问来源于stack exchange,提问作者s_c
相关产品推荐
相关产品推荐

