Web Magic 總體架構

1.2 總體架構

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

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

WebMagic總體架構圖如下:

image

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設置請看第四章——爬蟲的配置、啟動和終止。

 1 public static void main(String[] args) {
 2     Spider.create(new GithubRepoPageProcessor())
 3             //從https://github.com/code4craft開始抓    
 4             .addUrl("https://github.com/code4craft")
 5             //設置Scheduler,使用Redis來管理URL隊列
 6             .setScheduler(new RedisScheduler("localhost"))
 7             //設置Pipeline,將結果以json方式保存到文件
 8             .addPipeline(new JsonFilePipeline("D:\\data\\webmagic"))
 9             //開啟5個線程同時執行
10             .thread(5)
11             //啟動爬蟲
12             .run();
13 }

?

1.2.4 快速上手

上面介紹了很多組件,但是其實使用者需要關心的沒有那么多,因為大部分模塊WebMagic已經提供了默認實現。

一般來說,對于編寫一個爬蟲,PageProcessor是需要編寫的部分,而Spider則是創建和控制爬蟲的入口。在第四章中,我們會介紹如何通過定制PageProcessor來編寫一個爬蟲,并通過Spider來啟動。

轉載于:https://www.cnblogs.com/thomas12112406/p/6560320.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/372668.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/372668.shtml
英文地址,請注明出處:http://en.pswp.cn/news/372668.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

L1-006. 連續因子

一個正整數N的因子中可能存在若干連續的數字。例如630可以分解為3*5*6*7,其中5、6、7就是3個連續的數字。給定任一正整數N,要求編寫程序求出最長連續因子的個數,并輸出最小的連續因子序列。 輸入格式: 輸入在一行中給出一個正整數…

基于Java JAAS表單的身份驗證

使用JAAS實現登錄模塊是一個高級主題,而且大多數開發人員也很少有機會參與這種開發。 但是JAAS登錄模塊的基本實現并不是那么困難,這是因為我打算將其發布。 在這里,我正在解釋如何實現tomcat管理的身份驗證模塊。 此實現與容器無關。 我們可…

java自動投票代碼,Java 投票(自動添一)

Java 投票(自動加一)數據庫建立:SQL> create table vote(2 id number,3 name varchar(200),4 num number5 );//index.jsppageEncoding"utf-8"%>投票Connection conn1 null;Statement stmt1 null;ResultSet rs1 null;try {Class.forName("or…

SpringMVC搭建+實例

想做一點自己喜歡的東西,研究了一下springMVC,所以就自己搭建一個小demo,可供大家吐槽。 先建一個WEB工程,這個相信大家都會,這里不在多說。去網上下載spring jar包,然后在WEB-INF下新建一個lib文件,將下載的jar包放進…

Mockito和Hamcrest的試駕制造商

過去,很多人問我是否測試吸氣劑和吸氣劑(屬性,屬性等)。 他們還問我是否測試我的建筑商。 在我看來,答案取決于情況。 當使用遺留代碼時,我不會費心去測試數據結構,這意味著對象只帶有getter和s…

php8更新,PHP 8 中新特性以及重大調整

PHP 8,PHP 的一個新的大版本,預計將于2020年12月3日發布,這意味著將不會有 PHP 7.5 版本。PHP8目前正處于非常活躍的開發階段,所以在接下來的幾個月里,情況可能會發生很大的變化。在這篇文章中,我會維持一個…

Javascript學習之函數(function)

http://www.cnblogs.com/royalroads/p/4418587.html 在JS中,Function(函數)類型實際上是對象;每個函數都是Function類型的實例,而且都與其他引用類型一樣具有屬性和方法。由于函數是對象,因此函數名實際上也是一個指向函數對象的指針。 一 函數的聲明方式 //1.函數聲…

jquery彈出可關閉遮罩提示框

jquery CSS3遮罩彈出層動畫效果,使用非常簡單,就兩個標簽,里面自定義內容和樣式,四種常見效果,懂的朋友還可以修改源代碼修改成自己想要的效果效果展示 http://hovertree.com/texiao/jquery/85/代碼如下: &…

用于Spring JPA2后端的REST CXF

在本演示中,我們將使用spring / jpa2后端生成一個REST / CXF應用程序。 該演示演示了分鐘項目的軌跡REST-CXF 。 演示2中的模型保持不變。 濃縮保持不變。 但是軌道改變了 添加的是2層: 在JPA2之上具有彈簧集成的DAO層 具有JAX-RS批注的REST-CXF層…

php與服務器關系,php與web服務器關系

1.什么是cgi程序,cgi與fastcgi的區別CGI的中文名稱是通用網關接口,是外部應用程序與web服務器之間的接口標準。CGI規范允許web服務器執行外部程序,并將它們的輸出發送給web瀏覽器。而fastcgi則是一個常駐型的cgi,它可以一直執行著…

POJ 3468 A Simple Problem with Integers(線段樹:區間更新)

http://poj.org/problem?id3468 題意: 給出一串數,每次在一個區間內增加c,查詢[a,b]時輸出a、b之間的總和。 思路: 總結一下懶惰標記的用法吧。 比如要對一個區間范圍內的數都要加c,在找到這個區間之后,本…

php 新浪url,PHP?URL函數詳解

php url函數:parse_url()parse_url(PHP 3, PHP 4, PHP 5)parse_url -- 解析 URL,歸來其構成局部解釋array parse_url ( string url )本函數解析一個 URL 并歸來一個關系數組,包括在 URL 中揭示的各種構成局部。本函數不是用來檢討給定 URL 的合法性的&am…

完整的WebApplication JSF EJB JPA JAAS –第1部分

這篇文章將是迄今為止我博客中最大的一篇文章! 我們將看到完整的Web應用程序。 最新的技術將完成此工作(直到今天),但是我將給出一些提示以顯示如何使本文適用于較舊的技術。 在本文的結尾,您將找到要下載的源代碼。 您…

Ajax和JavaScript的區別

javascript是一種在瀏覽器端執行的腳本語言,Ajax是一種創建交互式網頁應用的開發技術 ,它是利用了一系列相關的技術其中就包括javascript。Javascript是由網景公司開發的一種腳本語言,它和sun公司的java語言是沒有任何關系的,它們…

大一

以后準備開始ACM的題目啦轉載于:https://www.cnblogs.com/Aiden-/p/6562038.html

概念驗證:玩! 構架

我們正在開始一個新項目,我們必須選擇Web框架。 我們的默認選擇是grails,因為團隊已經擁有使用它的經驗,但是我決定給Play! 和Scala有機會。 玩! 有很多很酷的東西,在我的評估中,它得到了很多加…

ldap統一用戶認證php,針對LDAP服務器進行身份認證

Symfony提供了不同的方法來配合LDAP服務器使用。Security組件提供:ldap user provider,使用的是form_login_ldap authentication provider,用于針對一臺使用了表單登錄的LDAP服務器。同所有其他user provider一樣,它可以同任何aut…

每天CookBook之JavaScript-039

IIFE的使用<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>039</title> </head> <body></body> <script type"text/javascript"> (function () {var i 0;fu…

Day-6:創建計算字段

字段&#xff1a;基本上與列的意思相同&#xff0c;經常互換使用&#xff0c;計算字段是運行時在SELECT語句內創建的&#xff0c;不實際存在于數據庫表中。 拼接字段&#xff1a;將值聯結到一起構成單個值 SQL中的SELECT語句中可以使用或||操作符拼接&#xff0c;但mysql中必須…

使用Hibernate加載或保存圖像-MySQL

本教程將引導您逐步了解如何使用Hibernate從數據庫&#xff08; MySQL &#xff09;保存和加載圖像。 要求 對于此示例項目&#xff0c;我們將使用&#xff1a; Eclipse IDE &#xff08;您可以使用自己喜歡的IDE&#xff09;&#xff1b; MySQL &#xff08;您可以使用任何…