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)

相关推荐

  • LN3,若a=ln22 b=ln3

    技术LN3,若a=ln22 b=ln3b>a>ca/b=3ln2/2ln3=ln8/ln9<1,a<b
    b/c=5ln3/3ln5=ln243/ln125>1,b>c
    a/c=5ln2/2ln5=ln32/ln25>1,

    生活 2021年10月26日
  • 如何解析Perl命令行程序用法

    技术如何解析Perl命令行程序用法如何解析Perl命令行程序用法,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。Perl命令行程序命令行程序下面的几个Pe

    攻略 2021年11月12日
  • 如何修改cocosbuilder文件数目的限制

    技术如何修改cocosbuilder文件数目的限制这篇文章将为大家详细讲解有关如何修改cocosbuilder文件数目的限制,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。下载 coco

    攻略 2021年11月19日
  • Oracle中出现ORA-00600内部错误代码怎么办

    技术Oracle中出现ORA-00600内部错误代码怎么办这篇文章将为大家详细讲解有关Oracle中出现ORA-00600内部错误代码怎么办,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获

    攻略 2021年11月17日
  • 设计模式07-装饰模式,Decorator)

    技术设计模式07-装饰模式,Decorator) 设计模式07-装饰模式(Decorator)通过实现与被装饰类实现的相同接口或父类,并将被装饰类作为属性注入到装饰器对象中来完成对装饰器模式的应用。装饰

    礼包 2021年10月28日
  • 如何使用纯java config来配置spring mvc方式

    技术如何使用纯java config来配置spring mvc方式这篇文章将为大家详细讲解有关如何使用纯java config来配置spring mvc方式,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这

    攻略 2021年11月29日