@(Spider)[POSTS]html
Scrapy
是一個應用於抓取、提取、處理、存儲等網站數據的框架(相似Django
)。shell
應用:後端
還有不少,詳細參考:http://scrapy-chs.readthedocs.io/zh_CN/0.24/intro/overview.html緩存
Scrapy
使用了Twisted
異步網絡庫來處理網絡通信。結構以下:cookie
Scrapy
的核心組件:網絡
引擎(Scrapy Engine
)
用來處理整個系統的數據流,觸發事務(框架核心),負責控制和調度各個組件session
調度器(Scheduler
)
用來接受引擎發過來的請求,壓入隊列中,並在引擎再次請求的時候返回,如:要抓取的連接(URL
)的優先隊列,由它來決定下一個要抓取的URL
是什麼,並進行去重。架構
下載器(Downloader
)
用於下載網頁內容,並將網頁內容返回給Spiders
(本身編寫的蟲子
)--下載器創建在Twisted
模型上框架
爬蟲(Spider
)
幹活的蟲子
,從特定的網頁中提取本身須要的信息,即:實體Item
,用戶也能夠提取下級連接,繼續抓取頁面內容。異步
項目管道(Pipline
)
負責處理爬蟲從網頁中抽取的實體,主要的功能是持久化實體(Item
)、驗證明體的有效性、清除垃圾信息。當頁面被爬蟲解析後,解析後內容將會發送到項目管理通道,通過幾個特定的次序處理。
下載器中間件(Downloader Middlewares
)
位於Scrapy
引擎和下載器之間的框架,主要是處理Scrapy
引擎和下載器之間的請求與響應。
爬蟲中間件(Spider Middlewares
)
介於Scrapy
引擎和Spider
之間的框架,處理爬蟲的響應輸入和請求輸出。
調度中間件(Scheduler Middlewares)
介於Scrapy
引擎和調度之間的中間件,從Scrapy
引擎發送到調度的請求和響應。
從上面能夠看出,
Scrapy
的耦合性很低,擴展性更靈活,自定義性好
以下圖:
此圖來自大神的文章
按照上圖的序號,數據的執行流程以下:
引擎
從自定義爬蟲
中獲取初始化請求(種子URL--自定義爬蟲
文件中的start_urls
)調度器
中,同時引擎從調度器獲取一個待下載的請求
(兩者異步執行)待下載請求
待下載請求
發送給下載器
,中間會通過一系列下載器中間件
待下載請求
通過下載器處理以後,會生成一個響應對象(response)
,返回給引擎,中間會再次通過一系列下載器中間件
響應對象(response)
後,將其發送給自定義爬蟲
,執行自定義邏輯
,中間會通過一系列爬蟲中間件
響應對象(response)
通過內部的選擇器
篩選並調用回調函數
處理後,完成邏輯,生成結果對象
或新的請求對象
給引擎,再次通過一系列爬蟲中間件
結果對象
交給結果處理器
處理,將新的請求對象
交給調度器
新的請求對象
重複上述過程,直到沒有新的請求處理
新的請求對象:
多層URL的篩選中的下一層URL
==> 詳細組件關係,待解讀完源碼後繼續跟上。
上面介紹的僅僅是冰上一角,Scrapy提供了不少強大的特性是爬蟲更加高效,例如: