我怎样才能让最低价的商品不被刮伤?

2024-04-24 23:59:03 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在抓取的网站有多个相同ID但价格不同的产品。我只想保留最低价的版本。在

from scrapy.exceptions import DropItem

class DuplicatesPipeline(object):

    def __init__(self):
        self.ids_seen = dict()

    def process_item(self, item, spider):
        if item['ID'] in self.ids_seen:
            if item['sale_price']>self.ids_seen[item['ID']]:
                raise DropItem("Duplicate item found: %s" % item)
        else:
            self.ids_seen.add(item['ID'])
            return item

所以这个代码应该删除那些比以前看到的价格更高的项目,但是如果价格较低,我不知道如何更新以前刮到的项目。在

^{pr2}$

Tags: 项目fromself版本ididsif产品
2条回答

你不能用管道这样做,因为它还在进行中。换句话说,它在不等待spider完成的情况下返回项目。在

但是,如果您有数据库,则可以解决此问题:

在semy伪代码中:

class DbPipeline(object):

    def __init__(self):
        self.connection = # connect to your database

    def process_item(self, item, spider):
        db_item = self.connection.get(item['ID'])
        if item['price'] < db_item['price']:
            self.connection.remove(item['ID'])
            self.connection.add(item)
        return item

您仍然会在无用的输出中得到未经筛选的结果,但您的数据库将被排序。
个人建议使用基于文档的数据库,如redis。在

开始之前你知道产品Id吗?如果是这样的话,那么正常的网站行为将允许你搜索价格低>;高,这样你就可以为每个产品Id获取返回的第一个项目,从而避免任何管道处理的需要。在

如果你没有,那么你可以做一个两步的过程,首先搜索所有的产品以获得Id,然后对每个Id执行上面的过程

相关问题 更多 >