为何用Python requests下载Zip文件需添加User-Agent请求头?
问题
我尝试使用Python的requests库从URL下载一个Zip文件,编写了如下代码:
import requests r = requests.get(file_url) file = open("file.zip","wb") file.write(r.content) file.close()
但打开下载后的文件时,系统提示它不是Zip文件,无法正常打开。之后我从浏览器网络面板复制了请求头信息添加到请求中,下载就成功了,添加的请求头如下:
headers = {'Host': 'www.bseindia.com', 'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/114.0', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8', 'Accept-Language': 'en-US,en;q=0.5', 'Accept-Encoding': 'gzip, deflate, br', 'DNT': '1', 'Alt-Used': 'www.bseindia.com', 'Connection': 'keep-alive', 'Upgrade-Insecure-Requests': '1', 'Sec-Fetch-Dest': 'document', 'Sec-Fetch-Mode': 'navigate', 'Sec-Fetch-Site': 'none', 'Sec-Fetch-User': '?1', 'Sec-GPC': '1'}
我逐个移除请求头测试后发现,User-Agent是必须的。作为Web技术新手,我想了解为何必须添加该请求头才能成功下载Zip文件,以及无请求头时失败的原因。
解答
1. User-Agent的核心作用
User-Agent是HTTP请求头里的标识字段,用来告诉服务器发起请求的客户端类型——是浏览器、自动化脚本还是其他工具。requests库默认会自动带上类似python-requests/2.31.0的User-Agent,直接暴露这是Python脚本发起的请求。
2. 服务器要求User-Agent的原因
- 反爬虫拦截:像bseindia这类网站会通过识别User-Agent过滤自动化请求,避免被爬虫批量抓取数据。当服务器看到
python-requests这类标识时,会拒绝返回真实的Zip文件,转而返回HTML格式的错误页面(比如403禁止访问页面)。 - 内容适配策略:部分服务器会根据客户端类型返回不同内容,给浏览器返回正常资源,给非浏览器客户端返回验证页面或简化内容。
- 负载保护:自动化脚本可能短时间发起大量请求,服务器通过限制非浏览器标识的请求,避免资源被过度消耗。
3. 无User-Agent时失败的具体原因
你以为没手动加User-Agent就没有这个字段?其实requests会自动添加默认的python-requests标识。服务器识别出这是脚本请求后,没有返回你需要的Zip文件,而是返回了错误页面的HTML代码。你把这段HTML内容存成了file.zip,自然不是有效的压缩文件,系统就会提示“不是Zip文件”。
内容的提问来源于stack exchange,提问作者mizerable
相关产品推荐
相关产品推荐

