我是靠谱客的博主 寂寞小猫咪,最近开发中收集的这篇文章主要介绍爬虫中异步数据写入MySQL数据库方法爬虫中异步数据写入MySQL数据库方法(adbapi),觉得挺不错的,现在分享给大家,希望可以做个参考。
概述
爬虫中异步数据写入MySQL数据库方法(adbapi)
数据库pymysql的commit()和execute()在提交数据时,都是同步提交至数据库,由于scrapy框架数据的解析和异步多线程的,所以scrapy的数据解析速度,要远高于数据的写入数据库的速度。如果数据写入过慢,会造成数据库写入的阻塞,影响数据库写入的效率。
通过多线程异步的形式对数据进行写入,可以提高数据的写入速度。
使用twisted异步IO框架,实现数据的异步写入。
from twisted.enterprise import adbapi
# 初始化数据库连接池(线程池)
# 参数一:mysql的驱动
# 参数二:连接mysql的配置信息
dbpool = adbapi.ConnectionPool('pymysql', **params)
参数1:在异步任务中要执行的函数insert_db;
参数2:给该函数insert_db传递的参数
query = self.dbpool.runInteraction(self.insert_db, item)
def insert_db(self, cursor, item):
insert_sql = "INSERT INTO bole(title, date_time, tags, content, zan_num, keep_num, comment_num, img_src, img_path) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s)"
cursor.execute(insert_sql, (item['title'], item['date_time'], item['tags'], item['content'], item['zan_num'], item['keep_num'], item['comment_num'], item['img_src'], item['img_path']))
在execute()之后,不需要再进行commit(),连接池内部会进行提交的操作。
附完整代码:
#Mysql异步化
class MysqlTwistedPipeline(object):
def __init__(self,dbpool):
self.dbpool = dbpool
@classmethod
#这种方法是固定的
def from_settings(cls,settings):
dbparms = dict(
host = settings['MYSQL_HOST'],
user = settings['MYSQL_USER'],
passwd = settings['MYSQL_PASSWORD'],
db = settings['MYSQL_DBNAME'],
charset = 'utf8',
cursorclass = MySQLdb.cursors.DictCursor,
use_unicode = True,
)
dbpool = adbapi.ConnectionPool("MySQLdb",**dbparms )
return cls(dbpool)
def process_item(self, item, spider):
#使用twisted将mysql插入变成异步执行
query = self.dbpool.runInteraction(self.do_insert,item)
query.addErrorback(self.handle_error)#处理异常
def handle_error(self,failure,item,spider):
#处理异步插入的异常
print(failure)
def do_insert(self,cursor,item):
#执行具体的插入
insert_sql = """insert into jobbole_article(title,create_date,url,url_object_id,
front_image_url,comment_nums,fav_nums,parise_nums)
VALUES (%s,%s,%s,%s,%s,%s,%s,%s)"""
cursor.execute(insert_sql, (item["title"], item["create_date"], item["url"],
item["url_object_id"], item["front_image_url"],
item["comment_nums"],
item["fav_nums"], item["parise_nums"]))
只需要修改SQL语句和数据库配置信息即可
最后
以上就是寂寞小猫咪为你收集整理的爬虫中异步数据写入MySQL数据库方法爬虫中异步数据写入MySQL数据库方法(adbapi)的全部内容,希望文章能够帮你解决爬虫中异步数据写入MySQL数据库方法爬虫中异步数据写入MySQL数据库方法(adbapi)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复