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 中,把 ITEM_PIPELINES 里的标准 ImagesPipeline 条目替换为这个子类的导入路径。保留 IMAGES_STORE 与其他设置。

调用父类会保留它已配置的图片 URL 字段和回调。子类只增加请求路由,由 启用后的 HttpProxyMiddleware 消费。每个图片 URL 仍是它的目的地。没有代理凭据的新公开图片请求,在该路由被允许时,可以使用 HTTP 代理列表 中的条目。

页面请求保留自己的策略。在全局代理环境下,本版本中 meta={'proxy': None} 会让选定的页面请求直连。

检查下载是否真的发出。命中管道缓存可能避免一次网络请求。对新传输,把已完成图片的结果条目与请求的 URL 对比:成功的操作会出现在那里,而失败可能让原始图片 URL 字段仍被填着。通过下载器日志和所选代理追踪缺失的结果。

相关文章