Scrapy のプロキシエンドポイントと接続 IP を読む
選択されたプロキシにはリクエストのメタデータを使い、response.ip_address はハンドラが提供するピア情報として扱い、宛先で出口 IP を確認します。
完了したレスポンスに付随する Request を使って、選択されたルートを調べます。三つの観測は区別して扱います。
| フィールド | 意味 |
|---|---|
response.request.meta.get('proxy') | このリクエストで選択されたプロキシ URL(存在する場合) |
response.ip_address | ダウンロードハンドラが提供するアドレス。None の可能性があります |
| 信頼できる宛先からの送信元レポート | そこで観測された公開送信元 |
コールバック内では、資格情報を含む URL 部分を通常の診断から除外します。
from urllib.parse import urlsplit
proxy = response.request.meta.get('proxy')
proxy_host = urlsplit(proxy).hostname if proxy else None
self.logger.info(
'target_host=%s proxy_host=%s peer_ip=%s',
urlsplit(response.url).hostname, proxy_host, response.ip_address,
)Scrapy 2.13.3 の HTTP/1.1 ハンドラでは、アドレスはレスポンス接続のピアから取得され、出口 IP サービスからではありません。長さゼロのレスポンスを含む一部の経路では None のままになることがあります。他のハンドラでは別の方法で埋まる場合があります。None だけでは直接接続を証明しません。
出口の確認では、想定するプロキシ方針のもとで信頼できるエンドポイントに問い合わせ、リクエストの同一性を観測と一緒に保存します。ローテーションするミドルウェアは後続の確認に別のエンドポイントを与えることがあります。
リダイレクトも別のリクエストを作ります。最終的なメタデータはその段階を説明するので、最初の URL のルートの証拠とみなさず、リダイレクト履歴とミドルウェアによる再選択を確認します。