爬虫程序的第三步,是提取页面链接。
页面链接的提取,是爬虫程序中非常关键的一部分。一个完整的爬虫程序,要能从种子 URL 出发,逐步遍历子节点中的所有页面。就比如我们想采集微博内容时,不能仅仅采集第一页的内容,而要实现从第一页开始一直采集到尾页。
本篇主要介绍一款能提取网页链接的强大类库,HtmlParser。
一、HtmlParser
HtmlParser 是一个通过线性和嵌套两种方式来解析网页的 Java 开源类库,主要用于网页元素的转换以及网页内容的抽取。
HtmlParser 具备如下特性:
- 过滤器
- 访问者模式
- 自定义标签
- 易于使用的 Java 组件
正如官网简介里所述,HtmlParser 是一个快速的、健壮的、经过严格测试的工具包。
二、NodeFilter
HtmlParser 具备过滤器的特性,我们可以通过这个特性过滤并提取网页中的链接。
HtmlParser 中与过滤相关的基本接口是 NodeFilter,接口中只定义了一个方法。
package org.htmlparser;
import java.io.Serializable;
import org.htmlparser.Node;
public interface NodeFilter extends Serializable, Cloneable {
boolean accept(Node var1);
}
该方法的作用是,对于想要保留的节点,返回 true;对于满足过滤条件、需要过滤掉的节点,返回 false。
HtmlParser 本身就提供了多种实现 NodeFilter 接口的过滤器,如下表所示:
类别 | 类名 |
---|---|
逻辑运算类 | AndFilter NotFilter OrFilter |
判断类 | HasAttributeFilter HasChildFilter HasParentFilter HasSiblingFilter IsEqualFilter TagNameFilter |
其他 | CssSelectorNodeFilter LinkRegexFilter LinkStringFilter NodeClassFilter RegexFilter StringFilter |
当然,开发人员也可以自定义 Filter,用于实现一些特殊情况的过滤。
三、简易链接提取器
使用 HtmlParser 实现链接提取,需要以下步骤:
- 使用 url 或者网页源码创建一个 Parser 对象;
- 构建满足需求的过滤器对象;
- 通过 Parser 的
extractAllNodesThatMatch(NodeFilter filter)
方法提取过滤后的节点; - 通过节点获取链接信息。
以下是 HtmlParser 提取网页链接的具体示例:
package filter;
import org.htmlparser.Node;
import org.htmlparser.Parser;
import org.htmlparser.filters.NodeClassFilter;
import org.htmlparser.filters.OrFilter;
import org.htmlparser.tags.FrameTag;
import org.htmlparser.tags.LinkTag;
import org.htmlparser.util.NodeList;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.ArrayList;
import java.util.List;
/**
* 链接提取器
*
* @author panda
* @date 2017/10/28
*/
public class LinkExtractor {
private static final Logger logger = LoggerFactory.getLogger(LinkExtractor.class