使用scrapy的缓冲管道

Doo*_*oon 2 python scrapy

我目前正在使用Scrapy 0.24废弃一个网站.该网站具有以下网址格式:

www.site.com?category={0}&item={1}&page={2}
Run Code Online (Sandbox Code Playgroud)

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

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

Art*_*par 8

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

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()
Run Code Online (Sandbox Code Playgroud)

  • 我现在感到惭愧.我怎么能想到呢? (3认同)
  • @BenWilson 这就是为什么它也插入 `close_spider` 事件。 (2认同)