好的,我正在使用Scrapy和SQLAlchemy抓取数据并将其存储到SQLite数据库中。现在,一切正常,但是有些问题困扰着我,我找不到答案。
因此,在Pipelines内的process_item函数中,提交数据库的最佳方法是什么。大多数人似乎都这样做:
def process_item(self, item, spider):
"""
session = self.Session()
#Do some stuff
try:
session.add(ItemClass)
session.commit()
except:
session.rollback()
raise
finally:
session.close()
return item
我也看到了这个:
def close_spider(self, spider):
# We commit and save all items to DB when spider finished scraping.
try:
self.session.commit()
except:
self.session.rollback()
raise
finally:
self.session.close()
我的主要询问围绕方法1进行。看来每次获取会话,将单个项目提交给DB,然后关闭会话(对于每个单个项目)效率都不高。现在,第二种方法也使我感到困扰,因为它要等到抓取过程结束才能提交给数据库时,如果蜘蛛崩溃并且您丢失了所有被抓取的内容,这可能会导致问题。
是否在两者之间,我可以每n个项目提交一次?还是这无关紧要,因为现代数据库是如此强大,以至于它们不在乎短时间内的多次提交。这主要是关于优化提交过程,我可能对此考虑得过多。