前面講解到將Item中的所有字段都已經填寫完成,那么接下來就是將他們存儲到mysql數據庫中,
那就用到了pipeline項目管道了;
對項目管道的理解:做一個比喻,爬取好比是開采石油,Item裝的都是原油,需要通過一系列的管道
和工藝進行提煉,而這些原油都是通過pipeline進行加工的,才能真正的到我們所能使用的油(數據)
大致思路:
1, 安裝MySQLdb和連接數據庫的驅動mysqlclient,並創建數據庫和相應的表,創建和Item的字段
一樣的字段(注意各個字段的類型,長度和默認值);這些操作可通過navicat進行操作
2,自定義pipeline,引入mysqldb庫,將Item中的數據寫入數據庫
3,在settings文件中注冊這個管道,並給這個管道一個編號(這個管道在哪條工藝之后進行)
具體代碼
1 #引入操作數據庫模塊 2 import MySQLdb 3 4 class MysqlPipeline(object): 5 ''' 6 同步機制實現mysql寫入操作 7 ''' 8 9 #定義初始化函數,當類被使用時自動調用這個函數,我們讓他初始化時就連接上數據庫 10 def __init__(self): 11 #取個變量名,連接數據庫,依次是: host,user,password,dbname 12 self.conn = MySQLdb.connect("127.0.0.1","root","root","artical_spider") 13 #通過cursor()的方法獲取游標 14 self.cursor = self.conn.cursor() 15 16 #自定義的管道必須有此方法 17 def process_item(self,item,spider): 18 #要執行的插入sql語句 19 insert_sql = """ 20 insert into jobbole_artical(title,creat_date,url,url_object_id, 21 front_image_url2,front_image_path,tags,comment_num, 22 fav_num,like_num,content 23 ) 24 VALUES(%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s) 25 """ 26 27 #執行sql語句,注意后面是元組,將Item中的數據格式化填充到插入語句中 28 self.cursor.execute(insert_sql,(item["title"],item["creat_date"],item["url"], 29 item["url_object_id"],item["front_image_url2"],item["front_image_path"], 30 item["tags"],item["comment_num"],item["fav_num"],item["like_num"],item["content"])) 31 32 #將sql語句提交到數據庫執行 33 self.conn.commint()
注意:
一:
我們從前設置過
artical_item["front_image_url"] = [front_image_url]
這個Item是一個列表類型,當你寫入數據庫時候報錯,
File "C:\Users\Administrator\Envs\artical_spider\lib\site-packages\MySQLdb\converters.py", line 90, in quote_tuple
return "(%s)" % (','.join(escape_sequence(t, d)))
TypeError: sequence item 0: expected str instance, bytes found
當我們改為str時圖片的下載路徑又不能正常工作,
所以只能添加一個新的一樣的Item,一個設置為列表,供圖片下載,一個為寫入數據庫中做准備
二:
對於數據庫各個字段的設置,這里可將一些字段設置為不為空,並且設置一些字段的默認值;
這里講url_object_id設置成主鍵,主鍵不能為空且唯一;在
在寫入數據庫時,各個字段要和Item字段的順序相對應
三:
關於python對數據庫的操作,本篇參考了這篇博文
以下是運行結果
'''