实现的一个简单爬虫

最近对heritrix研究有一阵子了,大概也了解其工作原理的一部分,但是heritrix功能实现的比较多,仅配置就挺折腾人的,好在网上的资料也比较齐,加上源码也有,所以自己跟据原理也写了一个类似的超简单的爬虫。



我的爬虫的原理是:

1 手动分析一个页面,得到一个网页块的class标识,手动的原因是给不同网站能实现不同的“精确”抓取,但就是这个手动的原因,使的除了程序员外,基本上不能给别人使用了,一直在纠结这个问题怎么解决,原本是设计成将整个网页解析得到里面的所有链接,但是这样做的话,不精确。所以改成了这个样子


Document doc = null;
doc = Jsoup.connect(url).timeout(30000).get();
String classes = chose;
Elements el = doc.select(classes);
List<String> links = getPageLinks(el.toString());


2 解析html得到页面里所有的<a>标签里的链接


protected static List<String> getPageLinks(String html) {
Parser parser = null;
NodeList nodeList = null;
NodeFilter filter = null;
List<String> urlList = new ArrayList<String>();
try {
// 创建指定编码的Parser对象
parser = Parser.createParser(html, "GB18030");
// 创建一个接受标签A的过滤器
filter = new TagNameFilter("A");
// 过滤节点内容
nodeList = parser.extractAllNodesThatMatch(filter);
int size = nodeList.size();
for (int i = 0; i < size; i++) {
LinkTag tag = (LinkTag) nodeList.elementAt(i);
// System.out.println(tag.getLink());
urlList.add(tag.getLink());
}
} catch (ParserException e) {
e.printStackTrace();
}
return urlList;
}


3 这个处理链会将新添加的链接去重,因为heritrix用的是dbd的嵌入式的数据库,能够处理更多的数据,我这里用的是Arraylist加set去重,因为这个爬虫是精确抓取,得到链接也不会一次超过百万条,简单测试结果是一次添加超过100万级的则会内存溢出。然后分配多个线程去抓取,每个线程得到一个链接,同步了得到链接的方法


/**
* 分配链接,同步此方法,使每个线程得到的链接都不重复
* @return
*/
public synchronized String getLinks() {
if (list.size() == 0) {
return "shut-down";
}
logger.info(Thread.currentThread().getName() + " " + list.get(0));
String link = list.get(0);
list.remove(0);
return link;
}


4 用多线程去得到处理链,相应的操作后,将网页下载到本地

贴代码挺麻烦的,先介绍这么多,本人表达能力有限,自己都不知道这样写能不能理解,内容全写在代码里,代码不多,还是直接下代码自己看看吧
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值