笔记-twisted-adbapi-scrapy
笔记-twisted-adbapi-scrapy-mysql
1. 异步插入mysql
在爬虫中需要insert到mysql,但有一个问题是在爬虫环境中commit的及时性与性能冲突。
一般可以在close_spider进行commit,这样做的问题是如果中途数据库崩了,数据丢失,找起来也很麻烦;
但如果在insert_db中直接加入commit,又会使程序执行变得很慢。
这里就可以使用Twisted中提供的以异步方式多线程访问数据库的模块adbapi,可以显著提供程序访问数据库的效率。
adbapi.ConnectionPool方法可以创建一个数据库连接池对象,其中包括多个连接对象,每个连接对象在独立的线程中工作。adbapi只是提供了异步访问数据库的编程框架,再其内部依然使MySQLdb这样的库访问数据库。
dbpool.runInteraction(insert_db,item)以异步方式调用insert_db函数,dbpool会选择连接池中的一个连接对象在独立线程中调用insert_db,其中参数item会被传给insert_db的第二个参数,传给insert_db的第一个参数是一个Transaction对象,其借口与Cursor对象类似,可以调用execute方法执行SQL语句,insert_db执行后,连接对象会自动调用commit方法
1.1. 代码示例
import pymysql
import pymysql.cursors
from twisted.enterprise import adbapi
# 同步插入
class ZhihuPipeline(object):
"""
数据保存到mysql
同步保存
"""
def __init__(self, conn,
cursor):
self.conn = conn
self.cursor
=cursor
@classmethod
def from_settings(cls,
settings):
"""
:param settings:
:return:
"""
db_parms = dict(
host=settings['MYSQL_HOST'],
user=settings['MYSQL_USER'],
password=settings['MYSQL_PASSWORD'],
database=settings['MYSQL_DB'],
)
#连接池connectionpool
conn =
pymysql.connect( **db_parms )
cursor = conn.cursor()
return cls(conn, cursor)
def process_item(self, item, spider):
"""
同步保存
:param item:
:param spider:
:return:
"""
insert_sql = 'insert
into {}'.format()
self.cursor.execute(inert_sql)
self.conn.commit()
def close_spider(self,spider):
"""
清理
:param spider:
:return:
"""
self.cursor.close()
self.conn.close()
# 异步插入
class ZhihuPipelineTwisted(object):
"""
数据保存到mysql
使用了twisted进行异步操作
"""
def __init__(self,
dbpool):
self.dbpool =
dbpool
@classmethod
def from_settings(cls,
settings):
"""
:param settings:
:return:
"""
db_parms = dict(
host=settings['MYSQL_HOST'],
user=settings['MYSQL_USER'],
password=settings['MYSQL_PASSWORD'],
database=settings['MYSQL_DB'],
cursorclass=pymysql.cursors.DictCursor
)
#连接池connectionpool
dbpool =
adbapi.ConnectionPool("pymysql",
**dbparms)
return cls(dbpool)
def process_item(self, item,
spider):
"""
:param item:
:param spider:
:return:
"""
query = self.dbpool.runInteraction(self.do_insert,
item)
query.addErrback(self.handle_error,
item, spider)
def do_insert(self, cursor,
item):
insert_sql, params = 'insert
into {} ({}) values ({})'
cursor.execute(insert_sql,
params)
@staticmethod
def handle_error(failure,
item, spider):
# 处理插入异常
print(failure)
def close_spider(self,spider):
"""
提交及清理
:param spider:
:return:
"""
self.cursor.close()
self.conn.close()
2.
总结
adbapi为什么性能高,有空看下它是怎么优化整个执行逻辑的。
笔记-twisted-adbapi-scrapy的更多相关文章
- 笔记-twisted
笔记-twisted 1. 简介 Twisted is an event-driven networking engine written in Python and licensed un ...
- 笔记-twisted源码-import reactor解析
笔记-twisted源码-import reactor解析 1. twisted源码解析-1 twisted reactor实现原理: 第一步: from twisted.internet ...
- twisted 模拟scrapy调度循环
"""模拟scrapy调度循环 """from ori_test import pr_typeimport loggingimport ti ...
- Scrapy笔记:使用scrapy shell url时出现403错误的解决办法
参考 : http://www.th7.cn/Program/Python/201704/1154208.shtml 原因是网站的防爬虫配置起到了作用 (1):第一种方法是在命令上加上-s USER_ ...
- Scrapy基础01
一.Scarpy简介 Scrapy基于事件驱动网络框架 Twisted 编写.(Event-driven networking) 因此,Scrapy基于并发性考虑由非阻塞(即异步)的实现. 参考:武S ...
- Python Scrapy环境配置教程+使用Scrapy爬取李毅吧内容
Python爬虫框架Scrapy Scrapy框架 1.Scrapy框架安装 直接通过这里安装scrapy会提示报错: error: Microsoft Visual C++ 14.0 is requ ...
- 第8章 scrapy进阶开发(2)
8-4 selenium集成到scrapy中 其实也没什么好说的直接上代码 这是在middlewares.py中定义的一个class: from selenium.common.exceptions ...
- scrapy 和 scrapy_redis 安装
安装sqlslte,scrapy需要这个模块 yum install sqlite-devel python3.5 下载包自己编译安装 ./configure make make install 自带 ...
- [转]使用scrapy进行大规模抓取
原文:http://www.yakergong.net/blog/archives/500 使用scrapy有大概半年了,算是有些经验吧,在这里跟大家讨论一下使用scrapy作为爬虫进行大规模抓取可能 ...
- windows 安装 Scrapy的套路
我最近在琢磨scrapy爬虫框架,在windows中安装scrapy遇到了不少坑:直接 pip install scrapy 安装不成功的,百度说要安装vc2008+等等,安装这些时间太长,最后找到一 ...
随机推荐
- PowerDesigner如何设计表之间的关联
PowerDesigner如何设计表之间的关联 步骤/方法 在工具箱中找到参照关系工具: 由地区表到省份表之间拉参照关系,箭头指向父表,然后双击参照关系线,打开参照关系的属性: 在这里检查 ...
- Android(java)学习笔记57:PC and Phone 通信程序
1. 首先我写的程序代码如下: package com.himi.udpsend; import java.net.DatagramPacket; import java.net.DatagramSo ...
- 【BZOJ3784】树上路径
题目大意 给定一个\(N\)个结点的树,结点用正整数\(1..N\)编号.每条边有一个正整数权值.用\(d(a,b)\)表示从结点\(a\)到结点\(b\)路边上经过边的权值.其中要求\(a < ...
- ACM-ICPC (10/12)
01分数规划 背景:根据楼教主回忆,曾经在一场比赛中秒掉了一道最优比例生成树问题,导致很多人跟风失败,最终悲剧. 什么是01分数规划呢? 这样的等式求最大,最小即为01分数规划. 如果你不知道该如何 ...
- 从OC和C#中找乐趣:相同又不同的delegate
不想说话,本来第一段打了一大堆废话,结果浏览器崩溃了...直接进入正题吧.看Demo: C#里面也有delegate,我今天的目的就是模仿着OC里面的写法来写一个网络请求模拟类.先建一个“Protoc ...
- javascript DOM 操作基础知识小结
经常用到javascript对dom,喜欢这方便的朋友也很多,要想更好的对dom进行操作,这些基础一定要知道的. DOM添加元素,使用节点属性 <!DOCTYPE html PUBLIC ...
- conda清华镜像(TUNA)使用指南
Details: https://mirrors.tuna.tsinghua.edu.cn/help/anaconda/ TUNA 提供了 Anaconda 仓库的镜像,运行以下命令: conda c ...
- MVC学习五:Razor布局页面 _ViewStart.cshtml
如图: _ViewStart.cshtml就是MVC中的布局页面/模板页面. 用户访问流程图: 原理:先去执行Views文件夹下[_ViewStart.cshtml]页面,然后同级目录文件夹(上图中的 ...
- 【luogu P3979 遥远的国度】 题解
题目链接:https://www.luogu.org/problemnew/show/P3979 除了换根操作都是裸的树剖 所以换根时考虑: 1.我查询的根等于换的根:无影响 2.我查询的根是换的根的 ...
- 【题解】洛谷P2426删数
链接 https://www.luogu.org/problemnew/show/P2426 念念碎 第一次接触到区间DP(瑟瑟发抖) 所以象征性地看了一下题解 这好像是一道比较基础的区间DP吧 但是 ...