Scrapy - 从图像网址列表下载图像

时间:2016-03-15 03:00:04

标签: scrapy

Scrapy有ImagesPipeline有助于下载图片。这个过程是

  1. Spider:启动链接并解析所有图片网址并进行保存 图片网址到商品。
  2. ImagesPipeline:items ['image_urls']由ImagesPipeline处理。
  3. 但是,如果我不需要蜘蛛部件并准备下载100k图像的URL,例如从redis读取URL,如何直接调用ImagePipeline下载图像呢?

    我知道我可以简单地在蜘蛛中创建Request并保存响应,但我想看看是否有方法使用默认的ImagesPipeline来直接保存图像。

2 个答案:

答案 0 :(得分:0)

我不认为您描述的用例最适合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'] }

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

P.S。我不知道绕过虚拟请求和直接注入Item的任何简单方法。我确定有一个,但这样做很不寻常。

答案 1 :(得分:0)

scrapy管道背后的想法是处理蜘蛛生成的项目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]}

然后在设置上启用管道。