2016-11-15 59 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