Scrapy 刮削转换图像

Scrapy 刮削转换图像,scrapy,Scrapy,我用Scrapy来抓取一些图像,这些图像需要剪切部分或添加水印。我覆盖了pipelines.py中的函数convert\u image,但它不起作用。代码如下所示: class MyImagesPipeline(ImagesPipeline): def get_media_requests(self, item, info): for image_url in item['image_urls']: yield Request(image_url

我用Scrapy来抓取一些图像,这些图像需要剪切部分或添加水印。我覆盖了
pipelines.py
中的函数
convert\u image
,但它不起作用。代码如下所示:

class MyImagesPipeline(ImagesPipeline):

    def get_media_requests(self, item, info):
        for image_url in item['image_urls']:
            yield Request(image_url)
    
    def convert_image(self, image, size=None):
        if image.format == 'PNG' and image.mode == 'RGBA':
            background = Image.new('RGBA', image.size, (255, 255, 255))
            background.paste(image, image)
            image = background.convert('RGB')
        elif image.mode != 'RGB':
            image = image.convert('RGB')

        if size:
            image = image.copy()
            image.thumbnail(size, Image.ANTIALIAS)
        else:
            #  cut water image  TODO use defined image replace Not cut 
            x,y = image.size
            if(y>120):
                image = image.crop((0,0,x,y-25))
        
        buf = StringIO()
        try:
            image.save(buf, 'JPEG')
        except Exception, ex:
            raise ImageException("Cannot process image. Error: %s" % ex)

        return image, buf
有什么想法吗

更新:

@沃鲁克

你是怎么决定它不起作用的?有什么例外吗没有例外。我使用此代码重写函数项_completed。它工作正常,下面是代码:


ImagePipleline自动将图像转换为JPEG(RGB模式),并且不存在“切换器”。虽然您可以修改它的实现,但它可能会弄乱它的其他逻辑。因此,使用MediaPipeline更好——只需下载文件即可。
您可以编写另一个应用程序来对图像文件进行后处理。它让你的逻辑清晰,让scrapy更快

ImagePipleline自动将图像转换为JPEG(RGB模式),并且不存在“切换器”。虽然您可以修改它的实现,但它可能会弄乱它的其他逻辑。因此,使用MediaPipeline更好——只需下载文件即可。
您可以编写另一个应用程序来对图像文件进行后处理。它让你的逻辑清晰,让scrapy更快

你确定你的管道被调用了吗?您在设置中启用了吗?是的,我确定。图像已经下载。>我在pipelines.py中覆盖了convert_imag函数,但它不起作用。<你是怎么决定它不起作用的?有什么例外吗?>你是怎么决定它不起作用的?有什么例外吗对不起,我的英语。没有例外。我使用此代码重写函数项_已完成。下面是代码:你确定你的管道被调用了吗?您在设置中启用了吗?是的,我确定。图像已经下载。>我在pipelines.py中覆盖了convert_imag函数,但它不起作用。<你是怎么决定它不起作用的?有什么例外吗?>你是怎么决定它不起作用的?有什么例外吗对不起,我的英语。没有例外。我使用此代码重写函数项_已完成。代码如下:
def item_completed(self, results, item, info):
    image_paths = [x['path'] for ok, x in results if ok]
    if not image_paths:
        raise DropItem("Item contains no images")
    
    if item['refer'] == 'someurl.com' :
        for a in image_paths:
            o_img = os.path.join(self.store.basedir,a)

            if os.path.isfile(o_img):
                image = Image.open(o_img)
                x,y = image.size
                if(y>120):
                    image = image.crop((0,0,x,y-35))
                    image.save(o_img,'JPEG');
    
    return item