HTML 解析器 – Jsoup

Jsoup 的概念与使用

Jsoup 是 Java 中存在的一个非常好用的 HTML 解析器,可以用于获取网页信息、清洗冗余数据(个人理解)

jsoup 是一个用于处理实际 HTML 的 Java 库。它使用 HTML5 最佳 DOM 方法和 CSS 选择器,为提取 URL 以及提取和处理数据提供了非常方便的 API(官方文档)

<dependency>
    <groupId>org.jsoup</groupId>
    <artifactId>jsoup</artifactId>
    <version>1.13.1</version>
</dependency>
复制代码

目前,Jsoup 的最新版本是 1.13.1,可以直接通过 Maven 引入

在 Jsoup 类库中,存在以下几种常用的方法

// 自 URL 路径获取 HTML 文档对象,可以选择追加 Cookie 等验证信息
Document doc = Jsoup.connect("http://example.com/").get();
复制代码
  • getElementsByClass(String className):根据 class 属性获取元素
  • getElementById(String id):根据 id 属性获取元素
  • Element.text():将元素自 HTML 解析为纯文本,取消 HTML 标签
  • Node.attr(String key):获取 HTML 元素中属性的属性值,例如 href 的值

对于 Jsoup,还存在着其它的实用方法,这里只介绍了个人常用的几种,更多的请参考 Jsoup 官方说明文档

贝壳租房数据获取

这里,通过一个实际的案例,对 Jsoup 做运用,关于贝壳的某些城市租房主要信息的获取。只写出主要分析代码,对于 Maven 的构建与数据库的插入不做介绍

第一步:对单个 HTML 页面做数据分析,接收数据的 Java 类请自行创建

public static synchronized void getInfos(Document documentUrl) {
    ArrayList<HouseCard> houseCards = new ArrayList<>();
    Elements twoline = documentUrl.getElementsByClass("twoline");
    Elements content = documentUrl.getElementsByClass("content__list--item--des");
    Elements price = documentUrl.getElementsByClass("content__list--item-price");
    for (int i = 0; i < twoline.toArray().length; i++) {
        try {
            String text = twoline.get(i).text();
            String[] infos = text.split("·");
            // 房屋编号
            String houseId = twoline.get(i).attr("href").split("/")[2].split("\\.")[0];
            // 区域名称 一级
            String areaOne = content.get(i).text().split("-")[0];
            // 区域名称 二级
            String areaTwo = content.get(i).text().split("-")[1];
            // 租住区域名称 丽江公寓....
            String areaName = infos[1].split(" ")[0];
            // 出租方式 整租/合租
            String rentWay = infos[0];
            // 房屋面积
            String areaSize = content.get(i).text().split("/")[1];
            // 房间数量
            String houseNumber = infos[1].split(" ")[1];
            // 房屋租金
            String houseSale = price.get(i).text().split(" ")[0];
            houseCards.add(new HouseCard(houseId, areaOne, areaTwo, areaName, rentWay, areaSize, houseNumber, houseSale));
        } catch (Exception e) {
            System.out.println("异常......");
        }
    }
}
复制代码

可以看出,上述的方式是根据传入的 URL 地址,对 HTML 页面的元素做分析,以获取想要的部分数据,例如房屋的编号、所在区域、房屋租金等等

第二步:批量获取 URL 地址,以做到数据的大规模获取

public static ArrayList<String> getUrl(String city, Integer start, Integer end) {
    ArrayList<String> strings = new ArrayList<>();
    for (int i = start; i <= end; i++) {
        String url = "https://" + city + ".zu.ke.com/zufang/pg" + i;
        strings.add(url);
    }
    return strings;
}
复制代码

这里,需要对于贝壳租房的 URL 做分析,将 hz、xm 等关键字抽出,作为参数传入,可以做到对不同城市的租房信息的获取

第三步:编写 main 方法,运行程序

public static void main(String[] args) throws IOException {
    ArrayList<String> hz = getUrl("hz", 1, 240);
    int i = 1;
    for (String s : hz) {
        Document document = Jsoup.connect(s).get();
        System.out.println("目前开始打印第 " + i + " 页");
        getInfos(document);
        i++;
    }
}
复制代码

形参 city 是获取租房信息的城市缩写;形参 start、end 是爬取的页数,贝壳租房每次访问的第一页数据是动态的,所以不具备实际的开始、结束意义

image.png

上述图片为最终的效果图。示例代码中忽略了对于数据库的插入。若是想要将获取的数据批量插入数据库中,需要注意一点:根据房屋编号去除冗余数据

小结

至此,对于 Jsoup 类库的介绍告一段落。也通过对于贝壳租房信息的获取、解析,看到了 Jsoup 解析器的便利。当然,Jsoup 作为一款 HTML 解析工具,最好只做 HTML 标签的解析工作

这里,使用的是贝壳的对外公开信息,不涉及隐私,也未曾大批量、恶意获取数据信息

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享