Конвейер изображений Scrapy: как поместить изображение на контрольную сумму? - PullRequest
0 голосов
/ 01 апреля 2019

Я очищаю некоторые изображения, используя конвейер изображений scrapy, и хочу удалить изображения из импорта, которые соответствуют определенному хешу.

класс MyImagesPipeline (ImagesPipeline):

def get_media_requests(self, item, info):
    for image_url in item['image_urls']:
        yield scrapy.Request(image_url)

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")
    item['image_paths'] = image_paths
    return item


item['images']     =  response.xpath('//meta[@property="og:image"][not(contains(@content, "Demo_600x600"))]/@content').extract()[0:self.max_pix]

Изображения:

url "https://www.example.de…212-B726-757P-A20D-1.jpg"
path    "full/56de72acb6c1e12ffa8644c1bb96df4edf421438.jpg"
checksum    "e206446c40c22cfd5f94966c337b56cc"

Как я могу убедиться, что это изображение будет исключено из импорта?

1 Ответ

1 голос
/ 11 апреля 2019

Вы можете попробовать переопределить метод get_images из imagepipeline.Изображение не будет загружено, если хеш совпадает.

    import logging
    from io import BytesIO
    from scrapy.utils.misc import md5sum

    logger = logging.getLogger(__name__)

    def get_images(self, response, request, info):
        checksum = md5sum(BytesIO(response.body))
        drop_list = ['hash1', 'hash2']
        logger.debug('Verifying Checksum: {}'.format(checksum))
        if checksum in drop_list:
            logger.debug('Skipping Checksum: {}'.format(checksum))
            raise Exception('Dropping Image')

        return super(MyImagesPipeline,self).get_images(response, request, info)
...