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 是爬取的页数,贝壳租房每次访问的第一页数据是动态的,所以不具备实际的开始、结束意义
上述图片为最终的效果图。示例代码中忽略了对于数据库的插入。若是想要将获取的数据批量插入数据库中,需要注意一点:根据房屋编号去除冗余数据
小结
至此,对于 Jsoup 类库的介绍告一段落。也通过对于贝壳租房信息的获取、解析,看到了 Jsoup 解析器的便利。当然,Jsoup 作为一款 HTML 解析工具,最好只做 HTML 标签的解析工作
这里,使用的是贝壳的对外公开信息,不涉及隐私,也未曾大批量、恶意获取数据信息