【发布时间】:2014-05-14 19:27:07
【问题描述】:
我一直在使用 Scrapy,但遇到了一些问题。
DjangoItem 有一个 save 方法来使用 Django ORM 持久化项目。这很好,除了如果我多次运行刮板,即使我可能只想更新以前的值,也会在数据库中创建新项目。
查看文档和源代码后,我没有看到任何更新现有项目的方法。
我知道我可以调用 ORM 以查看项目是否存在并更新它,但这意味着为每个对象调用数据库,然后再次保存项目。
如果项目已经存在,我该如何更新它们?
【问题讨论】:
-
如果您的应用程序需要检查是否存在重复对象,则必须检查已创建的对象。如果您的数据库结构可以支持唯一列,则可以尝试写入,然后如果针对唯一键存在完整性错误,则可以更新
-
如果没有其他人写入您的数据库,您可以在启动时查询数据库(例如在您的蜘蛛的
__init__中或在某些中间件中捕获spider_opened)并保留 ID 列表或表示您的数据库项目的元组列表。然后,当您有要保存或更新的项目时,您检查列表以了解要执行的操作 -
paultrmbrth:听起来可能会奏效。我一直在查看this bit 检测管道中的重复项,但不幸的是它只涵盖了当前抓取中的重复项。 dm03514:这也可以,但接下来的挑战是查询数据库中的重复项。
-
我只是想学习如何去做,即。如何在某个时间间隔再次运行蜘蛛并决定我应该插入还是更新。但是当我在这里阅读前面的内容时,我想我会在数据库中添加一个字段以获取一些 md5 哈希。然后对于报废的行,我将其值分为 2 类:关键和非关键。从关键值中,我将计算 md5 并决定是否更新现有行或是否必须/可以插入新行(然后删除不受影响的行)。