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就完成了;
展示结果:不知道为什么,感觉异步写入比同步写入稍微慢点(相同电脑和网速条件下),还请明白的大神指点下

时间: 2024-10-27 04:50:18

Scrapy基础(十二)————异步导出Item数据到Mysql中的相关文章

Java基础十二--多态是成员的特点

Java基础十二--多态是成员的特点 一.特点 1,成员变量. 编译和运行都参考等号的左边. 覆盖只发生在函数上,和变量没关系. Fu f = new Zi();System.out.println(f.num);//是父类,答案是3 2,成员函数(非静态). 编译看左边,运行看右边. 因为成员函数存在覆盖特性. Fu f = new Zi();//f.show();输出的是子类里面的show方法 3,静态函数. 编译和运行都看左边. 静态函数不具备多态性,多态性是对象的多态性,然后静态函数不涉

Bootstrap <基础十二>下拉菜单(Dropdowns)

Bootstrap 下拉菜单.下拉菜单是可切换的,是以列表格式显示链接的上下文菜单.这可以通过与 下拉菜单(Dropdown) JavaScript 插件 的互动来实现. 如需使用下列菜单,只需要在 class .dropdown 内加上下拉菜单即可.下面的实例演示了基本的下拉菜单: <!DOCTYPE html> <html> <head> <title>Bootstrap 实例 - 下拉菜单(Dropdowns)</title> <li

VLAN基础(二)在GNS3 1.3.10中使用Trunk完成跨交换机的VLAN通信

VLAN基础(二)在GNS3 1.3.10中使用Trunk完成跨交换机的VLAN通信 简介: Trunk在网络用语中一般译为:"主干线.中继线.长途线" ,不过一般不用译意,直接使用英文.在路由/交换网络中,trunk通常被称为"中继(透传)".在语音级应用的线路中,trunk一般指"主干网络.电话干线",即两个交换局或交换机之间的连接电路或信道,它为两端设备之间进行转接,作为信令和终端设备数据的传输链路. 实际操作:1.添加好所需设备,并对两个

关于使用sqoop export 导出hdfs数据到mysql中文乱码问题

前几天使用sqoop将hdfs的数据导入mysql中,发现中文导进去后会乱码,我的执行命令是: sqoop export  --connect "jdbc:mysql://10.19.157.*****?useUnicode=true&characterEncoding=utf-8" --table msg_rule_copy --username root --password root*** --export-dir $path --hadoop-home $home --

解决hibernate保存数据到mysql中出现乱码问题

今天使用hibernate保存数据到mysql中,发现出现乱码问题,经过检查,发现接收到的是正确中文,说明客户端浏览器将中文编码发送到服务器过程中无乱码问题,后来查找资料: 首先要告诉数据库要插入的字符串的字符集,mysql 默认使用的字符集是 latin1.我要保存的字符串是 UTF-8 编码的(字符集是 Unicode),所以包含这个字段的表应该使用 UTF-8 编码. 这里有几种解决办法. 1.在建立数据库的时候指定数据库的字符集编码,这样,这个数据库的所有表都会默认使用数据库的字符集编码

python爬取微博图片数据存到Mysql中遇到的各种坑\python Mysql存储图片

本人长期出售超大量微博数据,并提供特定微博数据打包,Message to [email protected] 前言   由于硬件等各种原因需要把大概170多万2t左右的微博图片数据存到Mysql中.之前存微博数据一直用的非关系型数据库mongodb,由于对Mysql的各种不熟悉,踩了无数坑,来来回回改了3天才完成. 挖坑填坑之旅 建表 存数据的时候首先需要设计数据库,我准备设计了3个表 微博表:[id, userid, blog_text, lat, lng, created_time, res

Android 基础 十二 Bitmap的加载和Cache

本章的主题是Bitmap的加载和Cache,主要包含三个方面的内容.首先讲述如何有效地加载一个Bitmap,这是一个很有意义的话题,由于Bitmap的特殊性以及Android对单个应用所施加的内存限制,比如16MB,这导致Bitmap加载的时候很容易出现内存溢出.下面这个异常信息在开发中应该经常遇到: 因此如何高效的加载Bitmap是一个很重要也很容易被开发者或忽视的问题. 接着介绍Android中常用的缓存策略,缓存策略是一种通用的思想,可以用在很多场景中,但是实际开发中经常需要用Bitmap

Oracle数据转移Mysql中遇到的问题以及解决办法

前几天因工作需要我得将Oracle数据库中几十张表转移到Mysql中,由于之前没有相关经验,上网简单百度后选用Navcat Premium软件工作. Navcat Premium进行数据转移有三种办法:1.复制表  2.导出.导入数据  3.导出成sql脚本,执行. 一开始使用复制表的方法,打开菜单栏"工具"的数据传输功能,左边选择要复制的表,右边选择连接然后选中目标数据库,接下在就是next by next的一键式操作.这个方法真的很方便,但是bug也很多,最大的bug是数值类型不匹

pandas,读取或存储DataFrames的数据到mysql中

dataFrames格式的数据是表格形式的,mysql数据库中的数据也是表格形式的,二者可以很方便的读取存储 安装依赖的包 pip install pandas pip install sqlalchemy pip install pymysql 使用方法  第一步:建立mysql数据库的连接 connect_info = 'mysql+pymysql://{}:{}@{}:{}/{}?charset=utf8'.format("username", "password&qu