java从网页抓取数据( 我个人网站一个页面为例(3.1)什么是Jsoup技术? )
优采云 发布时间: 2022-04-01 20:15java从网页抓取数据(
我个人网站一个页面为例(3.1)什么是Jsoup技术?
)
(2.4)为了避免其他网站侵权问题,我们以我自己的一个页面网站为例(),我们把这个页面上的图片全部抓取.
(2.5) 可以看出这是一个get请求,返回一个Html页面。所以我们在HttpTool类中添加如下方法体:
/**
* 实现Get请求
* @param url 请求地址
* @return 页面内容
*/
public static String doGet(String url) {
return null;
}
(2.6)复制代码,添加get实现方法:
// 构建get请求
HttpGet get = new HttpGet(url);
// 创建客户端
CloseableHttpClient client = HttpClients.createDefault();
try {
// 客户端执行请求,获取响应
HttpResponse response = client.execute(get);
// 获取响应的页面内容
InputStream in = response.getEntity().getContent();
StringBuilder sb = new StringBuilder();
byte[]b = new byte[102400];
int length;
while ((length = in.read(b)) != -1) {
sb.append(new String(b, 0, length, "utf-8"));
}
// 返回页面内容
return sb.toString();
} catch (Exception e) {
e.printStackTrace();
return null;
}
(2.7)好的,网络请求相关的实现类我们已经写好了,接下来我们测试一下,我们在Test类的main方法中添加如下代码:
String html = HttpTool.doGet("http://www.zyqok.cn/material/index");
System.out.println(html);
(2.8)执行程序,查看结果,可以看到我们确实通过请求得到了网页的返回内容。
[3] Jsoup解析网页
在[2]的整个实现过程中,我们已经得到了网页返回的数据,但是我们要的是整个网页中的图片,而不是这种乱七八糟的网页数据,那我们该怎么办呢?很简单,接下来我们需要使用另一种技术——Jsoup。
(3.1)什么是Jsoup技术?
以下是度娘官方给出的解释:Jsoup是一个Java HTML解析器,可以直接解析一个URL地址和HTML文本内容。它提供了一个非常省力的API,用于通过DOM、CSS和类似jQuery的操作方法(取自百度)来获取和操作数据。
以下是我个人语言的简单总结: Jsoup技术用于处理各种html页面和xml数据。这里我们可以使用Jsoup来处理[2]中返回的html页面。
(3.2)添加Jsoup依赖
我们在 pom.xml 中添加以下依赖项:
org.jsoup
jsoup
1.11.3
(3.3) 当然,在使用Jsoup之前,我们需要对响应的HTML页面进行分析。分析的主要作用是:如何定位和过滤掉我们需要的数据?
我们将[2]中得到的页面响应复制到txt文本中,然后我们可以发现每张图片都收录在一个div中,并且该div有一个名为material-div的类。
(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 官方用户指南)。
(3.5)我们执行代码,继续将输出复制到文本中。
可以看到,这次只有图片相关的div元素,但这并不是我们想要的最终结果。我们最终的结果是得到所有的图片。
所以我们还需要继续分析:如何获取所有图片的链接和名称。
(3.6)由于每张图片所在的div元素的结构都是一样的,我们可以随机取一个div元素进行分析,所以可以取第一个div进行分析,结构为如下:
大树夕阳.jpg
2020-04-14 22:09:46
3.7)我们可以看到整个结构中只有一个img元素标签,所以我们可以把第一个img标签的src属性作为图片链接;同理,我们取第一个 font 元素的文本内容为图片名称。
(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);
(3.9)我们执行上面的代码,可以得到如下结果。
可以看到,这个页面上的所有图片地址和名字都已经被我们成功抓取了。
[4] 获取图片到本地
在步骤[3]中,我们得到的只是所有图片的链接,并且所有的图片都没有下载到我们的本地,那么接下来,我们需要把这张图片下载到我们的本地才算完整。
(4.1)既然要下载到本地,就先在本地找个地方存放这些图片。
例如:我将所有图片下载到D:\imgs(D盘的imgs文件夹)。