时间:2021-07-01 10:21:17 帮助过:30人阅读
1 from twisted.enterprise import adbapi 2 class MysqlTwistedPipeline(object): 3 ‘‘‘ 4 异步机制将数据写入到mysql数据库中 5 ‘‘‘ 6 #创建初始化函数,当通过此类创建对象时首先被调用的方法 7 def __init__(self,dbpool): 8 self.dbpool = dbpool 9 #创建一个静态方法,静态方法的加载内存优先级高于init方法,java的static方法类似, 10 #在创建这个类的对之前就已将加载到了内存中,所以init这个方法可以调用这个方法产生的对象 11 @classmethod 12 #名称固定的 13 def from_settings(cls,settings): 14 #先将setting中连接数据库所需内容取出,构造一个地点 15 dbparms = dict( 16 host= settings["MYSQL_HOST"], 17 db = settings["MYSQL_DBNAME"], 18 user = settings["MYSQL_USER"], 19 passwd = settings["MYSQL_PASSWORD"], 20 charset = "utf-8", 21 #游标设置 22 cursorclass = Mysqldb.cursors.DictCursor, 23 #设置编码是否使用Unicode 24 use_unicode = True 25 ) 26 #通过Twisted框架提供的容器连接数据库,MySQLdb是数据库模块名 27 dbpool = adbapi.ConnectionPool("MySQLdb",dbparms) 28 return cls(dbpool) 29 30 def process_item(self,item,spider): 31 #使用Twisted异步的将Item数据插入数据库 32 query = self.dbpool.runInteraction(self.do_insert,item) 33 query.addErrback(self.handle_error,item,spider)#这里不往下传入item,spider,handle_error则不需接受,item,spider) 34 35 def do_insert(self,cursor,item): 36 #执行具体的插入语句,不需要commit操作,Twisted会自动进行 37 insert_sql = """ 38 insert into jobbole_artical(title,creat_date,url,url_object_id, 39 front_image_url2,front_image_path,tags,comment_num, 40 fav_num,like_num,content 41 ) 42 VALUES(%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s) 43 """ 44 cursor.execute(insert_sql,(item["title"],item["creat_date"],item["url"], 45 item["url_object_id"],item["front_image_url2"],item["front_image_path"], 46 item["tags"],item["comment_num"],item["fav_num"],item["like_num"],item["content"])) 47 48 def handle_error(self, failure, item, spider): 49 #出来异步插入异常 50 print(failure)
3:注册settings中:
至此,异步将Item的数据写入Mysql就完成了;
展示结果:不知道为什么,感觉异步写入比同步写入稍微慢点(相同电脑和网速条件下),还请明白的大神指点下
Scrapy基础(十二)————异步导出Item数据到Mysql中
标签:enter mysql rbac unicode 编码 com 创建对象 date turn