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