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

 更新时间:2021年10月21日 00:00  点击:2198 作者:许进进

一: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数据库写入内容请搜索猪先飞以前的文章或继续浏览下面的相关文章希望大家以后多多支持猪先飞!

原文出处:https://juejin.cn/post/7021024993500725256

[!--infotagslink--]

相关文章

  • Python爬虫进阶Scrapy框架精文讲解

    这篇文章主要为大家介绍了Python爬虫进阶中Scrapy框架精细讲解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步...2021-10-22
  • python实战scrapy操作cookie爬取博客涉及browsercookie

    这篇文章主要为大家介绍了python实战scrapy操作cookie爬取博客涉及browsercookie,下面来学习一下 scrapy 操作 Cookie来爬取博客吧...2021-11-13
  • Python中Scrapy+adbapi提高数据库写入效率实现

    本文主要介绍了Python中Scrapy+adbapi提高数据库写入效率实现,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-10-21
  • Scrapy实现模拟登录的示例代码

    这篇文章主要介绍了Scrapy实现模拟登录的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-02-21
  • 详解基于Scrapy的IP代理池搭建

    这篇文章主要介绍了详解基于Scrapy的IP代理池搭建,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-09-29
  • 超简单的scrapy实现ip动态代理与更换ip的方法实现

    这篇文章主要介绍了超简单的scrapy实现ip动态代理与更换ip的方法实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-03-21
  • pycharm无法安装第三方库的问题及解决方法以scrapy为例(图解)

    这篇文章主要介绍了pycharm无法安装第三方库的解决办法以scrapy为例,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2020-05-10
  • Python利用Scrapy框架爬取豆瓣电影示例

    这篇文章主要介绍了Python利用Scrapy框架爬取豆瓣电影,结合实例形式分析了Python使用Scrapy框架爬取豆瓣电影信息的具体操作步骤、实现技巧与相关注意事项,需要的朋友可以参考下...2020-04-27
  • python scrapy简单模拟登录的代码分析

    在本篇文章里小编给大家整理的是一篇关于python scrapy简单模拟登录的代码分析,有兴趣的朋友们可以学习参考下。...2021-07-19
  • scrapy利用selenium爬取豆瓣阅读的全步骤

    这篇文章主要给大家介绍了关于scrapy利用selenium爬取豆瓣阅读的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-09-21
  • 详解使用scrapy进行模拟登陆三种方式

    这篇文章主要介绍了使用scrapy进行模拟登陆三种方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-02-21
  • python中用Scrapy实现定时爬虫的实例讲解

    在本篇文章里小编给大家整理的是一篇关于python中用Scrapy实现定时爬虫的实例讲解内容,有兴趣的朋友们可以学习下。...2021-01-18
  • 详解Python之Scrapy爬虫教程NBA球员数据存放到Mysql数据库

    这篇文章主要介绍了详解Python之Scrapy爬虫教程NBA球员数据存放到Mysql数据库,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-01-25
  • Scrapy启动报错invalid syntax的解决

    这篇文章主要介绍了Scrapy启动报错invalid syntax的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-09-18
  • python实现Scrapy爬取网易新闻

    这篇文章主要介绍了python实现Scrapy爬取网易新闻,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-03-21
  • Django-Scrapy生成后端json接口的方法示例

    这篇文章主要介绍了Django-Scrapy生成后端json接口的方法示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-10-06
  • python编程scrapy简单代码实现搜狗图片下载器

    这篇文章主要为大家介绍了使用python scrapy简单代码实现搜狗图片下载器示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助...2021-11-13
  • 详解向scrapy中的spider传递参数的几种方法(2种)

    这篇文章主要介绍了详解向scrapy中的spider传递参数的几种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-09-28
  • scrapy中如何设置应用cookies的方法(3种)

    这篇文章主要介绍了scrapy中如何设置应用cookies的方法(3种),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-09-22
  • Python爬虫基础讲解之scrapy框架

    scrapy是一个使用Python语言(基于Twisted框架)编写的开源网络爬虫框架,目前由scrapinghub Ltd维护.Scrapy简单易用、灵活易拓展、开发社区活跃,并且是跨平台的.在Linux、MaxOS以及windows平台都可以使用,需要的朋友可以参考下...2021-06-18