2016-11-15 69 views
1

我正在運行Scrapy CrawlSpider從網站下載圖像。Scrapy重命名圖像

使用管道:

import scrapy 
from scrapy.pipelines.images import ImagesPipeline 
from PIL import Image 

class XPipeline(ImagesPipeline): 

    def set_filename(self, response): 
     return 'full/{0}.jpg'.format(response.meta['title'][0]) 

    def get_media_requests(self, item, info): 
     for image_url in item['image_urls']: 
      yield scrapy.Request(image_url, meta={'title': item['Sku']}) 

    def get_images(self, response, request, info): 
     for key, image, buf in super(XPipeline, self).get_images(response, request, info): 
      key = self.set_filename(response) 
     yield key, image, buf 

這種運作良好,當有每個產品頁面只有一個「image_urls」,但是,它往往是一個產品網頁可以有多個產品圖片的情況。

另外我怎樣才能修改管道添加一個整數值修改圖像標題?

任何幫助,將不勝感激

回答

0

您可以跟蹤的圖片網址和圖片網址中的get_media_requests指數爲循環和索引追加到標題,比如:

def get_media_requests(self, item, info): 
    for i, image_url in enumerate(item['image_urls']): 
     yield scrapy.Request(image_url, meta={'title_' + i: item['Sku']}) 

Enumerate是一個Python函數,它包裝一個序列或迭代器,就像一個列表一樣,並返回一個帶有值(index,list [index])的元組的迭代器。例如:

abc = ['a', 'b', 'c'] 
print list(enumerate(abc)) 
# Output: [(0, 'a'), (1, 'b'), (2, 'c')] 
+0

它不應該像'meta = {'title':item ['Sku'] + i}''而不是?否則,你在'set_filename'中改變標題鍵和'response.meta ['title'] [0]'(爲什麼'[0]')不起作用。 –

+0

@paultrmbrth,啊,我假定海報意思是get_media_requests函數中的'image_urls',但你可能是對的! – paep3nguin