使用StormProxies访问Etsy仍频繁出现429请求过多错误求助
解决Etsy 429 Too Many Requests错误的优化方案
1. 修复重试机制,遵守Retry-After响应头
当前代码的重试配置存在两个关键问题:一是仅挂载了http://的适配器,对Etsy的HTTPS请求无效;二是未开启respect_retry_after_header,不会遵守Etsy返回的重试等待指令,导致在限制期内重复请求加剧429错误。
修改重试配置:
from requests.adapters import HTTPAdapter from urllib3.util.retry import Retry # 完善重试规则 retries = Retry( total=5, backoff_factor=1, status_forcelist=[502, 503, 504, 429], respect_retry_after_header=True # 关键:遵守Etsy返回的Retry-After等待时长 ) # 同时挂载http和https适配器 s.mount('http://', HTTPAdapter(max_retries=retries)) s.mount('https://', HTTPAdapter(max_retries=retries))
2. 降低并发量,控制请求频率
30+并发进程会导致短时间内请求密度远超Etsy的阈值,即使使用代理,单IP的请求频率也会触发限制。建议:
- 把并发数降至10以内,逐步测试找到稳定阈值
- 给每个请求添加随机延迟,避免请求集中发送:
import time import random # 请求前添加0.5-2秒随机延迟 time.sleep(random.uniform(0.5, 2)) r = s.get(url, proxies=proxies, timeout=30, headers=headers)
3. 完善请求头,模拟真实浏览器
Etsy会严格校验请求头真实性,缺失关键字段会直接判定为爬虫。替换默认空headers为完整的浏览器头:
def create_request(url, logging, headers=None, is_proxy=True): # 修复可变默认参数的坑,初始化默认请求头 if headers is None: 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', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8', 'Accept-Language': 'en-US,en;q=0.5', 'Referer': 'https://www.etsy.com/', 'DNT': '1', 'Connection': 'keep-alive', 'Upgrade-Insecure-Requests': '1' } # 后续代码...
4. 检查代理配置的完整性
确认PROXY_GATEWAY_IP包含StormProxies要求的完整认证信息,格式应为:http://用户名:密码@网关IP:端口。如果仅填写IP和端口,代理会失效,请求将直接使用本地IP发送,必然触发429。
5. 复用Session,优化连接管理
原代码每次调用都新建Session,无法复用连接,增加检测风险和开销。在多进程场景下,需为每个进程单独初始化Session:
def init_worker(): global session session = requests.Session() retries = Retry( total=5, backoff_factor=1, status_forcelist=[502, 503, 504, 429], respect_retry_after_header=True ) session.mount('http://', HTTPAdapter(max_retries=retries)) session.mount('https://', HTTPAdapter(max_retries=retries)) # 启动进程池时初始化 from multiprocessing import Pool if __name__ == '__main__': with Pool(processes=10, initializer=init_worker) as pool: # 提交任务逻辑 pass
6. 增强429异常处理
若Etsy未返回Retry-After头,可在异常捕获中主动延长等待时间:
except requests.exceptions.HTTPError as ex: if ex.response.status_code == 429: # 主动等待5-10秒后重试 time.sleep(random.uniform(5, 10)) # 可手动触发重试或依赖Session的重试机制 # 其他异常处理逻辑
内容的提问来源于stack exchange,提问作者Volatil3
相关产品推荐
相关产品推荐

