【Java爬蟲】WebMagic

中文文檔

http://webmagic.io/docs/zh/

概述

WebMagic是一款爬蟲框架,其底層用到了HttpClient和Jsoup。
WebMagic 項目代碼分爲核心和擴展兩部分。核心部分(webmagic-core)是一個精簡的、模塊化的爬蟲實現,而擴展部分則包括一些便利的、實用性的功能。

WebMagic的設計目標是儘量的模塊化,並體現爬蟲的功能特點。這部分提供非常簡單、靈活的API,在基本不改變開發模式的情況下,編寫一個爬蟲。
擴展部分(webmagic-extension)提供一些便捷的功能,例如註解模式編寫爬蟲等。同時內置了一些常用的組件,便於爬蟲開發。

架構介紹

WebMagic的結構分爲Downloader、PageProcessor、Scheduler、Pipeline四大組件,並由spider將它們彼此組織起來。這四大組件對應爬蟲生命週期中的下載、處理、管理和持久化等功能。WebMagic的設計參考了Scapy,但是實現方式更Java化一些。

而Spider則將這幾個組件組織起來,讓它們可以互相交互,流程化的執行,可以認爲Spider是一個大的容器,它也是WebMagic邏輯的核心。

WebMagic總體架構圖如下:
在這裏插入圖片描述

WebMagic的四個組件。

1.Downloader
Downloader 負責從互聯網上下載頁面,以便後續處理。WebMagic默認使用了Apache HttpClient作爲下載工具。

2.PageProcessore
PageProcessor 負責解析頁面,抽取有用信息,以及發現新的鏈接。WebMagic使用Jsoup作爲HTML解析工具,並基於其開發瞭解析XPath的工具Xsoup。在這四個組件中,PageProcessor對於每個站點每個頁面都不一樣,是需要使用者定製的部分。

3.Scheduler
Scheduler負責管理待抓取的URL,以及一些去重的工作。WebMagic默認提供了JDK的內存隊列來管理URL,並用集合來進行去重。也支持使用Redis進行分佈式管理。

4.Pipeline Pipeline負責抽取結果的處理,包括計算、持久化到文件、數據庫等。WebMagic默認提供了“輸出到控制檯”和“保存到文件”兩種結果處理方案。
Pipeline定義了結果保存的方式,如果你要保存到指定數據庫,則需要編寫對應的Pipeline。對於一類需求一般只需編寫一個Pipeline。

用於數據流轉的對象。

1.Request
Request是對URL地址的一層封裝,一個Request對應一個URL地址。

它是PageProcessor與Downloader交互的載體,也是PageProcessor 控制Downloader唯一方式。

除了URL本身外,它還包含一個Key-Value結構的字段extra。你可以在extra中保存一些特殊的屬性,然後在其他地方讀取,以完成不同的功能。例如附加上一個頁面的一些信息等。

2.Page
Page代表了從Downloader下載到的一個頁面—可能是HTML,也可能是JSON或者其他文本格式的內容。

Page是WebMagic抽取過程的核心對象,它提供一些方法可供抽取、結果保存等。

3.Resultltemse
Resultitems相當於一個Map,它保存PageProcessor處理的結果,供Pipeline使用。它的API與Map很類似,值得注意的是它有一個字段skip,若設置爲true,則不應被Pipeline處理。

實現 PageProcessor

抽取元素Selectable

WebMagic裏主要使用了三種抽取技術:XPath、正則表達式和CSs選擇器。

另外,對於JSON格式的內容,可使用JsonPath進行解析。

1.XPath
以上是獲取屬性class=mt的div標籤,裏面的h1標籤的內容。
page.getHtml().xpath("//div[@class=mt]/h1/text()")

2.CSS選擇器
CSS選擇器是與XPath類似。

3.正則表達式。
正則表達式則是一種通用的文本抽取語言。在這裏一般用於獲取url地址。

抽取API

Selectable相關的抽取元素鏈式APl是WebMagic的一個核心功能。使用Selectable接口,可以直接完成頁面元素的鏈式抽取,也無需去關心抽取的細節。

在剛纔的例子中可以看到,page.getHtml()返回的是一個Html對象,它實現了Selectable接口。這個接口包含的方法分爲兩類:抽取部分和獲取結果部分。

在這裏插入圖片描述
這部分抽取API返回的都是一個selectable接口

獲取結果API

當鏈式調用結束時,我們一般都想要拿到一個字符串類型的結果。這時候就需要用到獲取結果的API了。

我們知道,一條抽取規則,無論是XPath、CSS選擇器或者正則表達式,總有可能抽取到多條元素。WebMagic對這些進行了統一,可以通過不同的API獲取到一個或者多個元素。

在這裏插入圖片描述

獲取鏈接

有了處理頁面的邏輯,我們的爬蟲就接近完工了,但是現在還有一個問題:
一個站點的頁面是很多的,一開始我們不可能全部列舉出來,於是如何發現後續的鏈接,是一個爬蟲不可缺少的一部分。

使用Pipline保存結果

WebMagic用於保存結果的組件做Pipeline。我們現在通過“控制檯輸出結果”這件事也是通過一個內置的Pipeline完成的,它叫做consolePipeline。

在這裏插入圖片描述
實現子類

爬蟲的配置, 啓動 和 終止

Spider

Spider是爬蟲啓動的入口。在啓動爬蟲之前,我們需要使用一個PageProcessor創建一個Spider對象,然後使用run()進行啓動。

同時Spider的其他組件(Downloader、Scheduler、Pipeline)都可以通過set方法來進行設置。

在這裏插入圖片描述
在這裏插入圖片描述

爬蟲配置 Site

Site.me()可以對爬蟲進行一些配置配置,包括編碼、抓取間隔、超時時間、重試次數等。在這裏我們先簡單設置一下:重試次數爲3次,抓取間隔爲一秒。

站點本身的一些配置信息,例如編碼、HTTP頭、超時時間、重試策略等、代理等,都可以通過設置Site對象來進行配置。

在這裏插入圖片描述
在這裏插入圖片描述

爬蟲分類

網絡爬蟲按照系統結構和實現技術,大致可以分爲以下幾種類型:
通用網絡爬蟲、
聚焦網絡爬蟲、
增量式網絡爬蟲、
深層網絡爬蟲。
實際的網絡爬蟲系統通常是幾種爬蟲技術相結合實現的。

通用網絡爬蟲.
通用網絡爬蟲又稱全網爬蟲(Scalable Web Crawler),爬行對象從一些種子URL擴充到整個Web,主要爲門戶黏點搜索引擎和大型Web服務提供商採集數據。

這類網絡爬蟲的爬行範圍和數量巨大,對於爬行速度和存儲空間要求較高,對於爬行頁面的順序要求相對較低,同時由於待刷新的頁面太多,通常採用並行工作方式,但需要較長時間才能刷新一次頁面。

簡單的說就是互聯網上抓取所有數據。

聚焦網絡爬蟲。
聚焦網絡爬蟲(Focused Crawler),又稱主題網絡爬蟲(Topical Crawler),是指選擇性地爬行那些與預先定義好的主題相關原面的網絡爬蟲。。

和通用網絡爬蟲相比,聚焦爬蟲只需要爬行與主題相關的頁面,極大地節省了硬件和網絡資源,保存的頁面也由於數量少而更新快,還可以很好地滿足一些特定人羣對特定領域信息的需求。

簡單的說就是互聯網上只抓取某一種數據。

增量式網絡爬蟲。
增量式網絡爬蟲(Incremental Web Crawler)是指對己下載網頁採取增量式更新和只爬行新產生的或者已經發生變化網頁的爬蟲,它能夠在一定程度上保證所爬行的頁面是儘可能新的頁面。

和週期性爬行和刷新頁面的網絡爬蟲相比,增量式爬蟲只會在需要的時候爬行新產生或發生更新的頁面,並不重新下載沒有發生變化的頁面,可有效減少數據下載量,及時更新已爬行的網頁,減小時間和空間上的耗費,但是增加了爬行算法的複雜度和實現難度。

簡單的說就是互聯網上只抓取剛剛更新的數據。

Deep Web爬蟲。
Web頁面按存在方式可以分爲表層網頁(SurfacWeb)和深層網頁(Deep Web,也稱 Invisible Web Pages 或Hidden Web)。

表層網頁是指傳統搜索引擎可以索引的頁面,以超鏈接可以到達的靜態網頁爲主構成的Web頁面。

Deep Web是那些大部分內容不能通過靜態鏈接獲取的、隱藏在搜索表單後的,只有用戶提交一些關鍵詞才能獲得的Web頁面。

環境準備

加入依賴

需要兩個包 核心包和拓展包
在這裏插入圖片描述

  <!-- https://mvnrepository.com/artifact/us.codecraft/webmagic-core -->
    <dependency>
      <groupId>us.codecraft</groupId>
      <artifactId>webmagic-core</artifactId>
      <version>0.7.3</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/us.codecraft/webmagic-extension -->
    <dependency>
      <groupId>us.codecraft</groupId>
      <artifactId>webmagic-extension</artifactId>
      <version>0.7.3</version>
    </dependency>

注意:0.7.3版本對SSL的並不完全,如果是直接從Maven中央倉庫下載依賴,在爬取只支持SSLv1.2的網站會有SSL的異常拋出。

解決方案:
1.等作者的0.7.4的版本發佈。
2.直接從github上下載最新的代碼,安裝到本地倉庫。
也可以參考以下資料自己修復。
https://github.com/code4craft/webmagic/issues/701

加入配置文件

WebMagic使用slf4j-log4j12作爲slf4j的實現。
添加log4j.properties配置文件

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章