我正在开发一种scrapy蜘蛛,它成功地产生了一些物品。应使用pymysql将这些项插入数据库。因为数据是关系型的,所以我必须执行一些插入语句。
我想在每次插入完成后调用connection.commit()
,以确保发生的错误不会导致数据库中的条目不一致。
我目前想知道scrapy是否会将process_item
并行调用多个项目,或者依次调用一个项目。如果是后者,我可以简单地使用以下方法:
def process_item(self, item, spider):
# execute insert statements
connection.commit()
如果通过scrapy同时执行对process_item
的多次调用,则可以调用最后commit()
的调用,而另一项未完全插入。
documentation for item pipelines州:
在一个项目被蜘蛛抓取之后,它被发送到项目管道,该项目管道通过顺序执行的几个组件处理它。
但是我不太确定这是否意味着process_item
永远不会并行执行,或者只是不同的管道将一个接一个地执行(例如Dropping Duplicates - > Changing something - > DB插入)。
我认为process_item
将按顺序执行,因为文档显示了以下示例:
class DuplicatesPipeline(object):
def __init__(self):
self.ids_seen = set()
def process_item(self, item, spider):
if item['id'] in self.ids_seen:
raise DropItem("Duplicate item found: %s" % item)
else:
self.ids_seen.add(item['id'])
return item
在此代码中,没有用于将ID添加到ids_seen
的同步,但我不知道该示例是否已简化,因为它仅演示了如何使用管道。
答案 0 :(得分:1)
CONCURRENT_ITEMS设置的文档指定以并行方式处理项目(至少在单个响应中)。我认为将其设置为1
可能对您的情况有所帮助。
我在Scrapy的这一部分没有专家,但我相信this is where it happens。