使用Python Requests下载文件遭反爬拦截,如何模拟浏览器绕过?
解决requests请求被识别为爬虫的问题
伪装成浏览器完全可行,只加User-Agent远远不够——网站通常会检查多维度的请求特征,以下是具体操作方案:
补全完整请求头
浏览器发送请求时会附带一堆额外头信息,你可以用浏览器F12开发者工具,抓取正常下载文件时的请求头,把Accept、Accept-Language、Accept-Encoding、Referer、Connection这些字段全部复制到代码里。示例代码:import requests from io import BytesIO headers = { "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8", "Accept-Language": "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2", "Accept-Encoding": "gzip, deflate, br", "Referer": "填写你触发下载的页面URL", "Connection": "keep-alive", "Upgrade-Insecure-Requests": "1" } r = requests.get(url, headers=headers, allow_redirects=True) # 先验证响应状态和内容类型 print(r.status_code) print(r.headers.get('Content-Type')) bts = BytesIO(r.content)维持会话Cookie
很多网站靠Cookie识别合法会话,你可以用两种方式处理:- 直接从浏览器开发者工具的Storage面板复制Cookie,加到headers的
Cookie字段里; - 用
requests.Session()先访问一遍下载页面,再发起下载请求,自动维持会话:
import requests from io import BytesIO session = requests.Session() # 先访问下载所在页面,获取会话Cookie session.get("下载页面的URL", headers=headers) # 再执行下载请求 r = session.get(url, headers=headers) bts = BytesIO(r.content)- 直接从浏览器开发者工具的Storage面板复制Cookie,加到headers的
用浏览器审查功能找解决方案
这是最直接的方法,步骤如下:- 打开浏览器F12,切换到Network标签,清空现有请求记录;
- 在浏览器里正常点击下载文件,找到对应的请求(大小接近800KB的GET请求);
- 查看该请求的Headers标签,复制全部Request Headers到代码中;
- 检查Response标签,确认返回的是文件内容而非HTML;
- 留意是否有重定向,requests默认允许重定向,但特殊跳转可能需要手动处理。
另外注意控制请求频率,模拟人类操作的间隔,避免触发频率限制。
内容的提问来源于stack exchange,提问作者egodial
相关产品推荐
相关产品推荐

