如何在 Python Scrapy 中設定與輪替 Proxy 代理伺服器
更新於:
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' | 指定本次連線經由特定的 VinaProxy Proxy 節點送出 |
| 中介軟體優先級 | 740(先於 750) | 確保請求在進入內建 HttpProxyMiddleware 之前已完成 Proxy 指派 |
CONCURRENT_REQUESTS_PER_IP | 2 到 4 | 限制單一 Proxy IP 的同時連線數,預防遭遇目標伺服器 HTTP 429 限速 |
AUTOTHROTTLE_ENABLED | True | 依據目標網站的實際回應延遲自動調適爬取間隔時間 |
大規模 Scrapy 爬蟲專案的最佳實踐
- 在中介軟體的
from_crawler()方法中預先載入 VinaProxy Proxy 清單,並於process_request()內部以request.meta['proxy'] = random.choice(self.proxies)隨機選取節點 - 一併啟用
RANDOMIZE_DOWNLOAD_DELAY = True與DOWNLOAD_DELAY = 1.0,使每個 IP 的存取間隔呈現自然隨機化特徵 - 當遇到重試錯誤碼(
429或503)時,在重新排入請求佇列前更換一個新的 Proxy IP
操作步驟
- 1
將 Proxy 清單格式化為 http://user:pass@ip:port
將 VinaProxy 代理清單貼入我們的 Proxy 格式轉換工具 快速產生標準 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發出測試請求,確認輪替機制與身分認證正常運作。
常見問題
為什麼將自訂 Scrapy Proxy 中介軟體設定為優先級 800 時會失效?
Scrapy 內建的 HttpProxyMiddleware 執行於優先級 750。如果自訂中介軟體設為 800(排在 750 之後),URL 中的 user:pass 將無法正確轉換為 Proxy-Authorization 標頭。請務必將優先序設定在 750 之前(如 740)。
Scrapy 是否會對每個 Proxy 維持持續連線?
是的。Twisted 連線池會為每個 Proxy 端點維護持久的 TCP keep-alive 連線以提升傳輸效率。
執行數百萬頁面的大規模爬蟲時,VinaProxy 代理是否計算額外流量?
不會。所有 VinaProxy 專屬 IPv4 與靜態 ISP 方案皆提供每月無上限數據流量。
利用不限流量的靜態 IP 池大幅擴充你的 Scrapy 爬蟲
支援全球 7 國高品質專屬 IPv4 與靜態 ISP 代理,即時開通免等待。
購買 Scrapy 代理