使用 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.Item
s,这给我们数据库中的 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()
我目前正在使用 Scrapy 0.24 删除一个网站。该网站具有以下 url 格式:
www.site.com?category={0}&item={1}&page={2}
我有一个 MySQLStorePipeline
负责将每个报废的项目存储在数据库中。但是我有 80 个类别、10 个项目和 15 个页面,结果是 80 * 10 * 15 = 120000
个页面。每个页面我产生 25 scrapy.Item
s,这给我们数据库中的 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()