一、說明
聚焦爬蟲是一個自動下載網頁的程序,它根據既定的抓取目標,有選擇的訪問萬維網上的網頁與相關的鏈接,獲取所需要的信息。與通用爬蟲不同,聚焦爬蟲並不追求大的覆蓋,而將目標定爲抓取與某一特定主題內容相關的網頁,爲面向主題的用戶查詢準備數據資源。
經過二十天的學習實踐,參考了很多資料,寫了個簡單的搜索引擎,存在許多待優化之處。忘各位網友能提出好的建議。
主要是抓取網上商店的商品信息並存儲,然後提供搜索界面展示信息。此處主要以淘寶爲測試平臺。
開發環境: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