通过物料管道提交数据库的最佳方法?

时间:2019-05-09 14:32:15

标签: sqlalchemy scrapy

好的,我正在使用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个项目提交一次?还是这无关紧要,因为现代数据库是如此强大,以至于它们不在乎短时间内的多次提交。这主要是关于优化提交过程,我可能对此考虑得过多。

1 个答案:

答案 0 :(得分:0)

方法1是可行的方法。 Sessions应该不那么贵。

或者,不要使用SQL Alchemy,或仅使用SQL Alchemy Core代替ORM。