python – 非阻塞Scrapy管道到数据库

前端之家收集整理的这篇文章主要介绍了python – 非阻塞Scrapy管道到数据库前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

我在Scrapy中有一个Web抓取器,可以获取数据项.我想异步地将它们插入到数据库中.

例如,我有一个事务,使用sqlAlchemy Core将一些项目插入到我的数据库中:

  1. def process_item(self,item,spider):
  2. with self.connection.begin() as conn:
  3. conn.execute(insert(table1).values(item['part1'])
  4. conn.execute(insert(table2).values(item['part2'])

我知道可以与Twisted with alchimia异步使用sqlAlchemy Core.alchimia的文档代码示例如下.

我不明白的是如何在alchimia框架中使用我的上述代码.如何设置process_item以使用反应器?

我可以这样做吗?

  1. @inlineCallbacks
  2. def process_item(self,spider):
  3. with self.connection.begin() as conn:
  4. yield conn.execute(insert(table1).values(item['part1'])
  5. yield conn.execute(insert(table2).values(item['part2'])

我怎么写反应堆部分?

或者是否有更简单的方法在Scrapy管道中进行非阻塞数据库插入?

供参考,以下是alchimia文档中的代码示例:

  1. from alchimia import TWISTED_STRATEGY
  2. from sqlalchemy import (
  3. create_engine,MetaData,Table,Column,Integer,String
  4. )
  5. from sqlalchemy.schema import CreateTable
  6. from twisted.internet.defer import inlineCallbacks
  7. from twisted.internet.task import react
  8. @inlineCallbacks
  9. def main(reactor):
  10. engine = create_engine(
  11. "sqlite://",reactor=reactor,strategy=TWISTED_STRATEGY
  12. )
  13. Metadata = MetaData()
  14. users = Table("users",Metadata,Column("id",Integer(),primary_key=True),Column("name",String()),)
  15. # Create the table
  16. yield engine.execute(CreateTable(users))
  17. # Insert some users
  18. yield engine.execute(users.insert().values(name="Jeremy Goodwin"))
  19. yield engine.execute(users.insert().values(name="Natalie Hurley"))
  20. yield engine.execute(users.insert().values(name="Dan Rydell"))
  21. yield engine.execute(users.insert().values(name="Casey McCall"))
  22. yield engine.execute(users.insert().values(name="Dana Whitaker"))
  23. result = yield engine.execute(users.select(users.c.name.startswith("D")))
  24. d_users = yield result.fetchall()
  25. # Print out the users
  26. for user in d_users:
  27. print "Username: %s" % user[users.c.name]
  28. if __name__ == "__main__":
  29. react(main,[])
最佳答案

How can I set up process_item to use a reactor?

您无需在管道中管理另一个反应堆.
相反,您可以通过从管道返回延迟来在项目管道中执行异步数据库交互.

另见Scrapy’s docsample code doing asynchronous operations within an item pipeline by returning a deferred.

猜你在找的Python相关文章