Python下载文件被识别为ASCII文本而非Zip包问题求助
问题分析与解决方案
你遇到的核心问题是:接口返回内容实际是文本(大概率是JSON格式的错误提示),而非预期的二进制Zip包——哪怕状态码显示200。以下是具体排查和解决方向:
1. 先确认响应内容到底是什么
别着急写入文件,先打印响应的文本内容,大概率能发现问题(比如权限验证失败、参数不匹配的JSON提示):
if response.status_code == 200: print("响应文本预览:", response.text[:500]) # 打印前500字符,看是否是错误信息 # 再通过Content-Type判断是否为二进制文件 if response.headers.get('Content-Type') in ['application/zip', 'application/octet-stream']: with open("linux-client-bundle.zip", "wb") as fd: for chunk in response.iter_content(chunk_size=1024): fd.write(chunk) print("文件下载成功") else: print("返回非二进制文件,Content-Type:", response.headers.get('Content-Type'))
2. 补充缺失的浏览器请求头
你当前的请求头只包含session和Accept-Encoding,但Chrome发起请求时会带更多关键头,至少要补上User-Agent(模拟浏览器身份),如果服务器校验来源,还需要加上Referer:
headers = { 'session': api_token, 'Accept-Encoding': 'gzip, deflate, br', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36', # 对照Chrome抓包结果添加Referer(如果有): # 'Referer': 'abc.com/plugin/products/client-management/' }
3. 关闭requests自动编码解码(可选)
requests会根据Accept-Encoding自动解码响应,若服务器编码处理有异常,可以直接读取原始字节:
import shutil response = requests.post(url, headers=headers, verify=False, json=payload, stream=True) response.raw.decode_content = False # 关闭自动解码 with open("linux-client-bundle.zip", "wb") as fd: shutil.copyfileobj(response.raw, fd)
4. 再次核对Payload参数细节
即便你说和Chrome一致,也再检查一遍:比如枚举值大小写(CATEGORY_LINUX是否需要全小写?)、是否遗漏了Chrome请求里的隐藏参数(比如额外的字段、嵌套层级)。
内容的提问来源于stack exchange,提问作者vicky.charles
相关产品推荐
相关产品推荐

