2017-08-02 87 views
1

我正在开发scrapy蜘蛛,它正在成功生成一些项目。这些项目应该使用pymysql插入到数据库中。因为数据是关系型的,所以我必须执行一些插入语句。 我想在每次整个插入之后调用connection.commit()以确保发生错误不会导致数据库中的不一致条目。Scrapy项目流水线并行或顺序执行process_item

我目前想知道scrapy是否会为多个项目并行调用process_item,或者为一个接一个项目顺序调用。如果是后者的话,我可以简单地用下面的办法:

def process_item(self, item, spider): 
    # execute insert statements 
    connection.commit() 

如果不止一个呼叫process_item在由scrapy同时执行,在月底commit()呼叫可以被称为而另一项目未完全插入。

documentation for item pipelines状态:

后的物品已被蜘蛛刮下,它被发送到项目管道,其处理它通过依次执行几个组件。

但我不能肯定这是否意味着process_item绝不会并行执行,或丢弃重复只是不同的管道将总是一个接一个执行(例如 - >更改的东西 - > 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

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

我不是这方面Scrapy的专家,但我相信this is where it happens

+0

谢谢,不知何故,我没有看到这个选项! – Alex