heritrix在原有基础上抓取

抓取的时候死机或者意外停止时很正常的事情
不过遇到这类问题不用担心,heritrix提供了一个方法,就是Based on a recovery
这个就是在原有的基础上继续抓取,可是他又一个缺点
就是每次抓取都是一个新的job统计起来确实很麻烦!!
原理大家也都知道,heirtrix把所有获取的链接都放入recover.gz这个文件,里面存储了不同的格式

"F+ 进入调度器里的URL,还待处理。如果恢复的话,会重新将该URL放入调度器
"Fd "
"Fe "从BDB数据库里排放URI,然后用于去抓取
"Ff " 失败了的url
"Fr "重新调度的URL,在日志里申明它
"Fs " 已经成功的url

恩,每次启动的时候 就会加载gz到处理链,

恩,贴一段代码吧,Based on a recovery ,却让他在本job继续抓取的代码

public class HeritrixStart extends Thread{

private HeritrixStart() {
}

private static HeritrixStart instance = new HeritrixStart();

public static HeritrixStart getInstance() {
return instance;
}

private static CrawlController controller = null;
private static CrawlStatusListener listener = null;

/**
* 控制类路径
*/
public static void getController() {
if (controller == null) {
String crawlUrl = "F:/searcher/heritrix/jobs/default-20100311114044312/order.xml";
// CrawlStatusListener listener = null;
File file = new File(crawlUrl);
XMLSettingsHandler handler;
try {
handler = new XMLSettingsHandler(file);
handler.initialize();
controller = new CrawlController();
controller.initialize(handler);
} catch (InvalidAttributeValueException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InitializationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}
}

/**
* 启动爬虫
*/
public static void Start() {
getController();
if (listener != null) {
controller.addCrawlStatusListener(listener);
}
controller.requestCrawlStart();

while (true) {
if (controller.isRunning() == false) {
break;
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

controller.requestCrawlStop();
}

/**
* 关闭爬虫
*/
public static void Stop() {
controller.requestCrawlStop();
}

/**
* 多线程启动
*/
public void run() {
Start();
}

public static void main(String[] args) {
Start();
// Stop();
}
}


恩,启动的话,最后把controller对象放入application,这样就可以很方便的用界面启动,暂停,继续爬虫了

猜你喜欢

转载自wangwei3.iteye.com/blog/630643
今日推荐