我正在抓取的网站有多个相同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}$
你不能用管道这样做,因为它还在进行中。换句话说,它在不等待spider完成的情况下返回项目。在
但是,如果您有数据库,则可以解决此问题:
在semy伪代码中:
您仍然会在无用的输出中得到未经筛选的结果,但您的数据库将被排序。
个人建议使用基于文档的数据库,如
redis
。在开始之前你知道产品Id吗?如果是这样的话,那么正常的网站行为将允许你搜索价格低>;高,这样你就可以为每个产品Id获取返回的第一个项目,从而避免任何管道处理的需要。在
如果你没有,那么你可以做一个两步的过程,首先搜索所有的产品以获得Id,然后对每个Id执行上面的过程
相关问题 更多 >
编程相关推荐