【问题标题】:Scrapy - download images from image url listScrapy - 从图像 url 列表中下载图像
【发布时间】:2016-03-15 03:00:04
【问题描述】:

Scrapy 有 ImagesPipeline 帮助下载图像。过程是

  1. Spider:启动一个链接并解析所有图像的url作为响应,并保存 商品的图片网址。
  2. ImagesPipeline:项目['image_urls'] 由 ImagesPipeline 处理。

但是如果我不需要蜘蛛部件并且有 100k 个图像 URL 可以下载,例如从 redis 读取 URL,我如何直接调用 ImagePipeline 来下载图像?

我知道我可以简单地在蜘蛛中发出请求并保存响应,但我想看看是否有办法使用默认的 ImagesPipeline 直接保存图像。

【问题讨论】:

    标签: scrapy


    【解决方案1】:

    我不认为您描述的用例最适合 Scrapy。 Wget 可以很好地解决这种受限问题。

    如果您确实需要为此使用 Scrapy,请向某个 URL 发出虚拟请求:

    def start_requests(self):
        request = Request('http://example.com')
        # load from redis
        redis_img_urls = ...
        request.meta['redis_img_urls'] = redis_img_urls
        yield request
    

    然后在parse()方法上返回:

    def parse(self, response):
        return {'image_urls':request.meta['redis_img_urls'] }
    

    这很难看,但应该可以正常工作...

    附:我不知道有任何简单的方法可以绕过虚拟请求并直接注入和Item。我敢肯定有一个,但这是一件不寻常的事情。

    【讨论】:

      【解决方案2】:

      scrapy Pipeline 背后的想法是处理蜘蛛生成的项目,解释 here

      现在,scrapy 不是关于“下载”人员,而是一种创建爬虫、蜘蛛的方法,所以如果你有一个包含要“下载”的 url 的列表,那么只需使用 for 循环并下载它们。

      如果您仍想使用scrapy Pipeline,则必须在image_urls 字段中返回包含该列表的项目。

      def start_requests(self):
          yield Request('http://httpbin.org/ip', callback=self.parse)
      
      def parse(self, response):
          ...
          yield {'image_urls': [your list]}
      

      然后在设置中启用管道。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-06-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-12
        • 2018-12-15
        • 1970-01-01
        • 2019-12-24
        相关资源
        最近更新 更多