现在的位置: 首页 > 综合 > 正文

heritrix总结–定制FrontierScheduler

2013年12月05日 ⁄ 综合 ⁄ 共 2075字 ⁄ 字号 评论关闭

最近要爬取一些东西,比如说爬取csdn中云计算频道中的内容。也就是以http://cloud.csdn.net/为开始的网页。

网上都是Heritrix比较好用,下载使用发现满足不了需求,无论各种配置都是不行,以http://cloud.csdn.net/为种子节点,选择PathScope但是爬取的东西还是很多其他不相关的内容,这个在mirror中可以清楚的看到。

于是看了一些博客之后,决定还是自己重写一个吧,会爬取指定路径下的页面,而会自动过滤掉不相关的页面。

直接上代码:

package com.an.extractor;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;

import org.apache.jasper.logging.Logger;
import org.archive.crawler.datamodel.CandidateURI;

import org.archive.crawler.postprocessor.FrontierScheduler;

public class FrontierSchedulerForSpecific extends FrontierScheduler{
	
	public String seedUrl = null;
	private ArrayList<String> listSeed = new ArrayList<String>();
	public boolean flag = false;
	private static final Logger logger =
        Logger.getLogger(FrontierSchedulerForSpecific.class.getName());
	
	public FrontierSchedulerForSpecific(String name) {
		super(name);
		// TODO Auto-generated constructor stub
	}
	
	
	private static Logger LOGGER = Logger.getLogger(
			FrontierSchedulerForSohu.class.getName());

	
	//下面是关键的函数用来进行识别的
	//修改一下  使用正则表达式来进行识别
	protected void schedule(CandidateURI caUri){
		
		if(flag == false)
		{
			readSeed();
		}
		
		String url = caUri.toString();
		try{
			//遍历所有的种子点
			for(String seed: listSeed){
				if(url.indexOf(seed) != -1){
					getController().getFrontier().schedule(caUri);
				}
			}//for
			if(url.indexOf("robots.txt") != -1
					||url.indexOf("dns:") != -1){
				getController().getFrontier().schedule(caUri);
			}//if
			else{
				return;
			}
		}catch(Exception e){
			e.printStackTrace();
		}finally{
			
		}
	}
	void readSeed(){
		File seedfile = this.getController().getScope().getSeedfile();
		String tempss = null;
		
		BufferedReader reader = null;
		try {
            reader = new BufferedReader(new FileReader(seedfile));
            while ((seedUrl =  reader.readLine()) != null) {
            	listSeed.add(seedUrl);
            	/*tempss += seedUrl;
            	tempss += " ";
                System.out.println(seedUrl);*/
            }

            //读取完了对应的seedfile中的了
            flag = true;
            
            
        } catch (IOException e) {
            e.printStackTrace();
            return;
        }
	}

}

当然还需要修改conf-module下的Processor.options文件,加入com.an.extractor.FrontierSchedulerForSpecific|FrontierSchedulerForSpecific

这样在网页控制界面中,可以输入几个种子网址,然后爬取的时候只会爬取对应页面下的内容了。

在配置的时候,如下:

种子节点填写:

在module中修改:Select Post Processors 改为:


这样得到的mirror文件夹结果为:


只是包含了这两个网址下对应的内容了。


抱歉!评论已关闭.