聚集搜索引擎java實現

一、說明

聚焦爬蟲是一個自動下載網頁的程序,它根據既定的抓取目標,有選擇的訪問萬維網上的網頁與相關的鏈接,獲取所需要的信息。與通用爬蟲不同,聚焦爬蟲並不追求大的覆蓋,而將目標定爲抓取與某一特定主題內容相關的網頁,爲面向主題的用戶查詢準備數據資源。

經過二十天的學習實踐,參考了很多資料,寫了個簡單的搜索引擎,存在許多待優化之處。忘各位網友能提出好的建議。

主要是抓取網上商店的商品信息並存儲,然後提供搜索界面展示信息。此處主要以淘寶爲測試平臺。

開發環境:ubuntu+eclipse

服務器:tomcat

開發語言:java,html,jsp

數據庫:Berkeley DB

第三方jar包:jsoup(html分析),je(用於連接Berkeley DB數據庫)

聚集爬蟲的

 

二、總體設計

 

以上流程圖並不能反應整個爬蟲程序的流程,其中沒有把已訪問的url表畫上去。根據此流程圖,主要包括:URL隊列和已訪問url表的設計,下載器的設計,緩衝池的設計,頁面分析器和存儲器的設計,原始數據庫設計,索引器設計,索引數據庫設計,檢索器及用戶接口,原始數據庫的工具類,全局配置類。 

三、代碼結構

 

總體控制類代碼

package control;

import control.download.DownloadControl;
import control.exit_clean.ShutdownHook;
import control.page_analysis.PageAnalysisControl;
import control.store.StoreControl;
import control.system.SystemCheck;
import model.page_analysis.DivideWord;
import model.pojo.Goods;
import model.pojo.MyHTML;
import model.pojo.MyURL;
import dao.GoodsInfoTable;
import dao.PriorityURLQueue;
import dao.VisitedTable;
import util.BuffPool;
import util.Global;

/**
 * 總控制類,控制整個系統的運行
 * 
 * @author touch
 */
public class WorkControl {
  /**
   * 爬蟲機器開始工作
   * 
   * @param startURL
   */
  public void start(String startURL) {

		System.out.println("系統正在初始化...");

		// 初始化配置信息
		System.out.println("初始化配置信息...");
		Global.init(Global.TAOBAO_URL);

		// 初始化URL隊列
		System.out.println("初始化URL隊列...");
		PriorityURLQueue pendingURLQueue = new PriorityURLQueue();
		// 如果待處理隊列中沒有url,則把入口url加入待處理URL隊列
		if (pendingURLQueue.isEmpty()) {
			System.out.println("待處理隊列爲空,入口url(" + Global.getStartURL() + ")加入隊列");
			MyURL url = new MyURL(Global.getStartURL());
			url.setPriority(0);// 注意設置入口隊列優先級爲0
			pendingURLQueue.enqueue(url);
		}
		// 給pendingURLQueue註冊退出清理線程
		Runtime.getRuntime().addShutdownHook(new ShutdownHook(pendingURLQueue));

		// 初始化已訪問url表
		System.out.println("初始化已訪問url表...");
		VisitedTable visitedTable = new VisitedTable();
		// 給visitedTable註冊退出清理線程
		Runtime.getRuntime().addShutdownHook(new ShutdownHook(visitedTable));

		// 初始化商品信息表
		System.out.println("初始化商品信息表...");
		GoodsInfoTable goodsInfoTable = new GoodsInfoTable();
		// 給goodsInfoTable註冊退出清理線程
		Runtime.getRuntime().addShutdownHook(new ShutdownHook(goodsInfoTable));

		// 初始化html頁面緩衝池
		System.out.println("初始化html頁面緩衝池...");
		BuffPool<MyHTML> htmlBuffPool = new BuffPool<MyHTML>(MyHTML.class, 50);

		// 初始化商品信息緩衝池
		System.out.println("初始化商品信息緩衝池...");
		BuffPool<Goods> goodsBuffPool = new BuffPool<Goods>(Goods.class, 20);

		// 加載詞典
		System.out.println("加載詞典...");
		DivideWord.initDictionary("dictionary.txt");

		// 創建下載器
		System.out.println("創建下載器...");
		DownloadControl downloadControl = new DownloadControl(pendingURLQueue, htmlBuffPool, visitedTable);
		// 給downloadControl註冊退出清理線程
		Runtime.getRuntime().addShutdownHook(new ShutdownHook(downloadControl));

		// 創建頁面分析器
		System.out.println("創建頁面分析器...");
		PageAnalysisControl pageAnalysisControl = new PageAnalysisControl(htmlBuffPool, pendingURLQueue, visitedTable, goodsBuffPool);
		// 給pageAnalysisControl註冊退出清理線程
		Runtime.getRuntime().addShutdownHook(new ShutdownHook(pageAnalysisControl));

		// 創建存儲器
		System.out.println("創建存儲器...");
		StoreControl storeControl = new StoreControl(goodsInfoTable, goodsBuffPool);
		// 給storeControl註冊退出清理線程
		Runtime.getRuntime().addShutdownHook(new ShutdownHook(storeControl));

		Runtime.getRuntime().addShutdownHook(new Thread() {
			@Override
			public void run() {
				// TODO Auto-generated method stub
				System.out.println("正在退出...");
			}
		});

		System.out.println("系統初始化完成...");

		// 啓動系統監視線程
		new Thread(new SystemCheck(pendingURLQueue, visitedTable, htmlBuffPool, goodsBuffPool, goodsInfoTable)).start();

		// 啓動定期寫盤線程
		// new Thread(new WriteData(pendingURLQueue, 1000 * 60 * 60)).start();

		// 啓動下載器
		downloadControl.start(20);

		// 啓動頁面分析器
		pageAnalysisControl.start(50);

		// 啓動存儲器
		storeControl.start(2);

  }

  /**
   * 程序入口
   * 
   * @param args
   */
  public static void main(String[] args)
  {
		if (args.length == 0)
			new WorkControl().start(Global.TAOBAO_URL);
		else if (args.length == 1)
			new WorkControl().start(args[0]);
		else
			System.out.println("參數錯誤,系統只能接受0個或1個參數");
  }

}

 

源碼、文檔、參考資料下載地址:http://download.csdn.net/detail/touch_2011/4337825
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章