今天就和大家聊聊如何在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