Scrapy有ImagesPipeline有助于下载图片。这个过程是
但是,如果我不需要蜘蛛部件并准备下载100k图像的URL,例如从redis读取URL,如何直接调用ImagePipeline下载图像呢?
我知道我可以简单地在蜘蛛中创建Request并保存响应,但我想看看是否有方法使用默认的ImagesPipeline来直接保存图像。
答案 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]}
然后在设置上启用管道。