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數據庫采用數據池連接的方式,更高效更方便。