數據庫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(),連接池內部會進行提交的操作。