twisted异步方式保存数据到mysql

在某些爬虫项目下,我们需要每次执行一条插入语句,就立即调用commit方法更新数据库,如果爬取时间太长,中途可能被迫中断,这样程序就不能执行close_spider中的commit。但如果在insert_db中直接加入commit,又会使程序执行变得很慢。这里就可以使用Twisted中提供的以异步方式多线程访问数据库的模块adbapi,可以显著提供程序访问数据库的效率。

  • adbapi.ConnectionPool方法可以创建一个数据库连接池对象,其中包括多个连接对象,每个连接对象在独立的线程中工作。adbapi只是提供了异步访问数据库的编程框架,在其内部依然使mysql这样的库访问数据库。
  • dbpool.runInteraction(insert_db,item)以异步方式调用insert_db函数,dbpool会选择连接池中的一个连接对象在独立线程中调用insert_db,其中参数item会被传给insert_db的第二个参数,传给insert_db的第一个参数是一个Transaction对象,其接口与Cursor对象类似,可以调用execute方法执行SQL语句,insert_db执行后,连接对象会自动调用commit方法
import pymysql
from twisted.enterprise import adbapi
from pymysql import cursors


class JianshuTwistedPipeline(object):

    def __init__(self):
        dbparmas = {
            'host': '192.168.0.134',
            'user': 'root',
            'password': '123456',
            'database': 'jianshu',
            'charset': 'utf8',
            'cursorclass': cursors.DictCursor
        # 在默认情况下cursor方法返回的是BaseCursor类型对象,BaseCursor类型对象在执行查询后每条记录的结果以列表(list)表示。如果要返回字典(dict)表示的记录,就要设置cursorclass参数为cursors.DictCursor类。
        }
        # 连接ConnectionPool(使用pymysql或者MySQLdb连接)
        self.dbpool = adbapi.ConnectionPool('pymysql', **dbparmas)
        self._sql = None

    @property
    def sql(self):
        if not self._sql:
            self._sql = '''
              insert into article(id,title,content,author,avatar,publish_time,article_id,origin_url) values(null,%s,%s,%s,%s,%s,%s,%s)
              '''
            return self._sql
        return self._sql

    def process_item(self, item, spider):
        # 使用twisted将mysql插入变成异步执行
        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'], item['author'], item['avatar'], item['publish_time'], item['article_id'],
        item['origin_url']))

    def handle_error(self, error, item, spider):
        print(error)

猜你喜欢

转载自blog.csdn.net/qq_40176258/article/details/86536966