Scrapy项目管道并行或顺序执行process_item

时间:2017-08-02 12:50:09

标签: python scrapy

我正在开发一种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的同步,但我不知道该示例是否已简化,因为它仅演示了如何使用管道。

1 个答案:

答案 0 :(得分:1)

CONCURRENT_ITEMS设置的文档指定以并行方式处理项目(至少在单个响应中)。我认为将其设置为1可能对您的情况有所帮助。

我在Scrapy的这一部分没有专家,但我相信this is where it happens