2016-03-15 89 views
1

Scrapy有ImagesPipeline可幫助下載圖片。這個過程是Scrapy - 從圖片url列表下載圖片

  1. 蜘蛛:啓動一個鏈接,並解析所有圖像的URL響應,並 圖像的URL保存到項目。
  2. ImagesPipeline:items ['image_urls']由ImagesPipeline處理。

但是,如果我不需要蜘蛛部件並且有100k圖像URL準備好下載,例如從redis讀取URL,我如何直接調用ImagePipeline來下載圖像?

我知道我可以簡單地在蜘蛛請求和保存響應,但我想看看是否有辦法使用默認的ImagesPipeline直接保存圖像。

回答

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'] } 

這是醜陋的,但它應該工作罰款...

PS我不知道任何簡單的方法來繞過虛擬請求,並直接注入和Item。我確定有一個,但這是一件非常不尋常的事情。

0

scrapy Pipeline背後的想法是處理蜘蛛生成的物品解釋here

現在scrapy不是關於「下載」工作人員,而是一種創建抓取工具,蜘蛛的方法,所以如果你有一個列表與urls「下載」,然後只是使用循環和下載它們。

如果您仍然想要使用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]} 

然後啓用管道設置。