經過程序代碼將網頁中咱們須要的文本信息批量、自動保存下來。html
若是不用框架,徹底咱們本身手寫實現爬蟲的功能,思路流程應該是怎樣的?web
WebMagic框架就是作了上面流程的這些事,只須要咱們本身寫解析網頁html字符串和保存到數據庫的邏輯就好了(由於每一個網頁html字符串是不同的),其餘的都幫咱們寫好了。redis
WebMagic的內部實現也是生產者/消費者模式(後續的源碼分析篇會看到) ,四個組件根據名稱就能知道其大概功能:Downloader下載網頁的,PageProcesser解析html字符串的,Pipeline寫保存到數據庫的邏輯,Scheduler生產者/消費者模式中的阻塞隊列。
WebMagic的結構分爲Downloader、PageProcessor、Scheduler、Pipeline四大組件,並由Spider將它們彼此組織起來。這四大組件對應爬蟲生命週期中的下載、處理、管理和持久化等功能。下面是官方給的架構圖:數據庫
網頁下載器。將一個URL地址對應的網頁HTML文本下載到本地來。爲了提升下載效率,WebMagic在這一塊設計成了多線程實現的方式。 多線程
能夠繼承HttpClientDownloader,將下載失敗的URL保存到redis中。架構
頁面處理器。對下載到本地的網頁HTML文本進行分析,提取出咱們須要的文本。 併發
由於每一個網頁的內容是不一樣的,須要咱們自定義處理邏輯。框架
持久化操做。將提取出的文本保存到數據庫或文件中。 dom
一樣須要咱們自定義保存到數據庫的邏輯。分佈式
URL管理器。全部URL都會存到Scheduler中,它至關於一個保存URL字符串的容器,內置了使用set進行URL去重功能。當咱們須要爬取一個URL地址對應的網頁時,就把這個URL推送到Scheduler中。下載器Downloader每次會從Scheduler中拉取出一個URL進行下載——典型的生產者/消費者模式。
由於須要分佈式運行,因此須要咱們自定義基於redis保存URL的RedisScheduler類,能夠參考官方源碼webmagic-extension包中us.codecraft.webmagic.scheduler.RedisScheduler實現。
將四個組件串起來進行整個爬取流程的核心組件,也是整個流程的入口,每一個組件做爲Spider的一個屬性。
對請求的封裝,也能夠說是對URL的封裝,內部還包含一個extraMap, 用於傳遞一些額外的輔助信息
對Downloader下載到的HTML頁面的封裝,從中能夠獲取到網頁html文本,使用xpath解析dom提取出目標文本。
包裹從PageProcessor提取出來的數據,內部使用Map實現,用於PageProcessor和Pipeline之間的數據傳遞。
WebMagic將爬取網頁的流程分解成多個組件,封裝其中不變的成分,內部使用生產者/消費者模式實現爬蟲批量、自動爬取網頁的特性。