Чтобы изучить выбранный маршрут, используйте Request, привязанный к завершённому ответу. Держите три наблюдения раздельно:

ПолеЗначение
response.request.meta.get('proxy')Выбранный URL прокси этого запроса, если он есть
response.ip_addressАдрес, который сообщает обработчик загрузки, возможно None
Отчёт об источнике от доверенного узлаПубличный источник, замеченный там

Внутри callback не включайте в обычную диагностику части 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,
)

В обработчике HTTP/1.1 Scrapy 2.13.3 адрес берётся у собеседника соединения ответа, а не у службы исходящего IP. Некоторые пути, включая ответы нулевой длины, могут оставить его None. Другие обработчики могут заполнять его иначе. None сам по себе не доказывает прямое маршрутизирование.

Для проверки выхода запросите доверенную конечную точку в рамках предполагаемой политики прокси и сохраните идентичность запроса вместе с наблюдением. Ротационный middleware может дать следующей проверке другую конечную точку.

Перенаправления тоже создают ещё один запрос. Итоговые метаданные описывают этот этап; проверяйте историю перенаправлений и любой повторный выбор middleware, а не считайте их доказательством маршрута первого URL.

Похожие статьи