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

技术Python中如何实现Scrapy+adbapi提高数据库写入效率今天就跟大家聊聊有关Python中如何实现Scrapy+adbapi提高数据库写入效率,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下

今天就和大家聊聊如何在Python中实现Scratchy ADBAPI来提高数据库编写的效率,这个可能很多人都不太懂。为了让你更好地理解,边肖为你总结了以下内容,希望你能从这篇文章中有所收获。

数据库10-1010中pymysql的Commit()和execute()在提交数据时同步提交给数据库。由于scrapy框架的数据解析和异步多线程,scrapy的数据解析速度远高于将数据写入数据库的速度。如果数据写得太慢,会阻塞数据库写,影响数据库写的效率。

使用扭曲的异步IO框架,可以异步写入数据,多线程可以异步写入数据,可以提高数据写入速度。

一:twisted中的adbapi

adbapi.ConnectionPool:

创建一个数据库连接池对象,它包括多个连接对象,每个连接对象在一个独立的线程中工作。Adbapi只为异步访问数据库提供了一个编程框架,在它里面,像MySQLdb这样的库仍然可以访问数据库。

dbpool.runInteraction(do_insert,item):

异步调用do_insert函数,dbpool会在连接池中选择一个连接对象,在一个独立的线程中调用insert_db,其中参数项会传递给do_insert的第二个参数,传递给do_insert的第一个参数是Transaction对象,其接口类似于Cursor对象,可以调用execute方法执行SQL语句。执行do_insert后,连接对象将自动调用提交方法。

1.1 两个主要方法

从twisted.enterpriseimportadbapi #初始化数据库连接池(线程池)。

#参数1: mysql驱动程序。

#参数2:连接mysql的配置信息。

dbpool=adbapi . connectionpool(' pymysql ',* * params) #参数1:函数insert _ db在异步任务中执行;

#参数2:传递给函数insert_db的参数。

查询=自我。dbpool。runinteraction(自我。do _ insert,item)# execute()之后,不需要提交(),提交操作将在连接池内部执行。

defdo_insert(自身、光标、项目):

insert_sql=' ' '

insertintoqa_sample(

need_id,

需要_问题_正常运行时间,

需要_标题,

需要_标题_描述,

需要_答案_正常运行时间,

需要_答案)

值(%s,%s,%s,%s,%s,%s,% s,% s)

nbsp; """
    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提高数据库写入效率有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注行业资讯频道,感谢大家的支持。

内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/39242.html

(0)

相关推荐

  • DIV+CSS网页内容显示不完整诊断是这样的

    技术DIV+CSS网页内容显示不完整诊断是这样的DIV+CSS网页内容显示不完整诊断是这样的,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。本文和大家重点

    攻略 2021年11月11日
  • c++32位程序和64位程序的区别有哪些

    技术c++32位程序和64位程序的区别有哪些这篇文章主要讲解了“c++32位程序和64位程序的区别有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“c++32位程序和6

    攻略 2021年11月1日
  • isemodelsim仿真步骤(ise如何使用modelsim仿真)

    技术怎么进行ModelSim独立仿真ISE的仿真工程本篇文章为大家展示了怎么进行ModelSim独立仿真ISE的仿真工程,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。详细操作步骤

    攻略 2021年12月22日
  • 视频类型,各种视频格式有什么区别

    技术视频类型,各种视频格式有什么区别简单说一下吧,太复杂的感觉一般人也不会去关心视频类型。 通俗点讲就是容器与容器中装的东西的区别,比如常见的MP4(容器),视频编码x264 x265,音频编码AAC FLAC DTS,

    生活 2021年10月22日
  • php的结构函数是什么(php定义和函数有什么区别)

    技术php中system函数有什么用小编给大家分享一下php中system函数有什么用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

    攻略 2021年12月19日
  • 纯技术每日一题

    技术纯技术每日一题 纯技术每日一题纯技术每日一题
    一、11/4 (token、过期、分布式、多个节点多次调用)
    业务背景小猛同学正在压测,发现个小问题,因为在终端设备上跟鹅厂有紧密合作,调用他们的接口时

    礼包 2021年11月5日