Scrapy

在 Scrapy 爬蟲框架中配置代理,可以有效提高資料蒐集的穩定性。使用自訂下載器中間件,將無需在每個爬蟲請求中手動添加參數。請參考以下步驟操作。

lightbulb-exclamation-on


1

安裝 Scrapy

  1. 前往 Scrapy 官網arrow-up-right,按照官方文件的指引完成安裝。

  2. 安裝完成後,在終端機中執行 scrapy version,若正常顯示版本號(例如 Scrapy 2.14.2),即表示安裝成功。

2

自訂代理中間件

lightbulb-exclamation-on
  1. 在您的 Scrapy 專案目錄下找到 middlewares.py 並開啟。

  1. 添加以下程式碼到檔案中並儲存:

# middlewares.py
from scrapy import signals

class AutoProxyMiddleware:
    def __init__(self, proxy):
        self.proxy = proxy

    @classmethod
    def from_crawler(cls, crawler):
        # 從 settings.py 中讀取代理配置
        proxy = crawler.settings.get('HTTP_PROXY')
        mw = cls(proxy)
        crawler.signals.connect(mw.spider_opened, signals.spider_opened)
        return mw

    def process_request(self, request, spider):
        # 為每個請求設定代理(如果尚未設定)
        if self.proxy and 'proxy' not in request.meta:
            request.meta['proxy'] = self.proxy
            # 無需手動添加 'Proxy-Authorization' 標頭。
            # Scrapy 內建的 HttpProxyMiddleware 會因為代理 URL 中包含憑證,
            # 而自動處理認證。

    def spider_opened(self, spider):
        spider.logger.info(f'AutoProxyMiddleware enabled, proxy: {self.proxy}')

3

配置代理

  1. 開啟專案中的 settings.py 檔案。

  1. 添加以下配置並儲存:

# 設定您的代理(請將代理資訊替換為您的實際憑證)
HTTP_PROXY = 'http://你的使用者名稱:你的密碼@你的代理主機:你的連接埠'

# 配置下載器中間件
DOWNLOADER_MIDDLEWARES = {
    'myproject.middlewares.AutoProxyMiddleware': 749,      # 自訂中間件,優先級高於內建的 HttpProxyMiddleware。請將 myproject 替換為您的 Scrapy 專案名稱。
    'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware': 750,
}
lightbulb-exclamation-on

4

驗證代理

  1. 建立測試檔案並填寫以下內容

# test_proxy.py
import scrapy
import json

class TestProxySpider(scrapy.Spider):
    name = 'test_proxy'

    def start_requests(self):
        yield scrapy.Request(
            url='https://ipinfo.io/json',
            callback=self.parse
        ) # 無需手動為代理添加 'meta',中間件會自動處理。

    def parse(self, response):
        data = json.loads(response.text)
        print(json.dumps(data, indent=2, ensure_ascii=False))
  1. 執行測試檔案,查看輸出結果是否與您設定的代理一致

# 範例
{
  "ip": "67.72.110.148",
  "city": "Tampa",
  "region": "Florida",
  "country": "US",
  "loc": "27.9475,-82.4584",
  "org": "AS23089 Hotwire Communications",
  "postal": "33606",
  "timezone": "America/New_York",
  "readme": "https://ipinfo.io/missingauth"
}


最后更新于