爬蟲--Scrapy-持久化儲存操作2
阿新 • • 發佈:2018-12-09
1、管道的高階操作
需求:將爬取到的資料值分別儲存到本地磁碟、redis資料庫、mysql資料。
1.需要在管道檔案中編寫對應平臺的管道類
2.在配置檔案中對自定義的管道類進行生效操作
qiubai.py
import scrapy from qiubaipro.items import QiubaiproItem class QiubaiSpider(scrapy.Spider): name = 'qiubai' #allowed_domains = ['www.qiushibaike.com/text'] start_urls = ['https://www.qiushibaike.com/text/'] def parse(self, response): # 建議大家使用xpath進行解析(框架集成了xpath解析的介面) div_list = response.xpath("//div[@id='content-left']/div") # 儲存到的解析到的頁面資料 data_list = [] for div in div_list: author = div.xpath('./div/a[2]/h2/text()').extract_first() #content = div.xpath(".//div[@class='content']/span/text()") content = div.xpath(".//div[@class='content']/span/text()").extract_first() # 1.將解析到資料值(author和content)儲存到items物件 item = QiubaiproItem() item['author'] = author item['content'] = content # 2.將item物件提交給管道 yield item
pipelines.py
import redis import pymysql class QiubaiproPipeline(object): conn = None def open_spider(self,spider): print('寫入到redis伺服器') print('開始爬蟲') # redis伺服器port self.conn = redis.Redis(host='127.0.0.1',port=6379) # 該方法可以接受爬蟲檔案中提交過來的item物件,並且對item物件的頁面資料進行持久化處理 # 引數:item表示的就是接受到的item物件 def process_item(self, item, spider): # 1.連結資料庫 dict = {'author':item['author'], 'content':item['content']} self.conn.lpush('data',dict) return item # 該方法只會在爬蟲結束的時候被呼叫一次 def close_spider(self,spider): print('爬蟲結束') # 實現將資料值存到本地磁碟中 class QiubaiByFiles(object): # 該方法可以接受爬蟲檔案中提交過來的item物件,並且對item物件的頁面資料進行持久化處理 # 引數:item表示的就是接受到的item物件 def open_spider(self,spider): print('寫入到本地磁碟中') print('開始爬蟲') self.fp = open('./qiubai_pipe.txt', 'w', encoding='utf-8') # 該方法可以接受爬蟲檔案中提交過來的item物件,並且對item物件的頁面資料進行持久化處理 # 引數:item表示的就是接受到的item物件 def process_item(self, item, spider): author = item['author'] content = item['content'] # 持久化儲存io操作 self.fp.write(author+':'+content+'\n\n\n') return item # 該方法只會在爬蟲結束的時候被呼叫一次 def close_spider(self,spider): print('爬蟲結束') self.fp.close() # 實現將資料值儲存到mysql資料庫中 class QiubaiByMysql(object): conn = None # mysql的連線物件宣告 cursor = None # mysql遊標物件宣告 def open_spider(self,spider): print('寫入到mysql資料庫中') print('開始爬蟲') # 連結資料庫 # host 本機的ip地址 # 在命令列輸入 ipconfig檢視 self.conn = pymysql.Connect(host='10.10.40.140',port=3306,user='root',password='123',db='qiubai',charset='utf8') # 該方法可以接受爬蟲檔案中提交過來的item物件,並且對item物件的頁面資料進行持久化處理 # 引數:item表示的就是接受到的item物件 def process_item(self, item, spider): # 1.連結資料庫 # 執行sql語句 # 插入資料 sql = 'insert into qiubai(author,content) values("%s","%s")'%(item['author'], item['content']) # 獲取遊標 self.cursor = self.conn.cursor() try: self.cursor.execute(sql) self.conn.commit() except Exception as e: print(e) self.conn.rollback() # 提交事務 return item # 該方法只會在爬蟲結束的時候被呼叫一次 def close_spider(self,spider): print('爬蟲結束') self.cursor.close() self.conn.close()
在settings配置
# 數字表示優先順序,數字越大優先順序越高 ITEM_PIPELINES = { 'qiubaipro.pipelines.QiubaiproPipeline': 300, 'qiubaipro.pipelines.QiubaiByFiles':400, 'qiubaipro.pipelines.QiubaiByMysql':500, }
開啟終端,先進入檔案目錄