from scrapy.pipelines.images import ImagesPipeline

class ProxiedImagesPipeline(ImagesPipeline):
    def get_media_requests(self, item, info):
        for request in super().get_media_requests(item, info):
            request.meta['proxy'] = 'http://proxy.example:8080'
            yield request

Для Scrapy 2.13.3 замените стандартную запись ImagesPipeline в ITEM_PIPELINES путём импорта этого подкласса. Сохраните IMAGES_STORE и другие настройки.

Вызов родительского класса сохраняет настроенное поле URL изображения и обратные вызовы. Подкласс добавляет только маршрут запроса, который использует включённый HttpProxyMiddleware. Каждый URL изображения остаётся его назначением. Новые запросы публичных изображений без учётных данных прокси могут использовать запись из списка HTTP-прокси, когда этот маршрут разрешён.

Запросы страниц сохраняют собственную политику. При глобальном окружении прокси meta={'proxy': None} делает выбранный запрос страницы прямым в этом выпуске.

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

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