数据库pymysql的commit()和execute()在提交数据时,都是同步提交至数据库,由于scrapy框架数据的解析和异步多线程的,所以scrapy的数据解析速度,
要远高于数据的写入数据库的速度。如果数据写入过慢,会造成数据库写入的阻塞,影响数据库写入的效率。
通过多线程异步的形式对数据进行写入,可以提高数据的写入速度。
使用twisted异步IO框架,实现数据的异步写入。
from twisted.enterprise import adbapi

# 初始化数据库连接池(线程池)
# 参数一:mysql的驱动
# 参数二:连接mysql的配置信息
dbpool = adbapi.ConnectionPool('pymysql', **params)
参数1:在异步任务中要执行的函数insert_db;
参数2:给该函数insert_db传递的参数
query = self.dbpool.runInteraction(self.insert_db, item)
def insert_db(self, cursor, item):
      insert_sql = "INSERT INTO bole(title, date_time, tags, content, zan_num, keep_num, comment_num, img_src, img_path) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s)"
        cursor.execute(insert_sql, (item['title'], item['date_time'], item['tags'], item['content'], item['zan_num'], item['keep_num'], item['comment_num'], item['img_src'], item['img_path']))

       在execute()之后,不需要再进行commit(),连接池内部会进行提交的操作。
from twisted.enterprise import adbapi
from pymysql import cursors


class TwistedPipline(object):
    def __init__(self):
        dbparams = {
             'host': '127.0.0.1',
             'port': 3306,
             'user': 'root',
             'password': '123456',
             'database': 'db1',
             'charset': 'utf8',
             'cursorclass': cursors.DictCursor
        }
        self.dbpool = adbapi.ConnectionPool('pymysql', **dbparams)
        self._sql = None

    @property
    def sql(self):
        if not self._sql:
            self._sql = 'insert into db1 values(null, %s, %s)'
        return self._sql

    def process_item(self, item, spider):
        defer = self.dbpool.runInteraction(self.insert_item, item)
        defer.addErrback(self.handle_error, item, spider)

    def insert_item(self, cursor, item):
        cursor.execute(self.sql, (item['title'], item['content']))

    def handle_error(self, error, item, spider):
        print(error)
代码示例

 



posted on 2021-02-25 19:45  始终不够啊  阅读(363)  评论(0)    收藏  举报