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

如何在Scrapy中结合轮换代理中间件使用API提供的代理?

解决方案

scrapy-rotating-proxies 默认的 ROTATING_PROXY_LIST 是静态代理列表,无法直接适配「每次请求返回新代理」的API接口。你需要通过动态代理获取函数来集成这类API,具体步骤如下:

1. 编写代理获取函数

在你的Scrapy项目中创建一个工具文件(比如 utils.py),编写从API获取代理的逻辑,根据API的返回格式调整解析方式:

import requests
import time

def get_dynamic_proxy():
    """从API获取新代理的函数"""
    api_url = "http://api.scrape.do/?token=MyToken"
    max_retries = 3
    retry_count = 0

    while retry_count < max_retries:
        try:
            # 调用代理API
            response = requests.get(api_url, timeout=5)
            response.raise_for_status()
            
            # 解析返回结果:根据API实际返回格式调整
            # 示例1:API直接返回代理地址文本(如http://x.x.x.x:port)
            proxy = response.text.strip()
            # 示例2:API返回JSON格式(如{"proxy": "http://x.x.x.x:port"})
            # proxy = response.json().get("proxy", "").strip()
            
            if proxy:
                return proxy
        except requests.exceptions.RequestException as e:
            print(f"获取代理失败,重试中: {str(e)}")
            retry_count += 1
            time.sleep(2)
    
    # 多次失败后返回None(或备用代理)
    return None

2. 修改settings.py配置

替换原有的静态代理列表配置,改用动态获取函数:

# 启用rotating-proxies中间件
DOWNLOADER_MIDDLEWARES = {
    'rotating_proxies.middlewares.RotatingProxyMiddleware': 610,
    'rotating_proxies.middlewares.BanDetectionMiddleware': 620,
}

# 配置动态代理获取函数的路径(替换成你的项目路径)
ROTATING_PROXY_GETTER = 'your_project_name.utils.get_dynamic_proxy'

# 可选:配置代理失败后的重试参数
ROTATING_PROXY_BACKOFF_BASE = 3  # 初始重试间隔(秒)
ROTATING_PROXY_BACKOFF_CAP = 30   # 最大重试间隔(秒)

3. 关键说明

  • 原配置中的 ROTATING_PROXY_LIST 用于静态代理集合,不适合动态API场景,需要删除或注释掉。
  • ROTATING_PROXY_GETTER 指定的函数会在每次需要新代理时自动调用,确保每次请求使用API返回的最新代理。
  • 务必根据你的代理API实际返回格式调整解析逻辑(文本/JSON等),避免解析失败导致代理无效。

内容的提问来源于stack exchange,提问作者Waleed Farrukh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 22:25:04