2 宽度优先爬虫和带偏好的爬虫(4)
5 Java帶偏好的爬蟲示例
在上一節中,我們已經指出,可以使用優先級隊列(PriorityQueue)來實現這個帶偏好的爬蟲。在深入講解之前,我們首先介紹優先級隊列。
優先級隊列是一種特殊的隊列,普通隊列中的元素是先進先出的,而優先級隊列則是根據進入隊列中的元素的優先級進行出隊列操作。例如操作系統的一些優先級進程管理等,都可以使用優先級隊列。優先級隊列也有最小優先級隊列和最大優先級隊列兩種。
理論上,優先級隊列可以是任何一種數據結構,線性的和非線性的,也可以是有序的或無序的。針對有序的優先級隊列而言,獲取最小或最大的值是非常容易的,但是插入卻非常困難;而對于無序的有銜接隊列而言,插入是很容易的,但是獲取最大和最小值是很麻煩的。根據以上的分析,可以使用“堆”這種折中的數據結構來實現優先級隊列。
從JDK1.5開始,Java提供了內置的支持優先級隊列的數據結構——java.util.PriorityQueue。
我們在上邊的代碼中,只要稍微修改一下,就可以支持從URL隊列中選擇優先級高的URL。
LinkQueue類:
?
1 public class LinkQueue{2 //已訪問的URL集合3 private static Set visitedUrl=new HashSet();4 //待訪問的URL集合5 private static Queueun VisitedUrl=new PriorityQueue();6 //獲得URL隊列7 public static Queue getUnVisitedUrl(){8 return unVisitedUrl;9 } 10 //添加到訪問過的URL隊列中 11 public static void addVisitedUrl(String url){ 12 visitedUrl.add(url); 13 } 14 //移除訪問過的URL 15 public static void removeVisitedUrl(String url){ 16 visitedUrl.remove(url); 17 } 18 //未訪問的URL出隊列 19 public static Object unVisitedUrlDeQueue(){ 20 return unVisitedUrl.poll(); 21 } 22 //保證每個URL只被訪問一次 23 public static void addUnvisitedUrl(String url){ 24 if(url!=null && !url.trim().equals("") 25 &&!visitedUrl.contains(url) 26 &&!unVisitedUrl.contains(url)) 27 unVisitedUrl.add(url); 28 } 29 //獲得已經訪問的URL數目 30 public static int getVisitedUrlNum(){ 31 return visitedUrl.size(); 32 } 33 //判斷未訪問的URL隊列中是否為空 34 public static boolean unVisitedUrlsEmpty(){ 35 return unVisitedUrl.isEmpty(); 36 } 37 }?
?
?
?
?
在帶偏好的爬蟲里,隊列元素的優先級是由URL的優先級確定的。關于如何確定URL的優先級,有一些專用的鏈接分析的方法,比如Google的PageRank和HITS算法。
轉載于:https://www.cnblogs.com/94julia/archive/2013/03/29/2989713.html
總結
以上是生活随笔為你收集整理的2 宽度优先爬虫和带偏好的爬虫(4)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java两则故障分析和常见连接超时时间
- 下一篇: 虚拟串口1