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

 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中:

至此,异步将Item的数据写入Mysql就完成了
展示结果:

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

  1. Scrapy基础(十)———同步机制将Item中的数据写在Mysql

      前面讲解到将Item中的所有字段都已经填写完成,那么接下来就是将他们存储到mysql数据库中,那就用到了pipeline项目管道了:  对项目管道的理解:做一个比喻,爬取好比是开采石油,Item装 ...

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

    Bootstrap 下拉菜单.下拉菜单是可切换的,是以列表格式显示链接的上下文菜单.这可以通过与 下拉菜单(Dropdown) JavaScript 插件 的互动来实现. 如需使用下列菜单,只需要在 ...

  3. 【mongodb系统学习之十二】mongodb修改数据(一)

    十二.mongodb修改数据:update 1).修改数据库数据:update:语法 db.collectionName.update({},{},boolean,boolean): 2).updat ...

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

    Java基础十二--多态是成员的特点 一.特点 1,成员变量. 编译和运行都参考等号的左边. 覆盖只发生在函数上,和变量没关系. Fu f = new Zi();System.out.println( ...

  5. Hive扩展功能(三)--使用UDF函数将Hive中的数据插入MySQL中

    软件环境: linux系统: CentOS6.7 Hadoop版本: 2.6.5 zookeeper版本: 3.4.8 主机配置: 一共m1, m2, m3这五部机, 每部主机的用户名都为centos ...

  6. flink04 -----1 kafkaSource 2. kafkaSource的偏移量的存储位置 3 将kafka中的数据写入redis中去 4 将kafka中的数据写入mysql中去

    1. kafkaSource 见官方文档 2. kafkaSource的偏移量的存储位置 默认存在kafka的特殊topic中,但也可以设置参数让其不存在kafka的特殊topic中   3   将k ...

  7. 玩转Django2.0---Django笔记建站基础十(二)(常用的Web应用程序)

    10.3 CSRF防护 CSRF(跨站请求伪造)也成为One Click Attack或者Session Riding,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用,窃取网站的用户信息来制作 ...

  8. 玩转Django2.0---Django笔记建站基础十二(Django项目上线部署)

    第十二章 Django项目上线部署 目前部署Django项目有两种主流方案:Nginx+uWsGI+Django或者Apache+uWSGI+Django.Nginx作为服务器最前端,负责接收浏览器的 ...

  9. 十二、导出python脚本

    一.为什么要导出? 导出成多语言脚本,方便二次开发 使用其他语言的test runner 使用自己最熟悉的语言做接口自动化测试 二.导出成python脚本 演示 导出成python的requesy脚本 ...

随机推荐

  1. python 装饰器(1)

    # 装饰器,对一个函数打扮 # def foo():# print("foo")# foo# foo()# def test1():# print('-----1-----')# ...

  2. vue——vue-resource

    get请求 getSearch () { return this.$http.get('https://xxx.xxx.com/xxx.json', {params: {name: this.sear ...

  3. ubuntu下使用matplotlib绘图无法显示中文label

    原因是字体导致的.大家的做法基本都是搞一个windows上的字体文件(simhei.ttf, 点我fq下载)然后刷新一下缓存文件. 只不过百度搜到第一篇CSDN的博客,写的很不靠谱(不是所有的CSDN ...

  4. 【第一部分】09Leetcode刷题

    一.位1的个数 题目:191. Number of 1 Bits C++ Soution 1: class Solution { public: int hammingWeight(uint32_t ...

  5. 如何保证Redis的高可用

    什么是高可用 全年时间里,99%的时间里都能对外提供服务,就是高可用 主备切换 在master故障时,自动检测,将某个slave切换为master的过程,叫做主备切换.这个过程,实现了Redis主从架 ...

  6. EF连接MySql数据库

    Windows要想EF连接MySql,首先要安装两个应用程序 mysql-connector-net-6.8.8.msimysql-for-visualstudio-1.2.7.msi 项目还需要两个 ...

  7. Ncurses-窗口

    前面介绍过标准屏幕 stdscr, stdscr 只是 WINDOW 结构的一个特例. 我们可以使用函数 newwin 和 delwin 来创建和销毁窗口 WINDOW *newwin(int num ...

  8. [ZJOI2006]皇帝的烦恼

    题解: 具有单调性的题目还是要多想想二分答案 不二分答案暴力dp是n^3的 非常不优秀 二分答案之后就比较好做 mx[i],nx[i]表示最多/最少几个与a[1]相同 代码: #include < ...

  9. Python学习(一) —— 基础

    一.计算机的组成 计算机硬件主要由cpu.内存.硬盘组成. cpu:相当于人类的大脑,用于计算 内存:临时加载数据或者程序.缺点:断电即消失. 硬盘:用于永久存放数据或者程序.缺点:运行速度慢. 二. ...

  10. NowCoder Wannafly 27E 黄魔法师 构造

    原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-Wannafly27E.html 题目传送门 - NowCoder Wannafly 27E 题 ...