,,,,,,,,,,
一般将数据保存到MySQL中有两种方式,同步模式和异步模式。
同步模式是采用SQL语句,将数据插入到数据库中。但是要注意的是Scrapy的解析速度要远大于MySQL的入库速度,当有大量解析的时候,MySQL的入库就可能会阻塞。
进口MySQLdbclass MysqlPipeline(对象): def __init__(自我): 自我。康涅狄格州=MySQLdb.connect(& # 39; 127.0.0.1 # 39; & # 39;根# 39;,& # 39;根# 39;,& # 39;article_spider& # 39;, charset=皍tf8", use_unicode=True) 自我。光标=self.conn.cursor () def process_item(自我,物品,蜘蛛): insert_sql=?”;“ 插入jobbole_article(标题、create_date url, url_object_id)值(% s, % s % s, % s) “““ self.cursor.execute (insert_sql,(项目(“title")项目(“create_date")项目(“url")项目(“url_object_id"))) self.conn.commit ()
采用同步模式可能会产生阻塞,我们可以使用扭曲将MySQL的入库和解析变成异步操作,而不是简单的执行,提交同步操作。
关于MySQL的配置,我们可以直接在配置文件配置数据库:
MYSQL_HOST=?27.0.0.1" MYSQL_DBNAME=癮rticle_spider" MYSQL_USER=皉oot" MYSQL_PASSWORD=皉oot"
在设置中的配置,我们通过在管道中定义from_settings获取设置对象,可以直接获取设置配置文件中的值。
使用扭曲提供的异步容器连接MySQL:
进口MySQLdb 进口MySQLdb。cursorsfrom twisted.enterprise 进口adbapi
使用adbapi可以使mysqldb的一些操作变成异步化的操作
使用游标进行sql语句的执行和提交
代码部分:
类MysqlTwistedPipline(对象): def __init__(自我,dbpool): 自我。dbpool=dbpool @classmethod def from_settings (cls、设置): dbparms=dict ( 主机=设置(“MYSQL_HOST"), db=设置(“MYSQL_DBNAME"), 用户=设置(“MYSQL_USER"), passwd=设置(“MYSQL_PASSWORD"), charset=& # 39; use utf8 # 39; cursorclass=MySQLdb.cursors.DictCursor, use_unicode=True, ) dbpool=adbapi.ConnectionPool (“MySQLdb", * * dbparms)返回cls (dbpool) def process_item(自我,物品,蜘蛛): #使用扭曲将mysql插入变成异步执行 # runInteraction可以将传入的函数变成异步的 查询=self.dbpool.runInteraction (self.do_insert项)#处理异常 query.addErrback (self.handle_error,项,蜘蛛)def handle_error(自我,失败,项目,蜘蛛): #处理异步插入的异常 打印(失败)def do_insert(自我、光标、项目): #会从dbpool取出游标 #执行具体的插入 insert_sql=?”;“ 插入jobbole_article(标题、create_date url, url_object_id)值(% s, % s % s, % s) “““ 游标。执行(insert_sql,(项目(“title")项目(“create_date")项目(“url")项目(“url_object_id"))) #拿传进的光标进行执行,并且自动完成提交操作
以上代码部分,除了do_insert之外,其它均可复用。