如何为请求添加代理以避免API请求频率限制
问题原因及解决方案
1. 代理配置不完整
你当前的proxyDict仅配置了http协议的代理规则,如果目标API使用https协议,请求会直接走本地网络,不会触发代理,这是最常见的原因。
修正代理配置示例:
# 同时配置http和https协议的代理规则 proxyDict = { "http" : "http://"+https_proxy, "https" : "http://"+https_proxy # 若你的代理需使用https连接,可将前缀改为https:// }
如果代理需要身份认证,代理地址格式为用户名:密码@代理IP:端口。
2. 代理未随请求更新
如果你是批量发起多次请求,当前代码仅在初始化时随机选中1个代理,所有请求都会复用这个代理IP,一旦该IP被限制,后续请求都会触发拦截。
需要调整逻辑,每次发起新请求前都重新随机选择代理:
import random import requests # 初始化时一次性读取代理池 proxies = open("proxies.txt", encoding="UTF-8", errors="ignore").read().splitlines() # 每次请求前重新选代理 for _ in range(请求次数): cur_proxy = random.choice(proxies) proxyDict = { "http": f"http://{cur_proxy}", "https": f"http://{cur_proxy}" } # 每次新建会话,避免Cookie关联 session = requests.Session() # 配置随机请求头,避免UA特征被识别 session.headers.update({ "User-Agent": random.choice([ "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.0 Safari/605.1.15" ]) }) try: req2 = session.get(url=url2, timeout=timeout, proxies=proxyDict).json() example = req2['data'] except Exception as e: # 可在此处将无效代理从代理池移除 continue
3. 代理本身存在问题
- 检查代理是否为透明代理:这类代理会在请求头中携带你的真实IP,目标API可直接读取到你的本地IP
- 提前校验代理可用性:可调用公开IP查询接口验证返回IP是否为代理IP,排除已失效、已被目标API封禁的代理
- 若使用的是公共共享代理,大部分IP早已被主流API拉黑,建议更换独享代理池
4. 其他反爬策略绕过
API的限制规则通常不只有IP检测,还包括:
- 请求频率限制:可添加随机请求间隔,避免短时间内发起大量请求
- 请求头校验:确保User-Agent、Referer等头信息符合正常浏览器特征,不要使用固定值
- Cookie追踪:不要复用同一个会话对象,每次请求新建会话或者主动清除Cookie
内容的提问来源于stack exchange,提问作者TheAwesome444
相关产品推荐
相关产品推荐

