Web Magic 总体架构
1.2 總體架構(gòu)
WebMagic的結(jié)構(gòu)分為Downloader、PageProcessor、Scheduler、Pipeline四大組件,并由Spider將它們彼此組織起來。這四大組件對(duì)應(yīng)爬蟲生命周期中的下載、處理、管理和持久化等功能。WebMagic的設(shè)計(jì)參考了Scapy,但是實(shí)現(xiàn)方式更Java化一些。
而Spider則將這幾個(gè)組件組織起來,讓它們可以互相交互,流程化的執(zhí)行,可以認(rèn)為Spider是一個(gè)大的容器,它也是WebMagic邏輯的核心。
WebMagic總體架構(gòu)圖如下:
1.2.1 WebMagic的四個(gè)組件
1.Downloader
Downloader負(fù)責(zé)從互聯(lián)網(wǎng)上下載頁(yè)面,以便后續(xù)處理。WebMagic默認(rèn)使用了Apache HttpClient作為下載工具。
2.PageProcessor
PageProcessor負(fù)責(zé)解析頁(yè)面,抽取有用信息,以及發(fā)現(xiàn)新的鏈接。WebMagic使用Jsoup作為HTML解析工具,并基于其開發(fā)了解析XPath的工具Xsoup。
在這四個(gè)組件中,PageProcessor對(duì)于每個(gè)站點(diǎn)每個(gè)頁(yè)面都不一樣,是需要使用者定制的部分。
3.Scheduler
Scheduler負(fù)責(zé)管理待抓取的URL,以及一些去重的工作。WebMagic默認(rèn)提供了JDK的內(nèi)存隊(duì)列來管理URL,并用集合來進(jìn)行去重。也支持使用Redis進(jìn)行分布式管理。
除非項(xiàng)目有一些特殊的分布式需求,否則無需自己定制Scheduler。
4.Pipeline
Pipeline負(fù)責(zé)抽取結(jié)果的處理,包括計(jì)算、持久化到文件、數(shù)據(jù)庫(kù)等。WebMagic默認(rèn)提供了“輸出到控制臺(tái)”和“保存到文件”兩種結(jié)果處理方案。
Pipeline定義了結(jié)果保存的方式,如果你要保存到指定數(shù)據(jù)庫(kù),則需要編寫對(duì)應(yīng)的Pipeline。對(duì)于一類需求一般只需編寫一個(gè)Pipeline。
1.2.2 用于數(shù)據(jù)流轉(zhuǎn)的對(duì)象
1. Request
Request是對(duì)URL地址的一層封裝,一個(gè)Request對(duì)應(yīng)一個(gè)URL地址。
它是PageProcessor與Downloader交互的載體,也是PageProcessor控制Downloader唯一方式。
除了URL本身外,它還包含一個(gè)Key-Value結(jié)構(gòu)的字段extra。你可以在extra中保存一些特殊的屬性,然后在其他地方讀取,以完成不同的功能。例如附加上一個(gè)頁(yè)面的一些信息等。
2. Page
Page代表了從Downloader下載到的一個(gè)頁(yè)面——可能是HTML,也可能是JSON或者其他文本格式的內(nèi)容。
Page是WebMagic抽取過程的核心對(duì)象,它提供一些方法可供抽取、結(jié)果保存等。在第四章的例子中,我們會(huì)詳細(xì)介紹它的使用。
3. ResultItems
ResultItems相當(dāng)于一個(gè)Map,它保存PageProcessor處理的結(jié)果,供Pipeline使用。它的API與Map很類似,值得注意的是它有一個(gè)字段skip,若設(shè)置為true,則不應(yīng)被Pipeline處理。
1.2.3 控制爬蟲運(yùn)轉(zhuǎn)的引擎--Spider
Spider是WebMagic內(nèi)部流程的核心。Downloader、PageProcessor、Scheduler、Pipeline都是Spider的一個(gè)屬性,這些屬性是可以自由設(shè)置的,通過設(shè)置這個(gè)屬性可以實(shí)現(xiàn)不同的功能。Spider也是WebMagic操作的入口,它封裝了爬蟲的創(chuàng)建、啟動(dòng)、停止、多線程等功能。下面是一個(gè)設(shè)置各個(gè)組件,并且設(shè)置多線程和啟動(dòng)的例子。詳細(xì)的Spider設(shè)置請(qǐng)看第四章——爬蟲的配置、啟動(dòng)和終止。
1 public static void main(String[] args) { 2 Spider.create(new GithubRepoPageProcessor()) 3 //從https://github.com/code4craft開始抓 4 .addUrl("https://github.com/code4craft") 5 //設(shè)置Scheduler,使用Redis來管理URL隊(duì)列 6 .setScheduler(new RedisScheduler("localhost")) 7 //設(shè)置Pipeline,將結(jié)果以json方式保存到文件 8 .addPipeline(new JsonFilePipeline("D:\\data\\webmagic")) 9 //開啟5個(gè)線程同時(shí)執(zhí)行 10 .thread(5) 11 //啟動(dòng)爬蟲 12 .run(); 13 }?
1.2.4 快速上手
上面介紹了很多組件,但是其實(shí)使用者需要關(guān)心的沒有那么多,因?yàn)榇蟛糠帜KWebMagic已經(jīng)提供了默認(rèn)實(shí)現(xiàn)。
一般來說,對(duì)于編寫一個(gè)爬蟲,PageProcessor是需要編寫的部分,而Spider則是創(chuàng)建和控制爬蟲的入口。在第四章中,我們會(huì)介紹如何通過定制PageProcessor來編寫一個(gè)爬蟲,并通過Spider來啟動(dòng)。
轉(zhuǎn)載于:https://www.cnblogs.com/thomas12112406/p/6560320.html
總結(jié)
以上是生活随笔為你收集整理的Web Magic 总体架构的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 04 linux用户群组和权限
- 下一篇: POJ 3468 A Simple Pr