一、说明
聚焦爬虫是一个自动下载网页的程序,它根据既定的抓取目标,有选择的访问万维网上的网页与相关的链接,获取所需要的信息。与通用爬虫不同,聚焦爬虫并不追求大的覆盖,而将目标定为抓取与某一特定主题内容相关的网页,为面向主题的用户查询准备数据资源。
经过二十天的学习实践,参考了很多资料,写了个简单的搜索引擎,存在许多待优化之处。忘各位网友能提出好的建议。
主要是抓取网上商店的商品信息并存储,然后提供搜索界面展示信息。此处主要以淘宝为测试平台。
开发环境: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