python scrapy框架中如何提升数据操作数据库的效率

仅作参考
第一步:建立数据库连接池

import pymysql
from twisted.enterprise import adbapi


# 异步更新操作
class MySQLPipeline(object):
    def __init__(self, dbpool):
        self.dbpool = dbpool

        

    @classmethod
    def from_settings(cls, settings):  # 函数名固定,会被scrapy调用,直接可用settings的值
        """
    数据库建立连接
    :param settings: 配置参数
    :return: 实例化参数
    """
        adbparams = dict(
            host='#数据库IP',#数据库IP
            db='数据库名称',#数据库名称
            user='数据库用户名',#数据库用户名
            password='数据库用户密码',#数据库用户密码
            cursorclass=pymysql.cursors.DictCursor  # 指定cursor类型
        )

        # 连接数据池ConnectionPool,使用pymysql或者Mysqldb连接
        dbpool = adbapi.ConnectionPool('pymysql', **adbparams)
        # 返回实例化参数
        return cls(dbpool)

    def process_item(self, item, spider):
        """
    使用twisted将MySQL插入变成异步执行。通过连接池执行具体的sql操作,返回一个对象
    """
        # print('0000')
        query = self.dbpool.runInteraction(self.do_insert, item)  # 指定操作方法和操作数据
        # 添加异常处理
        query.addCallback(self.handle_error)  # 处理异常

    def do_insert(self, cursor, item):
        # 对数据库进行插入操作,并不需要commit,twisted会自动commit
        # print('1111')
       
#REPLACE into根据主键guolv来进行判断插入数据库的
            insert_sql = """REPLACE into father_asin(`guolv`,`id1`,`sku1`,`asin1`,`asinId1`,`isFba1`,`title1`,`newtime`,`belongDate`,`price`,`bsrRank`,`bsrCategory`,`bsrRankLs`,`bsrCategoryLs`,`adTraffic`,`review`,`sessions`,`traffic`,`naturalTraffic`,`ucr`,`ocr`,`naturalCR`,`orders`,`adOrders`,`quantities`,`goodsSale`,`totalIncome`,`costs`,`profits`,`profitsRate`,`fbaFee`,`salesCommission`,`promotionFee`,`unitCost`,`fbaFeeRate`,`fbmShippingCostRate`,`refundManageFee`,`returnOrders`,`returnRate`,`impressions`,`clicks`,`ctr`,`adCR`,`adSales`,`spend`,`aCoS`,`Roas`,`acoAs`,`asoAs`,`reviewRate`,`site1`,`accountName`) values(%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)"""
            cursor.execute(insert_sql, (
                item["guolv"], item["id1"], item["sku1"], item["asin1"], item["asinId1"], item["isFba1"],
                item["title1"], item["newtime"], item["belongDate"], item["price"], item["bsrRank"],
                item["bsrCategory"], item["bsrRankLs"], item["bsrCategoryLs"], item["adTraffic"], item["review"],
                item["sessions"], item["traffic"], item["naturalTraffic"], item["ucr"], item["ocr"],
                item["naturalCR"], item["orders"], item["adOrders"], item["quantities"], item["goodsSale"],
                item["totalIncome"], item["costs"], item["profits"], item["profitsRate"], item["fbaFee"],
                item["salesCommission"], item["promotionFee"], item["unitCost"], item["fbaFeeRate"],
                item["fbmShippingCostRate"], item["refundManageFee"], item["returnOrders"], item["returnRate"],
                item["impressions"], item["clicks"], item["ctr"], item["adCR"], item["adSales"], item["spend"],
                item["aCoS"], item["Roas"], item["acoAs"], item["asoAs"], item["reviewRate"], item["site1"],
                item["accountName"]))

        

    def handle_error(self, failure):
        if failure:
            # 打印错误信息
            print(failure)

第二步:修改adbapi.py中的参数

min = 30  # Minimum number of connections in pool
max = 50  # Maximum number of connections in pool

该参数是调节允许连接数据库的最小连接数,最大连接数,

min默认是3,

max默认是5,


版权声明:本文为jim_lucky原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。