聚集搜索引擎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
 

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