首页 > 解决方案 > 通过项目管道提交数据库的最佳方式?

问题描述

好吧,我正在使用 Scrapy 和 SQLAlchemy 来抓取数据并将其存储到 SQLite DB 中。现在,一切工作正常,但有些东西让我烦恼,我找不到答案。

因此,在 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。每次获取会话,将单个项目提交到数据库,然后为每个项目关闭会话似乎效率低下。现在第二种方法也困扰着我,因为它等到抓取过程结束后再提交到数据库,如果蜘蛛崩溃并且你丢失了所有被抓取的东西,这可能会导致问题。

中间有没有,我可以提交每 n 个项目吗?或者这无关紧要,因为现代数据库是如此强大,以至于它们不关心短时间内的多次提交。这主要是关于优化提交过程,我可能想多了。

标签: sqlalchemyscrapy

解决方案


方法1是要走的路。会话不应该那么昂贵。

或者,不要使用 SQL Alchemy,或者只使用SQL Alchemy Core而不是 ORM。


推荐阅读