Python中Scrapy+adbapi提高数据库写入效率实现

 更新时间:2021年10月20日 15:39:53   作者:许进进  
本文主要介绍了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 adbapi
import 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提高数据库写入效率实现的文章就介绍到这了,更多相关Scrapy+adbapi数据库写入内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 如何使用yolov5输出检测到的目标坐标信息

    如何使用yolov5输出检测到的目标坐标信息

    YOLOv5是一系列在 COCO 数据集上预训练的对象检测架构和模型,下面这篇文章主要给大家介绍了关于如何使用yolov5输出检测到的目标坐标信息的相关资料,需要的朋友可以参考下
    2022-03-03
  • win10 64bit下python NLTK安装教程

    win10 64bit下python NLTK安装教程

    这篇文章主要为大家详细介绍了win10 64bit下python NLTK安装教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-09-09
  • 如何用python给朋友做生日快乐祝福

    如何用python给朋友做生日快乐祝福

    生活中除了给男神女神表白,还会遇到朋友过生日,所以小编今天就给大家带来了一个送给朋友的生日祝福程序,这篇文章主要给大家介绍了关于如何用python给朋友做生日快乐祝福的相关资料,需要的朋友可以参考下
    2023-11-11
  • 详解Python中字典的增删改查

    详解Python中字典的增删改查

    这篇文章主要为大家介绍了 Python字典的增删改查,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-01-01
  • python 线程的五个状态

    python 线程的五个状态

    这篇文章主要介绍了python 线程的五个状态,帮助大家更好的理解和学习python,感兴趣的朋友可以了解下
    2020-09-09
  • 详解如何从TensorFlow的mnist数据集导出手写体数字图片

    详解如何从TensorFlow的mnist数据集导出手写体数字图片

    这篇文章主要介绍了详解如何从TensorFlow的mnist数据集导出手写体数字图片,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-08-08
  • python绘制双柱形图代码实例

    python绘制双柱形图代码实例

    这篇文章主要介绍了python绘制双柱形图代码实例,具有一定借鉴价值,需要的朋友可以参考下。
    2017-12-12
  • python3使用urllib示例取googletranslate(谷歌翻译)

    python3使用urllib示例取googletranslate(谷歌翻译)

    这篇文章主要介绍了使用urllib取googletranslate(谷歌翻译)的示例,通过这个谷歌翻译示例学习python3中urllib的使用方法,
    2014-01-01
  • Python基础之变量基本用法与进阶详解

    Python基础之变量基本用法与进阶详解

    这篇文章主要介绍了Python基础之变量基本用法与进阶,结合实例形式详细分析了Python变量引用、可变和不可变类型、局部变量和全局变量等相关原理与使用技巧,需要的朋友可以参考下
    2020-01-01
  • python 装饰器功能以及函数参数使用介绍

    python 装饰器功能以及函数参数使用介绍

    之前学习编程语言大多也就是学的很浅很浅,基本上也是很少涉及到装饰器这些的类似的内容。总是觉得是一样很神奇的东西,舍不得学(嘿嘿)。今天看了一下书籍。发现道理还是很简单的
    2012-01-01

最新评论