如何在 Python Scrapy 中配置并轮换代理 IP
更新于:
Scrapy 基于异步 Twisted 引擎,内置了运行在优先级 750 的 HttpProxyMiddleware,可自动解析分配给 request.meta['proxy'] 的 http://user:pass@ip:port 代理字符串。仅需在优先级 740 编写一段 10 行左右的自定义下载器中间件(Downloader Middleware),你的爬虫即可全自动轮换使用 VinaProxy 不限流量的静态 IP 池。
request.meta['proxy'] = 'http://user:pass@ip:port'- 1 个IP₫40,000
- 5+ 个IP₫35,000
- 10+ 个IP₫25,000
- 20+ 个IP₫25,000
- 50+ 个IP₫25,000
- 100+ 个IP₫25,000
- 200+ 个IP₫25,000
- 500+ 个IP₫25,000
- 1000+ 个IP₫22,000
- 2000+ 个IP₫20,000
- 1 个IP₫40,000
- 5+ 个IP₫35,000
- 10+ 个IP₫25,000
- 20+ 个IP₫25,000
- 50+ 个IP₫25,000
- 100+ 个IP₫25,000
- 200+ 个IP₫25,000
- 500+ 个IP₫25,000
- 1000+ 个IP₫22,000
- 2000+ 个IP₫20,000
Scrapy 代理中间件执行顺序与并发控制参数
由于内置的 HttpProxyMiddleware 在优先级 750 运行,负责剥离代理 URL 中的 user:pass 并将其编码为 Proxy-Authorization 标头,因此任何为 request.meta['proxy'] 赋值的自定义中间件都必须使用更小的优先级数值(例如 740):
| Scrapy 配置项 | 推荐取值 | 技术功能与作用 |
|---|---|---|
request.meta['proxy'] | 'http://user:pass@ip:port' | 指定本次 HTTP 请求经过的特定 VinaProxy 代理节点 |
| 中间件优先级 | 740(早于 750) | 确保请求在进入内置 HttpProxyMiddleware 前完成代理与鉴权赋值 |
CONCURRENT_REQUESTS_PER_IP | 2 到 4 | 限制每个代理 IP 的并发套接字数,防止触发目标站 HTTP 429 限流 |
AUTOTHROTTLE_ENABLED | True | 依据目标站点的响应延迟动态微调爬取间隔时间 |
面向海量规模 Scrapy 采集的最佳实践
- 在中间件的
from_crawler()方法中加载 VinaProxy 代理列表,并在process_request()中执行request.meta['proxy'] = random.choice(self.proxies)随机选取节点 - 同时开启
RANDOMIZE_DOWNLOAD_DELAY = True与DOWNLOAD_DELAY = 1.0,使每个代理 IP 的请求间隔具备随机波动,避免产生机械化规律 - 当遭遇重试状态码(
429或503)时,在重新将请求放回队列前更换另一个新的代理 IP
操作步骤
- 1
将代理池格式化为 http://user:pass@ip:port
将 VinaProxy 代理列表粘贴至我们的 代理格式转换工具 批量获取标砖 URL 字符串格式。
- 2
在 middlewares.py 中编写 ProxyPoolMiddleware
实现
process_request(self, request, spider)方法并指定request.meta['proxy'] = random.choice(self.proxies)。 - 3
在 settings.py 中以优先级 740 注册中间件
在
DOWNLOADER_MIDDLEWARES中添加'myproject.middlewares.ProxyPoolMiddleware': 740,并配置CONCURRENT_REQUESTS_PER_IP = 2。 - 4
通过 scrapy shell 或爬虫命令进行连通测试
针对
https://vinaproxy.com/api/my-ip发送测试请求,验证代理轮换与认证是否正常运作。
常见问题
为什么将自定义代理中间件优先级设为 800 时会导致认证失效?
Scrapy 内置的 HttpProxyMiddleware 运行在优先级 750。如果自定义中间件设为 800(排在 750 之后),URL 中携带的 user:pass 无法被转换成 Proxy-Authorization 请求头。请务必将中间件优先级配置在 750 之前(如 740)。
Scrapy 会对每个代理节点保持长连接吗?
是的。Twisted 底层的连接池会针对每个代理端点维护持久的 TCP keep-alive 连接,大幅减少握手开销。
数百万级网页抓取任务中,VinaProxy 代理会产生流量超额计费吗?
不会。所有 VinaProxy 独享 IPv4 与静态 ISP 套餐均包含无限制的月度流量。
使用不限流量的静态 IP 池扩展你的 Scrapy 爬虫集群
覆盖 7 大国家的高品质批量独享 IPv4 与静态 ISP 代理,即时开通。
购买 Scrapy 代理