> For the complete documentation index, see [llms.txt](https://docs.talordata.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.talordata.com/cn-tw/proxy/integrations-guide/scrapy-talordata-integration-guide.md).

# Scrapy & Talordata 集成指南

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

{% hint style="success" icon="lightbulb-exclamation-on" %}
在配置代理之前，您需要取得代理憑證。[點擊此處](/cn-tw/proxy/rotating-residential-proxies/quick-start.md)了解如何取得代理憑證
{% endhint %}

***

{% stepper %}
{% step %}

#### **安裝 Scrapy**

1. 前往 [Scrapy 官網](https://www.scrapy.org/)，按照官方文件的指引完成安裝。
2. 安裝完成後，在終端機中執行 `scrapy version`，若正常顯示版本號（例如 Scrapy 2.14.2），即表示安裝成功。

{% endstep %}

{% step %}

#### **自訂代理中間件**

{% hint style="success" icon="lightbulb-exclamation-on" %}
如果您還沒有 Scrapy 專案，請先執行 `scrapy startproject myproject` 建立一個新專案，然後進入專案目錄
{% endhint %}

1. 在您的 Scrapy 專案目錄下找到 `middlewares.py` 並開啟。

<figure><img src="/files/2aakFJJITqsXXu7DzSqW" alt="" width="154"><figcaption></figcaption></figure>

2. 添加以下程式碼到檔案中並儲存：

```python
# 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}')
```

{% endstep %}

{% step %}

#### **配置代理**

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

<figure><img src="/files/h41ima6LFg4e5bhI0xIj" alt="" width="148"><figcaption></figcaption></figure>

2. 添加以下配置並儲存：

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

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

{% hint style="success" icon="lightbulb-exclamation-on" %}
`AutoProxyMiddleware` 的優先級設為 `749`（小於 750），這樣它會在內建的 `HttpProxyMiddleware` 之前執行，提前為每個請求設定好 `meta['proxy']`，從而覆蓋系統環境變數或全域代理設定。
{% endhint %}

{% endstep %}

{% step %}

#### **驗證代理**

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

```python
# 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))
```

2. 執行測試檔案，查看輸出結果是否與您設定的代理一致

```python
# 範例
{
  "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"
}

```

{% endstep %}
{% endstepper %}

***
