Scrapy項目運行數據流總覽 AND 幾個重要的組件、中間件分析

以下的內容均爲自己看書自學的分享,加深自己對於Scrapy的整體框架的理解。

1. 數據流總覽圖

1.1 Scrapy整體框架圖和數據流總覽

圖片爲自己學習總結所畫,有不對的地方可以評論私信指出。
在這裏插入圖片描述

2. 重要的組件和中間件分析

2.1 Spider

2.1.1 Spider運行流程

Spider是最核心的類,定義瞭如何爬取某個網站的流程和解析方式。簡單的來說其所要做的就是兩件事:

  1. 定義爬取網站的動作
  2. 分析爬取下來的網頁

整個的爬取流程如下:

  1. 以初始的URL初始化Request,並設置回調函數。當該Request成功請求返回後,Response生成並作爲參數傳遞給回調函數。
  2. 在回調函數內分析返回的網頁內容。返回的結果有兩種形式,(1)解析到的有效結果返回字典或Item對象,它們可以經過處理後直接保存。(2)解析得到的下一個鏈接,可以利用此鏈接構造Request並設置新的回調函數,返回Request等待後續的調度。
  3. 如果返回的是字典或Item對象,可以通過命令行的方式直接存入本地文件。若設置了Pipeline的話,便利用其中的自定義的方法進行處理後保存。
  4. 如果返回的是Request對象的話,那麼Request執行成功後得到的Response會被傳遞給Request中定義的回調函數,在回調函數中我們可以再次使用選擇器來分析新的網頁內容,並根據分析的數據生成Item。

2.1.2 Spider類的基礎屬性

Spider默認繼承的是scrapy.spiders.Spider。提供了默認的 start_requests()方法的實現,讀取並請求start_urls屬性,並根據返回結果調用parse()方法解析結果。

  1. name:爬蟲的名稱,必須是唯一的,創建項目的時候自動生成。不過可以生成多個相同的Spider實例,數量沒有限制。
  2. allowed_domains。允許爬取的域名,是可選配置,不在此範圍內的連接不會跟進爬取。
  3. start_urls。起始的URL列表,當沒有實現start_requests()方法時,默認會從這個列表開始抓取。
  4. custom_settings。一個字典,專屬於Spider的配置,此設置會覆蓋項目的全局設置。此設置必須在初始化前被更新,必須定義成類的變量。
  5. crawler。它是由from_crawler()方法設置的,利用它可以獲取項目的一些配置信息,如在settings中配置的信息。
  6. start_requests()。此方法用於生產初始請求,他必須返回一個可迭代的對象。此方法默認從start_urls裏面的URL來構造Request,而且Request時GET的請求方式。如果我們想在啓動時以POST的方式來訪問某個站點,可以直接重寫這個方法,發送POST請求時使用FromRequest即可。
  7. parse()。當Response沒有指定回調函數的時候,該方法會被默認使用,來處理Response,處理返回結果,並從中提取想要的數據和下一步的請求。
  8. closed()。當Spider關閉時該方法自動調用。

2.2 Downloader Middleware

下載中間件,處於Scrapy的Request和Response之間的處理模塊。

2.2.1 架構分析

Scheduler從隊列中拿出來一個Request發送給Downloader執行下載,這個過程會經過Downloader Middleware 的處理。當Downloader將Request下載完成後得到的Response返回給Spider處理的時候,也會經過Downloader Middleware 進行處理。

我們通過其可做的修改有兩處:

1.在Scheduler調度出隊列的Request發送給Downloader下載之前,也就是我們可以在Request執行下載任務之前對其進行處理。

2.在下載後生成Response發送給Spider之前,也就是我們可以在生成Response發送給Spider解析之前進行修改。

2.2.2 三個核心方法

(1)process_request(request,spider)。這個方法處理情況一,調用其方法對Request請求進行修改,比如修改頭部請求等,返回值必爲None,Response,Request對象之一,或者拋出異常。

(2)process_response(request,response,spider)。這個方法處理情況二,調用其對Response進行修改,比如修改狀態碼等。返回值必爲None,Response,Request對象之一,或者拋出異常。

(3)process_exception(request,exception,spider)。處理產生的異常,使得項目可以順利的執行完全程。

只需要實現其中一個方法,便可以定義一個 Downloader Middleware。

2.2.3 啓動自定義的 Downloader Middleware

在settings.py中,將DOWNLOADER_MIDDLEWARE取消註釋,設置爲:

DOWNLOADER_MIDDLEWARE = {
	'項目名.middlewares.自己定義的middleware的名字':503(數字爲優先級)
}

2.3 Item Pipeline

2.3.1 主要功能

  1. 清理HTML數據
  2. 驗證爬取的數據,檢查爬取字段
  3. 查重並丟棄重複的內容
  4. 將爬取的數據返回給數據庫

2.3.2 核心方法

必須要實現的方法 process_item(item,spider)

被定義的 Item Pipeline 會默認調用這個方法對Item進行處理。比如將數據處理或將數據保存如數據庫等。它必須返回Item類型的值或拋出一個DropItem異常。

class PymysqlPipeline(object):
    #連接數據庫
    def __init__(self):
        self.connect = pymysql.connect(
            host = 'localhost',
            database = 'image_360',
            user = 'root',
            password = '123456',
            charset = 'utf8',
            port = 3306
        )
        # 創建遊標對象
        self.cursor = self.connect.cursor()

    # 此方法是必須要實現的方法,被定義的 Item Pipeline 會默認調用這個方法對 Item 進行處理
    def process_item(self,item,spider):
        cursor = self.cursor
        sql = 'insert into image_information(id,pic_desc,title,url,thumb) values (%s,%s,%s,%s,%s)'
        cursor.execute(sql,(
            item['id'],item['pic_desc'],item['title'],item['url'],item['thumb']
        ))
        # 提交數據庫事務
        self.connect.commit()

        return item

2.3.3 三個實用的方法

  1. open_spider(self,spiser)。在Spider開啓的時候別調用,可以做一些初始化的操作,如開啓數據庫的連接等。
  2. close_spider(spider)。Spider關閉的時候調用,做一些收尾的操作,如關閉數據的連接等。
  3. from_crawler(cls,crawler)。一個類方法,用 @classmethod 標識,是一種依賴注入的方式。它的參數時crawler,通過crawler對象,可以拿到Scrapy所有核心組件,如全局配置信息,然後創建一個Pipeline實例。參數cls是Class,最後返回一個Class實例。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章