You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 05:10:32