webmagic核心設計和運行機制分析

爬蟲

經過程序代碼將網頁中咱們須要的文本信息批量、自動保存下來。html

本身如何實現

若是不用框架,徹底咱們本身手寫實現爬蟲的功能,思路流程應該是怎樣的?web

  1. 使用http類庫下載一個起始url獲得html字符串
  2. 解析html字符串獲得咱們須要的文本字符串
  3. 將第2步解析獲得的文本字符串保存到數據庫
  4. 若是起始url是博客文章列表頁,咱們還須要從html字符串中解析出每篇文章詳細信息的url地址,再下載、解析文章詳細信息url的網頁html拿到文章的正文內容。這個過程確定不能是手動的,第一想法是使用個內存阻塞隊列來存儲要爬取的url,而後多線程-生產者消費者模式去解決。

WebMagic框架就是作了上面流程的這些事,只須要咱們本身寫解析網頁html字符串和保存到數據庫的邏輯就好了(由於每一個網頁html字符串是不同的),其餘的都幫咱們寫好了。redis

WebMagic的內部實現也是生產者/消費者模式(後續的源碼分析篇會看到) ,四個組件根據名稱就能知道其大概功能:Downloader下載網頁的,PageProcesser解析html字符串的,Pipeline寫保存到數據庫的邏輯,Scheduler生產者/消費者模式中的阻塞隊列。

WebMagic核心設計

WebMagic的結構分爲Downloader、PageProcessor、Scheduler、Pipeline四大組件,並由Spider將它們彼此組織起來。這四大組件對應爬蟲生命週期中的下載、處理、管理和持久化等功能。下面是官方給的架構圖:數據庫

圖片描述

四個組件

Downloader

網頁下載器。將一個URL地址對應的網頁HTML文本下載到本地來。爲了提升下載效率,WebMagic在這一塊設計成了多線程實現的方式。 多線程

能夠繼承HttpClientDownloader,將下載失敗的URL保存到redis中。架構

PageProcessor

頁面處理器。對下載到本地的網頁HTML文本進行分析,提取出咱們須要的文本。 併發

由於每一個網頁的內容是不一樣的,須要咱們自定義處理邏輯。框架

Pipeline

持久化操做。將提取出的文本保存到數據庫或文件中。 dom

一樣須要咱們自定義保存到數據庫的邏輯。分佈式

Scheduler

URL管理器。全部URL都會存到Scheduler中,它至關於一個保存URL字符串的容器,內置了使用set進行URL去重功能。當咱們須要爬取一個URL地址對應的網頁時,就把這個URL推送到Scheduler中。下載器Downloader每次會從Scheduler中拉取出一個URL進行下載——典型的生產者/消費者模式。

由於須要分佈式運行,因此須要咱們自定義基於redis保存URL的RedisScheduler類,能夠參考官方源碼webmagic-extension包中us.codecraft.webmagic.scheduler.RedisScheduler實現。

執行引擎Spider

將四個組件串起來進行整個爬取流程的核心組件,也是整個流程的入口,每一個組件做爲Spider的一個屬性。

數據流轉組件

Request

對請求的封裝,也能夠說是對URL的封裝,內部還包含一個extraMap, 用於傳遞一些額外的輔助信息

Page

對Downloader下載到的HTML頁面的封裝,從中能夠獲取到網頁html文本,使用xpath解析dom提取出目標文本。

ResultItems

包裹從PageProcessor提取出來的數據,內部使用Map實現,用於PageProcessor和Pipeline之間的數據傳遞。

WebMagic運行機制

圖片描述

  1. 建立Spider對象,設置自定義的PageProcessor和Pipeline,若是自定義了RedisScheduler則設置,不然使用默認內存阻塞隊列實現的Scheduler,設置併發線程數,添加起始url,啓動爬蟲run()。
  2. 將封裝起始url的Request對象推送到Scheduler的阻塞隊列中。
  3. Downloader從Scheduler中拉取Request進行下載,將獲得的網頁html文本封裝成Page對象傳遞給PageProcessor。
  4. PageProcessor中自定義的解析邏輯從html文本中提取到目標文本,封裝成ResultItems對象傳遞給Pipeline。
  5. Pipeline中自定義的持久化邏輯將目標文本保存到數據庫。
  6. 若是html文本中有咱們後續須要爬取的頁面url,將其提取出推送到Scheduler,繼續整個生產者/消費者循環。

小結

WebMagic將爬取網頁的流程分解成多個組件,封裝其中不變的成分,內部使用生產者/消費者模式實現爬蟲批量、自動爬取網頁的特性。

相關文章
相關標籤/搜索