最近要爬取一些东西,比如说爬取csdn中云计算频道中的内容。也就是以http://cloud.youkuaiyun.com/为开始的网页。
网上都是Heritrix比较好用,下载使用发现满足不了需求,无论各种配置都是不行,以http://cloud.youkuaiyun.com/为种子节点,选择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文件夹结果为:
只是包含了这两个网址下对应的内容了。