1. 程式人生 > >JAVA爬蟲Nutch、WebCollector的正則約束

JAVA爬蟲Nutch、WebCollector的正則約束

pre 掃描 utc href inf tracking script nutch rac

爬蟲爬取時,須要約束爬取的範圍。

基本全部的爬蟲都是通過正則表達式來完畢這個約束。

最簡單的,正則:

http://www.xinhuanet.com/.*
代表"http://www.xinhuanet.com/"後加隨意個隨意字符(能夠是0個)。

通過這個正則能夠約束爬蟲的爬取範圍,可是這個正則並非表示爬取新華網全部的網頁。

新華網並非僅僅有www.xinhuanet.com這一個域名,還有非常多子域名,類似:news.xinhuanet.com

這個時候我們須要定義這樣一個正則:

http://([a-z0-9]*\.)*xinhuanet.com/
這樣就能夠限制爬取新華網全部的網頁了。

每種爬蟲的正則約束系統都有一些差別,這裏拿Nutch、WebCollector兩家爬蟲的正則系統做對照:

Nutch官網:http://nutch.apache.org/

WebCollector官網:http://crawlscript.github.io/WebCollector/

1.Nutch:

nutch的正則約束是依賴一個配置文件 conf/regex-urlfilter.txt 來實現的。

比如:


+^http://www.xinhuanet.com/
+^http://news.xinhuanet.com/
-^http://blog.xinhuanet.com/

nutch的正則約束原則是:

1)逐行掃描,對每一行進行例如以下操作:

去掉正則前面的加號或減號。獲取正則式。看待爬取網頁的url中是否包括當前正則的模式。假設包括。看正則前的符合。假設為+,則當前url無需過濾。返回當前url,假設為-,則當前url須要過濾。返回null。假設待爬取網頁url中不包括當前正則的模式,則跳過(繼續下一行操作)。

2)假設掃描到文件結尾,都沒有返回:

返回null。


有2個地方須要註意:

1)nutch的正則過濾時,採用的匹配函數式Patterm.matcher。而不是Patterm.matches。

Patterm.mather在匹配時。僅僅要找到待爬取網頁的url的子串和正則匹配,就通過。

Patterm.matcher要求待爬取網頁的url和regex全然匹配。比如:

待爬取網頁的網址是 http://www.xinhuanet.com/index.html

正則是^http://([a-z0-9]*\.)*xinhuanet.com

這個正則用Patterm.matcher和網頁url能夠匹配。由於網頁url的字串http://www.xinhuanet.com和正則能匹配。

可是用Patterm.matches就不能匹配。

正則須要改成^http://([a-z0-9]*\.)*xinhuanet.com.*才幹夠和網頁的URL匹配。

也就是說nutch的正則事實上是和找url中是否有字串符合正則。所以做nutch的正則配置文件時。要在http前增加^符號,假設正則沒有加^符號,比如+http://www.xinhuanet.com ,以下網址也是能夠匹配的:

http://www.abc.com/index.php?name=http://www.xinhuanet.com


2)nutch正則過濾時,是逐行掃描,一旦掃描到匹配行就返回結果。所以正則式的順序非常重要。比如能夠通過以下的配置文件來完畢全網爬取(須要過濾圖片等文件為不爬取):

-\.(gif|GIF|jpg|JPG|ico|ICO|css|sit|eps|wmf|zip|ppt|mpg|xls|gz|rpm|tgz|mov|MOV|exe)$
+.
先掃描第一行,遇到gif、JPG等文件,會匹配正則。因為前面符號是-,所以返回null,url被過濾。

假設當前url不正確應gif、JPG等文件,會繼續掃描第二行,第二行能夠匹配隨意字符串。因為前面符號是+。所以返回當前url。當前url被接受。


2.WebCollector:

WebCollector的正則約束是直接通過程序指定的:

BreadthCrawler crawler=new BreadthCrawler();
.....
.....
crawler.addRegex("+http://www\\.xinhuanet\\.com/.*");
crawler.addRegex("-http://www\\.xinhuanet\\.com/special/.*");
crawler.addRegex("-http://www\\.xinhuanet\\.com/info/.*");

WebCollector中正則有兩種。正例正則,和反例正則。

url要被接受。須要符合以下2個條件。

1.至少符合一條正例正則。

2.不能符合隨意一條反例正則。


正例正則以+開頭,反例正則以-開頭(假設前面不加符號,默認是正例正則)。


上面代碼中,http://www.xinhuanet.com/auto/index.html就能夠被接受。由於它符合一條正例http://www.xinhuanet.com/.* ,不符合隨意一條反例正則(http://www.xinhuanet.com/special/.*和http://www.xinhuanet.com/info/.*)。

必須給出至少一條正例正則,才幹夠進行爬取,假設沒有正例正則,不能符合上面的條件一。

WebCollector中正則匹配採用的是Patterm.matches。要求正則與URL全然匹配。

假設上面代碼中你的正則寫成+http://www.xinhuanet.com/,而不是+http://www.xinhuanet.com/.*,那麽僅僅有網頁http://www.xinhuanet.com/能夠被接受,網頁http://www.xinhuanet.com/index.html就不能被接收。


以下給出一個樣例,爬取新華網的news.xinhuanet.com子域名。過濾掉gif和jpg圖像:

BreadthCrawler crawler=new BreadthCrawler();
.....
.....
crawler.addRegex("+http://news\\.xinhuanet\\.com/.*");
crawler.addRegex("-.*gif.*");
crawler.addRegex("-.*jpg.*");



JAVA爬蟲Nutch、WebCollector的正則約束