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

Scrapy使用squid私有代理被标记为DEAD的问题排查求助

问题排查:Scrapy-rotating-proxies标记可用Squid代理为DEAD

我在自定义配置的VM上搭建了Squid代理服务器,通过Firefox测试确认代理可正常访问HTTP和HTTPS页面,且未设置密码。但在Scrapy爬虫中使用scrapy-rotating-proxies调用该代理时,首次请求就被标记为DEAD。以下是相关配置及日志,请求协助排查原因。

Scrapy配置

DOWNLOADER_MIDDLEWARES = {
    "scrapy.downloadermiddlewares.useragent.UserAgentMiddleware": None,
    "scrapy.downloadermiddlewares.retry.RetryMiddleware": None,
    "scrapy_fake_useragent.middleware.RandomUserAgentMiddleware": 400,
    "scrapy_fake_useragent.middleware.RetryUserAgentMiddleware": 401,
    "rotating_proxies.middlewares.RotatingProxyMiddleware": 610,
    "rotating_proxies.middlewares.BanDetectionMiddleware": 620,
}

ROTATING_PROXY_LIST = ["X.X.X.X:3128"]

Scrapy日志

2022-12-02 13:31:22 [scrapy.core.engine] INFO: Spider opened
2022-12-02 13:31:22 [scrapy.extensions.logstats] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min)
2022-12-02 13:31:22 [scrapy.extensions.telnet] INFO: Telnet console listening on 127.0.0.1:6023
2022-12-02 13:31:22 [rotating_proxies.middlewares] INFO: Proxies(good: 0, dead: 0, unchecked: 1, reanimated: 0, mean backoff time: 0s)
2022-12-02 13:31:32 [rotating_proxies.expire] DEBUG: Proxy <http://X.X.X.X:3128> is DEAD
2022-12-02 13:31:32 [rotating_proxies.middlewares] DEBUG: Retrying <GET https://www.johnlewis.com/header/api/config> with another proxy (failed 1 times, max retries: 5)
2022-12-02 13:31:32 [rotating_proxies.middlewares] WARNING: No proxies available; marking all proxies as unchecked

修改后的Squid配置

http_access allow all
via off
forwarded_for delete

排查方向及解决建议

1. 补全代理地址协议头

scrapy-rotating-proxies要求代理地址必须包含协议前缀,当前配置缺少http://,修改为:

ROTATING_PROXY_LIST = ["http://X.X.X.X:3128"]

Squid默认监听HTTP代理端口3128,使用http协议头即可。

2. 验证跨机器网络连通性

在Scrapy运行的机器上,用curl测试代理是否能正常请求目标站点:

curl -x http://X.X.X.X:3128 https://www.johnlewis.com/header/api/config

如果请求失败,检查VM防火墙是否开放3128端口,同时确认Scrapy所在机器能正常ping通VM的IPX.X.X.X。

3. 调整Squid超时参数

默认Squid的超时设置可能过短,导致Scrapy请求超时被标记为DEAD。在Squid配置文件中添加:

connect_timeout 30 seconds
request_timeout 60 seconds

修改后重启Squid服务生效。

4. 临时禁用BanDetectionMiddleware测试

BanDetectionMiddleware会根据响应状态码、内容等判定代理是否失效,可能存在误判。临时禁用该中间件:

DOWNLOADER_MIDDLEWARES = {
    # 保留其他中间件配置
    "rotating_proxies.middlewares.BanDetectionMiddleware": None,
}

如果代理不再被标记为DEAD,说明目标站点的响应被误判,需要自定义该中间件调整判定规则。

5. 查看Squid访问日志

检查Squid的访问日志(默认路径/var/log/squid/access.log),查看Scrapy的请求是否到达代理,以及Squid返回的状态码,定位请求失败的具体原因。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 17:05:18