Python 使用scrapy的缓冲管道

Python 使用scrapy的缓冲管道,python,scrapy,Python,Scrapy,我目前正在使用一个废弃的网站。该网站具有以下url格式: www.site.com?category={0}&item={1}&page={2} 我有一个MySQLStorePipeline,负责将每个报废项目存储在数据库中。但我有80个类别,10个项目和15页,结果是80*10*15=120000页。每一页I产生25个scrapy.Items,这给了我们数据库中的25*120000=3000000行 因此,每次管道接收到一个项目时,它都会插入到数据库中。这不是一个聪明的方法。

我目前正在使用一个废弃的网站。该网站具有以下url格式:

www.site.com?category={0}&item={1}&page={2}
我有一个
MySQLStorePipeline
,负责将每个报废项目存储在数据库中。但我有80个类别,10个项目和15页,结果是
80*10*15=120000
页。每一页I产生25个
scrapy.Item
s,这给了我们数据库中的
25*120000=3000000


因此,每次管道接收到一个项目时,它都会插入到数据库中。这不是一个聪明的方法。我正在寻找一种缓冲管道项目的方法,例如,当我们收到1000个项目时,执行批量插入。如何实现这一点?

让管道将项目存储在列表中,并在达到一定长度时插入它们,然后在spider关闭时插入

class Pipeline(object):
    def __init__(self):
        super(Pipeline, self).__init__()
        self.items = []

    def process_item(self, item, spider):
        self.items.append(item)
        if len(self.items) >= 1000:
            self.insert_current_items()
        return item

    def insert_current_items(self):
        items = self.items
        self.items = []
        self.insert_to_database(items)

    def close_spider(self, spider):
        self.insert_current_items()

你已经用蜘蛛关闭信号分析过场景了吗?@aberna还没有。你有什么建议吗?@aberna根据消息,我无法接触到这个信号中的废弃物品。只有蜘蛛本身和蜘蛛被关闭的原因。在这里,一些人提出了一种方法。当你拦截蜘蛛信号时,你可以跟踪你的物品并一起处理它们。我现在感到惭愧。我怎么能不去想呢?@Doon我也有同感:D我想我们在寻找某种内置的“支持”(因此更好,咳嗽)方式。很好的解决方案。唯一的问题——当一批产品少于1000件时会发生什么?其余的记录不会被插入。@BenWilson这就是为什么它也会在
close\u spider
事件中插入。