zoukankan      html  css  js  c++  java
  • Scrapy基础(十二)————异步导出Item数据到Mysql中

      异步导出数据到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中

    2:
    还有导入import MySQLdb.cursors

     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就完成了
    展示结果:


  • 相关阅读:
    JavaWeb的一些理解
    phpMysql安装遇到的两个问题
    正则表达式学习1
    《SOA思想、技术与系统集成应用详解》读书笔记四《SOA核心技术及应用》Apache Tuscany sca安装及与eclipse结合
    19本书,选5本,任两本不邻粗解
    J2ME中处理日期相关问题
    《JSP2.0 技术手册》读书笔记二HttpSession
    《SOA思想、技术与系统集成应用详解》读书笔记三SCA
    《SOA思想、技术与系统集成应用详解》读书笔记一
    《SOA思想、技术与系统集成应用详解》读书笔记二Java Web服务
  • 原文地址:https://www.cnblogs.com/ruoniao/p/6906344.html
Copyright © 2011-2022 走看看