JAVA爬蟲Nutch、WebCollector的正則約束
爬蟲爬取時,須要約束爬取的範圍。
基本全部的爬蟲都是通過正則表達式來完畢這個約束。
最簡單的,正則:
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的正則約束