本次我们要使用 jsoup 这个html解析器来进行网页爬虫
可能有人一脸懵逼?jsoup是个什么鬼?,干哈戳子的,楞个给说说呗
1、什么是jsoup
直接看看百度百科怎么说:
jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据。
这边在补充几点jsoup相关:
- jsoup也支持从某个地址直接去爬取网页源码,但是 只支持HTTP,HTTPS协议,支持不够丰富
- 其中,要被解析的HTML可以是HTML的字符串、URL、文件
- org.jsoup.Jsoup把输入的 HTML转换成一个org.jsoup.nodes.Document对象,然后从Document对象中取出想要的元素
- org.jsoup.nodes.Document继承了org.jsoup.nodes.Element,Element又继承了org.jsoup.nodes.Node类。里面提供了丰富的方法来获取HTML的元素。
关系大概就是这样:Node > Element >Document
了解了什么是jsoup之后就直接上手来一个小案例吧,不用把这玩意想的很复杂(万物皆工具,所谓工具,按照说明书使用就行了,除非你想了解它的原理),这玩意,对于学习过js、jquery,html等相关的基本前端技能的人非常容易掌握,这玩意就是将网页结构解析出来,里面也提供css选择器来对网页进行操作的玩意,哈哈,先来个案例感受一下:
先导入maven坐标:
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.11.2</version>
</dependency>
目标:https://sc.chinaz.com/tupian/diqiutupian.html
这个网页的图片但是如何爬取该分类的所有图片呢?算了,入门案例懒得敲笔记了,自己看下面代码去。注释上面有
看看他的分页的url变化规律:
发现规律了吗?提示:_(除第一页外的页数)
jsoup入门案例,懒得敲笔记了:
int name = 0;
InputStream is = null;
FileOutputStream fos = null;
//1、查看网页的变化规律,通过for循环来获取页面的链接
//https://sc.chinaz.com/tupian/diqiutupian.html
String path = null;
for (int i = 1; i <= 3; i++) { //i控制页数
if (i == 1) { //是第一页的时候
path = "https://sc.chinaz.com/tupian/diqiutupian.html";
} else {
path = "https://sc.chinaz.com/tupian/diqiutupian_" + i + ".html";
}
System.out.println(path);
//2.1、把html页面解析为document对象
//2.2、把页面包装为url对象
URL url = new URL(path);
//2.3、通过jsoup解析器来解析页面,获得dom对象 传入 url 和 超时连接的毫秒数
Document document = Jsoup.parse(url, 300000);
//System.out.println(document);
//3、通过dom对象对应标签名称获取数据
Elements picblock = document.getElementsByClass("picblock");
for (Element element : picblock) {
//遍历获取每张图片的url
String href = "http:" + element.child(0).child(0).attr("href");
//4、把大图也的html页面解析为document对象
//4.1、把页面包装为url对象 通过jsoup解析器来解析页面,获得dom对象
URL hrefUrl = new URL(href);
Document document2 = Jsoup.parse(hrefUrl, 300000);
//5.1、通过dom对象的方法 找到指定的类名 imga
Elements imga = document2.getElementsByClass("imga");
for (Element element1 : imga) {
//5.2 选中指定标签通过.attr()方法 获取src属性的值
String imgSrc = "https:" + element1.child(0).attr("href");
System.out.println(imgSrc);
//6.1、打开imgSrc连接
//6.2、打开url对象,把路径作为参数传入
URL imgsrcUrl = new URL(imgSrc);
//6.2、通过url对象的openConnection()方法,打开图片连接
URLConnection connection = imgsrcUrl.openConnection();
//7.1、通过打开链接的对象的getInputStream(),获取字节输入流
is = connection.getInputStream();
//7.2、设置输出路径 outFile
String outFile = "C:\\爬虫image\\" + name + ".jpg";
name++;
//7.3、创建字节输出流,把输出路径作为参数传入 new FileOutputStream
fos = new FileOutputStream(outFile);
//7.4、读取数据 使用数组读字节,一次读1024字节
byte[] bytes = new byte[1024*7];
//7.5、使用while循环,输入输出进行先输入后输出 写数据
int len = 0;//返回值 读取到的长度,读不到的时候返回-1
while ((len = is.read(bytes)) != -1) {
fos.write(bytes, 0, len);
}
System.out.println("下载完成");
}
}
}
//7.6、关闭流
is.close();
fos.close();
运行测试:
有啥问题,欢迎探讨。。。。。。