Python请求下载CSV文件遭拦截,寻求更稳定的实现方案
解决方案:绕过批量CSV下载的反爬拦截
这种高频请求触发的反爬拦截在数据爬取场景里太常见了!我之前做批量数据下载时也踩过一模一样的坑,咱们一步步优化你的实现,尽量模拟真实用户的行为来绕过限制:
完善请求头,完全模拟真实浏览器
很多网站会校验User-Agent、Referer甚至Cookie信息,你代码里的默认请求头和手动浏览时的差异很大,很容易被识别。建议打开浏览器开发者工具(F12),复制手动下载时的完整请求头,尤其是Cookie(如果需要登录态)和User-Agent字段。
示例代码:import requests from time import sleep # 复制浏览器里的真实请求头 headers = { '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', 'Referer': 'https://目标网站的页面URL', # 下载按钮所在的页面地址 'Cookie': '这里粘贴你手动访问时复制的Cookie字符串' } download_url = '你的CSV下载链接' response = requests.get(download_url, headers=headers) with open('output.csv', 'wb') as f: f.write(response.content)添加随机请求间隔,避免机械高频请求
连续五六次无间隔请求太像爬虫了!人类手动下载不可能这么快,建议在每次请求后添加1-3秒的随机等待时间,模拟正常操作节奏。
示例:import random # 每次请求后随机等待1-3秒 sleep(random.uniform(1, 3))用Session维持会话状态
手动浏览时浏览器会自动维持会话(比如Cookie、会话标识),但直接用requests.get()每次都是独立请求,容易被判定为异常。用requests.Session()可以绑定会话状态,和浏览器行为更一致。
示例:# 创建会话对象,自动维持Cookie等会话信息 session = requests.Session() session.headers.update(headers) # 先访问一次目标页面,预热会话(获取必要的会话标识) session.get('目标网站的首页或下载按钮所在页面URL') # 再执行下载请求 response = session.get(download_url) with open('output.csv', 'wb') as f: f.write(response.content)IP轮换(如果拦截仍未解除)
如果网站限制了单IP的请求频率,以上方法可能还是不够。可以准备一个代理IP池,每次请求随机切换代理,避免IP被封禁。
示例:proxies_pool = [ {'http': 'http://代理IP1:端口', 'https': 'https://代理IP1:端口'}, {'http': 'http://代理IP2:端口', 'https': 'https://代理IP2:端口'} ] # 随机选一个代理 selected_proxy = random.choice(proxies_pool) response = session.get(download_url, proxies=selected_proxy)检查下载链接是否动态生成
有些网站的下载链接是临时的,每次请求都会生成新的URL,或者需要先调用某个接口获取下载权限。如果你的代码用的是固定URL,多次请求后可能已经失效。可以用浏览器抓包工具,确认每次下载的真实请求链接是否有变化,是否需要先发送POST请求获取下载凭证。
内容的提问来源于stack exchange,提问作者bingqian hu
相关产品推荐
相关产品推荐

