最近要爬取一些东西,比如说爬取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文件夹结果为:
只是包含了这两个网址下对应的内容了。