Scrapy Pipeline未筛选重复项

bz4sfanl  于 2023-03-30  发布在  其他
关注(0)|答案(1)|浏览(187)

我有一个运行在Scrapy框架上的web scraper,它可以刮取产品数据。有一个管道设置,应该过滤掉重复的skus/产品,但在完整运行后,我可以看到它没有过滤掉它们。我有很多重复。
以下是我建立的管道:

ITEM_PIPELINES = {
    "pure_scraper.pipelines.DuplicateSkuPipeline": 300,
    "pure_scraper.pipelines.FieldValidatorPipeline": 400,
    "scrapy.pipelines.images.ImagesPipeline": 500,
}

第一个项目管道过滤重复的sku,第二个确保项目具有必需的字段,第三个下载产品图像。
以下是我的Duplicate Sku Pipeline的代码:

class DuplicateSkuPipeline:
    def __init__(self):
        self.skus = set()

    def process_item(self, item, spider):
        adapter = ItemAdapter(item)
        sku = adapter.get("sku")
        if sku in self.skus:
            raise DropItem(f"Duplicate sku found: {sku}")
        else:
            self.skus.add(sku)
            return item

    def close_spider(self, spider):
        spider.logger.info(f"Found {len(self.skus)} unique skus")

我在调试模式下运行过特定的产品,当我一次运行1个产品时,它似乎可以工作。但是当我端到端运行它时,就会出现重复。我应该将这些SKU存储在数据库表中,而不是类中的集合中吗?

6psbrbz9

6psbrbz91#

在Scrapy文档中的“* 启用您的媒体管道 *”中,它说:
若要启用媒体管道,必须首先将其添加到项目ITEM_PIPELINES设置中。
对于图像管道,请用途:
ITEM_PIPELINES = {'scrapy.pipelines.images.ImagesPipeline': 1}
因此,我更改了settings.py中的ITEM_PIPELINES设置,使ImagesPipeline成为第一个管道:

ITEM_PIPELINES = {
    "scrapy.pipelines.images.ImagesPipeline": 1,
    "pure_scraper.pipelines.FieldValidatorPipeline": 300,
    "pure_scraper.pipelines.DuplicateSkuPipeline": 400
}

这修复了我的问题。如果你的管道有问题,并且你使用了ImagesPipline,请确保它设置为1。

相关问题