完了したレスポンスに付随する 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 のルートの証拠とみなさず、リダイレクト履歴とミドルウェアによる再選択を確認します。

関連記事