1. 程式人生 > >爬蟲--Scrapy-持久化儲存操作2

爬蟲--Scrapy-持久化儲存操作2

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,
}

開啟終端,先進入檔案目錄