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

如何在Scrapy日志中记录每个请求使用的代理?

解决Scrapy代理中间件日志中代理为None的问题

问题原因分析

出现代理为None的情况,主要有以下几种可能:

  • 代理列表中存在None值:如果settings中未正确配置某个代理项,settings.get()会返回None,随机选择时可能选中None导致请求无代理。
  • 代理中间件逻辑覆盖不全:当前代码仅处理了retry_times == 1的情况,若重试次数大于1或其他场景下代理设置被覆盖/未生效。
  • 中间件优先级问题:若代理中间件优先级低于Scrapy默认的HttpProxyMiddleware,可能被后续中间件覆盖代理设置。

解决方法

1. 清理代理列表,过滤无效值

先确保代理列表中没有None,避免随机选中无效代理:

packetstream_proxies = [
    proxy for proxy in [
        settings.get("PS_PROXY_USA"),
        settings.get("PS_PROXY_CA"),
        settings.get("PS_PROXY_IT"),
        settings.get("PS_PROXY_GLOBAL"),
    ] if proxy is not None
]

unlimited_proxies = [
    proxy for proxy in [
        settings.get("UNLIMITED_PROXY_1"),
        settings.get("UNLIMITED_PROXY_2"),
        settings.get("UNLIMITED_PROXY_3"),
        settings.get("UNLIMITED_PROXY_4"),
        settings.get("UNLIMITED_PROXY_5"),
        settings.get("UNLIMITED_PROXY_6"),
    ] if proxy is not None
]

# 额外检查:确保列表不为空,避免报错
if not packetstream_proxies:
    raise ValueError("No valid PacketStream proxies configured")
if not unlimited_proxies:
    raise ValueError("No valid Unlimited proxies configured")

2. 完善process_request逻辑,覆盖所有场景

调整代理设置逻辑,确保所有请求(包括不同重试次数)都能正确设置代理:

class SdtProxyMiddleware(object):
    def process_request(self, request, spider):
        retry_times = request.meta.get("retry_times", 0)
        # 根据重试次数选择代理池
        if retry_times >= 1:
            request.meta["proxy"] = random.choice(unlimited_proxies)
        else:
            request.meta["proxy"] = random.choice(packetstream_proxies)
        # 无需返回None,默认返回None会继续请求流程

    def process_response(self, request, response, spider):
        proxy = request.meta.get("proxy")
        if proxy:
            spider.logger.info(f"Processed {response.url} with {proxy}")
        else:
            spider.logger.warning(f"No proxy assigned for {response.url}")
        return response

3. 配置正确的中间件优先级

在settings.py中确保自定义代理中间件的优先级高于Scrapy默认的HttpProxyMiddleware(默认优先级为700),避免被覆盖:

DOWNLOADER_MIDDLEWARES = {
    'your_project_name.middlewares.SdtProxyMiddleware': 100,  # 优先级越高越先执行
    'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware': 110,
}

4. 验证代理配置正确性

检查settings.py中所有代理配置项是否正确填写,确保PS_PROXY_USA、UNLIMITED_PROXY_1等配置项的值是有效的代理地址(如http://username:password@proxyhost:port)。


内容的提问来源于stack exchange,提问作者X-something

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 16:55:22