我有一个运行在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存储在数据库表中,而不是类中的集合中吗?
1条答案
按热度按时间6psbrbz91#
在Scrapy文档中的“* 启用您的媒体管道 *”中,它说:
若要启用媒体管道,必须首先将其添加到项目ITEM_PIPELINES设置中。
对于图像管道,请用途:
ITEM_PIPELINES = {'scrapy.pipelines.images.ImagesPipeline': 1}
因此,我更改了
settings.py
中的ITEM_PIPELINES设置,使ImagesPipeline
成为第一个管道:这修复了我的问题。如果你的管道有问题,并且你使用了ImagesPipline,请确保它设置为1。