Python中如何实现Scrapy+adbapi提高数据库写入效率
发表于:2025-01-18 作者:千家信息网编辑
千家信息网最后更新 2025年01月18日,今天就跟大家聊聊有关Python中如何实现Scrapy+adbapi提高数据库写入效率,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。一:twi
千家信息网最后更新 2025年01月18日Python中如何实现Scrapy+adbapi提高数据库写入效率一:twisted中的adbapi
1.1 两个主要方法
1.2 使用实例
二:结合scrapy中的pipelines
今天就跟大家聊聊有关Python中如何实现Scrapy+adbapi提高数据库写入效率,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。
一:twisted中的adbapi
数据库pymysql的commit()和execute()在提交数据时,都是同步提交至数据库,由于scrapy框架数据的解析和异步多线程的,所以scrapy的数据解析速度,要远高于数据的写入数据库的速度。如果数据写入过慢,会造成数据库写入的阻塞,影响数据库写入的效率。
使用twisted异步IO框架,实现数据的异步写入,通过多线程异步的形式对数据进行写入,可以提高数据的写入速度。
1.1 两个主要方法
adbapi.ConnectionPool:
创建一个数据库连接池对象,其中包括多个连接对象,每个连接对象在独立的线程中工作。adbapi只是提供了异步访问数据库的编程框架,再其内部依然使MySQLdb这样的库访问数据库。
dbpool.runInteraction(do_insert,item):
异步调用do_insert函数,dbpool会选择连接池中的一个连接对象在独立线程中调用insert_db,其中参数item会被传给do_insert的第二个参数,传给do_insert的第一个参数是一个Transaction对象,其接口与Cursor对象类似,可以调用execute方法执行SQL语句,do_insert执行后,连接对象会自动调用commit方法
1.2 使用实例
from twisted.enterprise import adbapi
# 初始化数据库连接池(线程池)# 参数一:mysql的驱动# 参数二:连接mysql的配置信息dbpool = adbapi.ConnectionPool('pymysql', **params)
# 参数1:在异步任务中要执行的函数insert_db;# 参数2:给该函数insert_db传递的参数query = self.dbpool.runInteraction(self.do_insert, item)
# 在execute()之后,不需要再进行commit(),连接池内部会进行提交的操作。def do_insert(self, cursor, item): insert_sql = """ insert into qa_sample( need_id, need_question_uptime, need_title, need_title_describe, need_answer_uptime, need_answer) values (%s, %s, %s, %s, %s, %s) """ params = (item['need_id'], item['need_question_uptime'], item['need_title'], item['need_title_describe'], item['need_answer_uptime'], item['need_answer']) cursor.execute(insert_sql, params)
二:结合scrapy中的pipelines
# -*- coding: utf-8 -*-from twisted.enterprise import adbapiimport pymysql # Define your item pipelines here## Don't forget to add your pipeline to the ITEM_PIPELINES setting# See: https://docs.scrapy.org/en/latest/topics/item-pipeline.html class QaSpiderPipeline(object): def process_item(self, item, spider): return item class MysqlTwistedPipeline(object): def __init__(self, dbpool): self.dbpool = dbpool @classmethod def from_settings(cls, settings): dbparams = dict( host=settings['MYSQL_HOST'], db=settings['MYSQL_DBNAME'], user=settings['MYSQL_USER'], passwd=settings['MYSQL_PASSWORD'], charset='utf8', cursorclass=pymysql.cursors.DictCursor, use_unicode=True ) dbpool = adbapi.ConnectionPool('pymysql', **dbparams) return cls(dbpool) def process_item(self, item, spider): query = self.dbpool.runInteraction(self.do_insert, item) def do_insert(self, cursor, item): insert_sql = """ insert into qa_sample( need_id, need_question_uptime, need_title, need_title_describe, need_answer_uptime, need_answer) values (%s, %s, %s, %s, %s, %s) """ params = (item['need_id'], item['need_question_uptime'], item['need_title'], item['need_title_describe'], item['need_answer_uptime'], item['need_answer']) cursor.execute(insert_sql, params)
看完上述内容,你们对Python中如何实现Scrapy+adbapi提高数据库写入效率有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注行业资讯频道,感谢大家的支持。
数据
数据库
参数
对象
线程
效率
内容
函数
方法
框架
速度
独立
两个
任务
信息
其中包括
只是
多个
实例
形式
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
手机对讲软件开发
plsql导出数据库表
空间数据库空间查询伪代码
金易云网络技术有限公司
云服务器学习租赁费用
如何用命令修改数据库密码
第三方支付系统 数据库
多玩英雄数据库
民宿数据库
软件开发外包合同书范本
丰都app软件开发
最mc服务器列表
林甸软件开发技术在线咨询
免费数据库制作
网络安全需求身份认证
房山区网络技术咨询哪个好
服务器主板插槽万兆网卡
哪些网游没有服务器
无线传感器网络技术体系
王者荣耀单独注销一个服务器
网络技术应用是指什么呢
搭建本地网站用到数据库中间件
云计算管理节点服务器
数据库技术对统计学有用吗
在什么地方可以学习软件开发
测绘方面的软件开发
计算机网络技术技术
启动orcal 数据库
emm服务器
遵义市网络安全宣传周活动