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
相关产品推荐
相关产品推荐

