2017-03-06 127 views
5

我有一个Scrapy中的网页抓取工具,可以获取数据项。我想异步地将它们插入到数据库中。无阻塞Scrapy管道到数据库

例如,我有一些插入项目到我的数据库使用SQLAlchemy的核心事务:

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

我的理解,它可能与扭曲的异步使用SQLAlchemy核心与alchimia。下面是alchimia的文档代码示例。

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

我可以这样做吗?

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

如何写入反应器部件?

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


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

from alchimia import TWISTED_STRATEGY 

from sqlalchemy import (
    create_engine, MetaData, Table, Column, Integer, String 
) 
from sqlalchemy.schema import CreateTable 

from twisted.internet.defer import inlineCallbacks 
from twisted.internet.task import react 


@inlineCallbacks 
def main(reactor): 
    engine = create_engine(
     "sqlite://", reactor=reactor, strategy=TWISTED_STRATEGY 
    ) 

    metadata = MetaData() 
    users = Table("users", metadata, 
     Column("id", Integer(), primary_key=True), 
     Column("name", String()), 
    ) 

    # Create the table 
    yield engine.execute(CreateTable(users)) 

    # Insert some users 
    yield engine.execute(users.insert().values(name="Jeremy Goodwin")) 
    yield engine.execute(users.insert().values(name="Natalie Hurley")) 
    yield engine.execute(users.insert().values(name="Dan Rydell")) 
    yield engine.execute(users.insert().values(name="Casey McCall")) 
    yield engine.execute(users.insert().values(name="Dana Whitaker")) 

    result = yield engine.execute(users.select(users.c.name.startswith("D"))) 
    d_users = yield result.fetchall() 
    # Print out the users 
    for user in d_users: 
     print "Username: %s" % user[users.c.name] 

if __name__ == "__main__": 
    react(main, []) 

回答