http://webmagic.io/docs/zh/posts/ch1-overview/architecture.html
1.2 總體架構
WebMagic的結構分爲Downloader
、PageProcessor
、Scheduler
、Pipeline
四大組件,並由Spider將它們彼此組織起來。這四大組件對應爬蟲生命週期中的下載、處理、管理和持久化等功能。WebMagic的設計參考了Scapy,但是實現方式更Java化一些。
而Spider則將這幾個組件組織起來,讓它們可以互相交互,流程化的執行,可以認爲Spider是一個大的容器,它也是WebMagic邏輯的核心。
WebMagic總體架構圖如下:
1.2.1 WebMagic的四個組件
1.Downloader
Downloader負責從互聯網上下載頁面,以便後續處理。WebMagic默認使用了Apache HttpClient作爲下載工具。
2.PageProcessor
PageProcessor負責解析頁面,抽取有用信息,以及發現新的鏈接。WebMagic使用Jsoup作爲HTML解析工具,並基於其開發瞭解析XPath的工具Xsoup。
在這四個組件中,PageProcessor
對於每個站點每個頁面都不一樣,是需要使用者定製的部分。
3.Scheduler
Scheduler負責管理待抓取的URL,以及一些去重的工作。WebMagic默認提供了JDK的內存隊列來管理URL,並用集合來進行去重。也支持使用Redis進行分佈式管理。
除非項目有一些特殊的分佈式需求,否則無需自己定製Scheduler。
4.Pipeline
Pipeline負責抽取結果的處理,包括計算、持久化到文件、數據庫等。WebMagic默認提供了“輸出到控制檯”和“保存到文件”兩種結果處理方案。
Pipeline
定義了結果保存的方式,如果你要保存到指定數據庫,則需要編寫對應的Pipeline。對於一類需求一般只需編寫一個Pipeline
。
1.2.2 用於數據流轉的對象
1. Request
Request
是對URL地址的一層封裝,一個Request對應一個URL地址。
它是PageProcessor與Downloader交互的載體,也是PageProcessor控制Downloader唯一方式。
除了URL本身外,它還包含一個Key-Value結構的字段extra
。你可以在extra中保存一些特殊的屬性,然後在其他地方讀取,以完成不同的功能。例如附加上一個頁面的一些信息等。
2. Page
Page
代表了從Downloader下載到的一個頁面——可能是HTML,也可能是JSON或者其他文本格式的內容。
Page是WebMagic抽取過程的核心對象,它提供一些方法可供抽取、結果保存等。在第四章的例子中,我們會詳細介紹它的使用。
3. ReusltItems
ReusltItems
相當於一個Map,它保存PageProcessor處理的結果,供Pipeline使用。它的API與Map很類似,值得注意的是它有一個字段skip
,若設置爲true,則不應被Pipeline處理。
1.2.3 控制爬蟲運轉的引擎--Spider
Spider是WebMagic內部流程的核心。Downloader、PageProcessor、Scheduler、Pipeline都是Spider的一個屬性,這些屬性是可以自由設置的,通過設置這個屬性可以實現不同的功能。Spider也是WebMagic操作的入口,它封裝了爬蟲的創建、啓動、停止、多線程等功能。下面是一個設置各個組件,並且設置多線程和啓動的例子。詳細的Spider設置請看第四章——爬蟲的配置、啓動和終止。
public static void main(String[] args) {
Spider.create(new GithubRepoPageProcessor())
//從https://github.com/code4craft開始抓
.addUrl("https://github.com/code4craft")
//設置Scheduler,使用Redis來管理URL隊列
.setScheduler(new RedisScheduler("localhost"))
//設置Pipeline,將結果以json方式保存到文件
.addPipeline(new JsonFilePipeline("D:\\data\\webmagic"))
//開啓5個線程同時執行
.thread(5)
//啓動爬蟲
.run();
}
1.2.4 快速上手
上面介紹了很多組件,但是其實使用者需要關心的沒有那麼多,因爲大部分模塊WebMagic已經提供了默認實現。
一般來說,對於編寫一個爬蟲,PageProcessor
是需要編寫的部分,而Spider
則是創建和控制爬蟲的入口。在第四章中,我們會介紹如何通過定製PageProcessr來編寫一個爬蟲,並通過Spider來啓動。