從redis數據庫取數據存放到本地mysql數據庫


redis數據庫屬於非關系型數據庫,數據存放在內存堆棧中,效率比較高。

其存儲數據是以json格式字符串存儲字典的,而類似的關系型數據庫無法實現這種數據的存儲。

在爬取數據時,將數據暫存到redis中,等數據采集完成后,在從redis里將數據讀取,並寫入mysql數據庫中。

在數據采集方面不在多說,只需將項目settings文件下的pipelines管道文件里的本地數據管道注釋,讓redis來接收數據即可。

從redis寫數據入mysql的代碼實現:

其實就是一個獨立的python腳本文件

 
import redis
import pymysql
import json,re


def table_exists(con, table_name):
    # 判斷數據表是否已經創建
    sql = 'show tables;'
    con.execute(sql)
    tables = [con.fetchall()]
    table_list = re.findall('(\'.*?\')', str(tables))
    table_list = [re.sub("'", '', each) for each in table_list]  # 遍歷並獲得數據庫表
    if table_name in table_list:
        return 1  # 創建了返回1
    else:
        return 0  # 不創建返回0


def process_item():
    #redis數據庫創建連接池對象 並實例化一個連接
    pool=redis.ConnectionPool(host='127.0.0.1',port=6379,db=0,password='123456')
    redis_cli=redis.Redis(connection_pool=pool)

    #創建mysql數據庫連接
    conn=pymysql.connect(user='root',  # 用戶名
            password='1234',  # 密碼
            db='lgweb',  # 數據庫名
            host='127.0.0.1',  # 地址
            port=3306,
            charset='utf8')


    table_name = 'db_read'  # 數據庫表
    # 沒有對應數據庫表則創建
    if (table_exists(conn.cursor(),table_name) != 1):
        sql = 'create table db_read(書名 VARCHAR (30),作者 VARCHAR (30),評分 VARCHAR (10),類型 VARCHAR (30),狀態 VARCHAR (30),簡介 VARCHAR (50),詳情 VARCHAR (1000),最新章節 VARCHAR (50),封面 VARCHAR (100))'
        conn.cursor().execute(sql)  # 不存在則創建數據庫表

    offset=0
    while True:

        #將數據從redis里pop出來
        source,data=redis_cli.blpop("read:items")
        #將redis字符串轉為格式化的字典
        item=json.loads(data)
        #創建數據庫游標
        cursor=conn.cursor()
        sql = "insert into db_read(書名,作者,評分,類型,狀態,簡介,詳情,最新章節,封面)VALUES ('%s','%s','%s','%s','%s','%s','%s','%s','%s')" % (
            item['book_name'],item['author'],item['score'],item['type'],item['state'],item['about'],item['story'],item['news'],item['photo'])
        cursor.execute(sql)     #執行數據插入
        conn.commit()           #提交記錄

        cursor.close()          #關閉游標

        offset+=1
        print("正在保存第:"+str(offset)+"條記錄")

if __name__ == '__main__':
    process_item()

redis數據庫采用數據池連接的方式,更高效更方便。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM