Java案例实战:Httpclient 实现网络请求 + Jsoup 解析网页( 二 )


我们在 pom.xml 加入如下依赖:
<!-- Jsoup 核心包 --><dependency> <groupId>org.jsoup</groupId> <artifactId>jsoup</artifactId> <version>1.11.3</version></dependency>

Java案例实战:Httpclient 实现网络请求 + Jsoup 解析网页

文章插图
 
(3.3)当然,使用 Jsoup 之前,我们需要对响应的 HTML 页面进行分析,分析主要作用是:如何定位筛选出我们需要的数据?
我们把【2】中获取到的页面响应拷贝到 txt 文本中,然后可以发现:每个图片它都包含在一个 div 中,且该div 有一个名为 material-div 的 class 。
Java案例实战:Httpclient 实现网络请求 + Jsoup 解析网页

文章插图
 
(3.4)按照上面分析:首先我们要获取到包含图片的所有 div,于是我们修改main方法中代码为如下:
String html = HttpTool.doGet("http://www.zyqok.cn/material/index");// 将 html 页面解析为 Document 对象Document doc = Jsoup.parse(html);// 获取所有包含 class = material-div 的 div 元素Elements elements = doc.select("div.material-div");for(Element div: elements){System.out.println(div.toString());}注意:doc.select() 括号中的参数为过滤条件,基本等同于 Jquery 的过滤条件,所以会Jquery的同学,如何筛选条件基本就得心应手的,当然不会写筛选条件的也不要怕,这里有一份 Jsoup 使用指南,阁下不妨收下(传送门:Jsoup 官方使用指南) 。
Java案例实战:Httpclient 实现网络请求 + Jsoup 解析网页

文章插图
 
(3.5)我们执行代码,将输出结果继续拷贝到文本中 。
可以看到,本次确实只有图片相关的div元素了,但这并不是我们想要的最终结果,我们最终的结果是获取到所有图片 。
所以我们还需要继续分析:如何获取所有图片的链接和名字 。
Java案例实战:Httpclient 实现网络请求 + Jsoup 解析网页

文章插图
 
(3.6)由于每个图片所在的div元素结构都一样,所以我们可以取随机取一个div元素进行分析,于是我们可以取第一个div来进行分析,结构如下:
<div align="center" style="padding: 10px;" class="material-div"><div style="width: 80px; height: 80px; margin-bottom: 3px; display: flex; align-items: center; justify-content: center"><img class="fangda image" src=https://www.isolves.com/it/cxkf/yy/JAVA/2020-08-13/"https://zyqok.oss-cn-chengdu.aliyuncs.com/20200414220946131_大树夕阳.jpg">
大树夕阳.jpg
2020-04-14 22:09:46
3.7)我们可以看到,整个结构内,就一个 img 元素标签,于是我们可以取第1个img标签的 src 属性为图片链接;同理,我们取第1个 font 元素的文本内容为图片名称 。
Java案例实战:Httpclient 实现网络请求 + Jsoup 解析网页

文章插图
 
(3.8)于是我们可以修改循环中的代码内容如下:
// 获取第1个 img 元素Element img = div.selectFirst("img");// 获取第1个 font 元素Element font = div.selectFirst("font");// 获取img元素src属性,即为图片链接String url = img.attr("src");// 获取name元素文本,即为图片名称String name = font.text();System.out.println(name + ": " + url);
Java案例实战:Httpclient 实现网络请求 + Jsoup 解析网页

文章插图
 
(3.9)我们执行上面代码,可以得出如下结果 。
Java案例实战:Httpclient 实现网络请求 + Jsoup 解析网页

文章插图
 
可以看到,这个页面上的所有图片地址和名称已经被我们成功抓下来了 。
【4】获取图片到本地
在第【3】步中,我们获取到的只是所有图片的链接,并没有将所有图片下载到我们本地,那么接下来,我们要将这个图片下载到我们本地才算完成 。
(4.1)既然要下载到本地,我们首先在本地找个地方,用于存放这些图片 。
比如:我将这图片全部下载到 D:imgs(D 盘的 imgs 文件夹)中 。
Java案例实战:Httpclient 实现网络请求 + Jsoup 解析网页

文章插图
 
(4.2)我们在 HttpTool 类中增加保存图片到本地的方法,代码如下:
/*** 保存图片到本地* @param src 图片地址* @param name 图片名称*/public static void saveImg(String src, String name) {// 构建get请求HttpGet get = new HttpGet(src);// 创建客户端CloseableHttpClient client = HttpClients.createDefault();try {// 客户端执行请求,获取响应HttpResponse response = client.execute(get);// 获取响应的页面内容InputStream in = response.getEntity().getContent();int length;byte[] bytes = new byte[1024];FileOutputStream fos = new FileOutputStream("D:\imgs\" + name);while ((length = in.read(bytes)) != -1) {fos.write(bytes, 0, length);fos.flush();}in.close();fos.close();} catch (Exception e) {e.printStackTrace();}}


推荐阅读