使用 scrapy 的缓冲管道

Buffered pipeline using scrapy

我目前正在使用 Scrapy 0.24 删除一个网站。该网站具有以下 url 格式:

www.site.com?category={0}&item={1}&page={2}

我有一个 MySQLStorePipeline 负责将每个报废的项目存储在数据库中。但是我有 80 个类别、10 个项目和 15 个页面,结果是 80 * 10 * 15 = 120000 个页面。每个页面我产生 25 scrapy.Items,这给我们数据库中的 25 * 120000 = 3000000 行。

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

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

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()