天天看點

(爬蟲)webmagic的基礎介紹(一)

原文來自:http://webmagic.io/docs/zh/

1. 一個架構,一個領域

一個好的架構必然凝聚了領域知識。WebMagic的設計參考了業界最優秀的爬蟲Scrapy,而實作則應用了HttpClient、Jsoup等Java世界最成熟的工具,目标就是做一個Java語言Web爬蟲的教科書般的實作。

如果你是爬蟲開發老手,那麼WebMagic會非常容易上手,它幾乎使用Java原生的開發方式,隻不過提供了一些子產品化的限制,封裝一些繁瑣的操作,并且提供了一些便捷的功能。

如果你是爬蟲開發新手,那麼使用并了解WebMagic會讓你了解爬蟲開發的常用模式、工具鍊、以及一些問題的處理方式。熟練使用之後,相信自己從頭開發一個爬蟲也不是什麼難事。

因為這個目标,WebMagic的核心非常簡單——在這裡,功能性是要給簡單性讓步的。

2. 微核心和高可擴充性

WebMagic由四個元件(Downloader、PageProcessor、Scheduler、Pipeline)構成,核心代碼非常簡單,主要是将這些元件結合并完成多線程的任務。這意味着,在WebMagic中,你基本上可以對爬蟲的功能做任何定制。

WebMagic的核心在webmagic-core包中,其他的包你可以了解為對WebMagic的一個擴充——這和作為使用者編寫一個擴充是沒有什麼差別的。

3. 注重實用性

雖然核心需要足夠簡單,但是WebMagic也以擴充的方式,實作了很多可以幫助開發的便捷功能。例如基于注解模式的爬蟲開發,以及擴充了XPath文法的Xsoup等。這些功能在WebMagic中是可選的,它們的開發目标,就是讓使用者開發爬蟲盡可能的簡單,盡可能的易維護。

1.2 總體架構

WebMagic的結構分為

Downloader

PageProcessor

Scheduler

Pipeline

四大元件,并由Spider将它們彼此組織起來。這四大元件對應爬蟲生命周期中的下載下傳、處理、管理和持久化等功能。WebMagic的設計參考了Scapy,但是實作方式更Java化一些。

而Spider則将這幾個元件組織起來,讓它們可以互互相動,流程化的執行,可以認為Spider是一個大的容器,它也是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. ResultItems

ResultItems

相當于一個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()
            //啟動爬蟲
            .run();
}
           

1.2.4 快速上手

上面介紹了很多元件,但是其實使用者需要關心的沒有那麼多,因為大部分子產品WebMagic已經提供了預設實作。

一般來說,對于編寫一個爬蟲,

PageProcessor

是需要編寫的部分,而

Spider

則是建立和控制爬蟲的入口。在第四章中,我們會介紹如何通過定制PageProcessor來編寫一個爬蟲,并通過Spider來啟動。