Scrapy基础(十二)————异步导出Item数据到Mysql中

Scrapy基础(十二)————异步导出Item数据到Mysql中


 上次说过从Item中同步写入数据库,因为网络的下载速度和数据库的I/O速度是不一样的

所以有可能会发生下载快,但是写入数据库速度慢,造成线程的堵塞;

关于堵塞和非堵塞,同步和异步

的关系,因为没接触过,所以也不是很好的理解,这里查看了些资料,已做记录 

链接1:https://www.zhihu.com/question/19732473;

http://wiki.jikexueyuan.com/project/twisted-intro/


实现异步写入mysql数据库的思路:    

1,将数据库的连接数据写入到settings文件中,供后面自定义的pipeline使用

2,自定义pipeline,使用Twisted框架实现异步

3,在settings中注册这个管道

具体代码实现:

1:settings中设置;前提是数据库已经设计好了,参考同步机制写入Mysql中

Scrapy基础(十二)————异步导出Item数据到Mysql中_第1张图片
Scrapy基础(十二)————异步导出Item数据到Mysql中_第2张图片

2:

还有导入import MySQLdb.cursors

from twisted.enterprise import adbapi

class MysqlTwistedPipeline(object):

'''

异步机制将数据写入到mysql数据库中

'''

#创建初始化函数,当通过此类创建对象时首先被调用的方法

def __init__(self,dbpool):

self.dbpool = dbpool

#创建一个静态方法,静态方法的加载内存优先级高于init方法,java的static方法类似,

#在创建这个类的对之前就已将加载到了内存中,所以init这个方法可以调用这个方法产生的对象

@classmethod

#名称固定的

def from_settings(cls,settings):

#先将setting中连接数据库所需内容取出,构造一个地点

dbparms = dict(

host= settings["MYSQL_HOST"],

db = settings["MYSQL_DBNAME"],

user = settings["MYSQL_USER"],

passwd = settings["MYSQL_PASSWORD"],

charset = "utf-8",

#游标设置

cursorclass = Mysqldb.cursors.DictCursor,

#设置编码是否使用Unicode

use_unicode = True

)

#通过Twisted框架提供的容器连接数据库,MySQLdb是数据库模块名

dbpool = adbapi.ConnectionPool("MySQLdb",dbparms)

return cls(dbpool)

def process_item(self,item,spider):

#使用Twisted异步的将Item数据插入数据库

query = self.dbpool.runInteraction(self.do_insert,item)

query.addErrback(self.handle_error,item,spider)#这里不往下传入item,spider,handle_error则不需接受,item,spider)

def do_insert(self,cursor,item):

#执行具体的插入语句,不需要commit操作,Twisted会自动进行

insert_sql = """

insert into jobbole_artical(title,creat_date,url,url_object_id,

front_image_url2,front_image_path,tags,comment_num,

fav_num,like_num,content

)

VALUES(%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)

"""

cursor.execute(insert_sql,(item["title"],item["creat_date"],item["url"],

item["url_object_id"],item["front_image_url2"],item["front_image_path"],

item["tags"],item["comment_num"],item["fav_num"],item["like_num"],item["content"]))

def handle_error(self, failure, item, spider):

#出来异步插入异常

print(failure)

3:注册settings中:

Scrapy基础(十二)————异步导出Item数据到Mysql中_第3张图片
Scrapy基础(十二)————异步导出Item数据到Mysql中_第4张图片

至此,异步将Item的数据写入Mysql就完成了

你可能感兴趣的:(Scrapy基础(十二)————异步导出Item数据到Mysql中)