Jsoup类
jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据。
一、引入jsoup包
下载Jsoup包
jsoup.jar包下载地址:
http://jsoup.org/packages/jsoup-1.8.1.jar(点击即可下载)
在项目中导入Jsoup包
1、将下载到的jar包copy到Java Project中
2、右击项目,找到Propertise并单击进入
3、找到Java Build Path ,点击Add JAR
4、找到刚刚copy到项目中的jar包并选中
5、点击Apply,然后在点击Ok即可完成jar的导入
二、解析网页
解析一个图片网页:http://www.nipic.com/index.html
1、获取单张图片的下载地址
目的:获取http://www.nipic.com/show/16559141.html页面的图片下载地址
a、进入http://www.nipic.com/show/16559141.html
b、按F12进入调试页面,找到下图的位置
c、观察规律:
图片的下载地址在src属性里面,而标签里面有个id属性(id属性是唯一的)。所以可以用getElementById()方法获取。
实现代码:
/**
* 捕获单个图片的下载地址
*/
public static void test1() {
List<String> list = new ArrayList();
// 获取网页链接
Connection conn = Jsoup.connect("http://www.nipic.com/show/15879372.html");
try {
// 网站获取和解析一个HTML文档,并查找其中的相关数据。
// 获取连接里面的内容,并赋值到dco文档中
Document document = conn.get();
// 根据指定的id元素的属性值,获取到网页的内容(根据id的属性进筛选)
Element element = document.getElementById("J_worksImg");
// 捕获属性为"src"里面的内容,并添加到list集合中
list.add(element.attr("src"));
System.out.println("下载地址:" + list);
} catch (IOException e) {
e.printStackTrace();
}
}
输出结果:
d、捕获图片名
写一个方法,将图片的下载链接地址进行切割,拿到图片名(方便保存到本地)
/**
* 目的:将图片下载地址进行切割,获取文件的名称
*
* @param args
*/
public static void test2() {
String url = "http://www.nipic.com/show/15879372.html";
// 找到最后一个"/"的位置
int beginIndex = url.lastIndexOf("/");
// 截最后一个"/"后面的内容
String name = url.substring(beginIndex + 1);
System.out.println("文件名" + name);
}
e、保存图片
将图片下载到本地:
/**
* 将图片保存到本地
*/
public static void test6() {
try {
// 连接图片下载地址
URL url = new URL("http://www.nipic.com/show/15879372.html");
URLConnection urlConnect = url.openConnection();
InputStream is = urlConnect.getInputStream();
byte myArray[] = new byte[1024];
int len = 0;
// 文件名
String fileName = "a.jpg";
FileOutputStream fis = new FileOutputStream(fileName);
while ((len = is.read(myArray)) != -1) {
fis.write(myArray, 0, len);
fis.flush();
}
is.close();
fis.close();
System.out.println("保存完成");
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
运行结果:
刷新项目就可以看到刚刚保存的图片了
实战:
下载所有列表的图片:
1、 获取所有的列表页面
2、 获取每个列表页面的所有图片介绍页面
3、 通过介绍页面获取下载地址
4、 对下载地址进行切割拿到图片名
5、 通过下载链接跟图片名,将所有的图片下载到C:\Users\Oven\Desktop\宠物照片\patu目录
/**
* 捕获一个图片的下载地址
*/
public static List<String> test1(String url) {
List<String> list = new ArrayList();
// 获取网页链接
Connection conn = Jsoup.connect(url);
try {
// 网站获取和解析一个HTML文档,并查找其中的相关数据。
// 获取连接里面的内容,并赋值到dco文档中
Document document = conn.get();
Element element = document.getElementById("J_worksImg");
// 捕获属性为"src"里面的内容,并添加到list集合中
list.add(element.attr("src"));
// list.add(element.attr("src"));
System.out.println("下载地址:" + list);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return list;
}
/**
* 目的:将图片下载地址进行切割,得到文件名 根据传入的url地址,获取文件的名称
* @param args
*/
public static String test2(String url) {
// String url = "http://www.nipic.com/show/15879372.html";
// 找到最后一个"/"的位置
int beginIndex = url.lastIndexOf("/");
// 截最后一个"/"后面的内容
String name = url.substring(beginIndex + 1);
System.out.println("文件名" + name);
return name;
}
/**
* 获取列表中获取每一个图片简介的链接
*
* @param args
*/
public static List<String> test3(String url) {
List<String> list = new ArrayList<String>();
// Connection connection =
// Jsoup.connect("http://www.nipic.com/topic/show_27046_1.html");
Connection connection = Jsoup.connect(url);
try {
Document document = connection.get();
Elements elements = document.getElementsByClass("works-detail");
System.out.println("本页共有" + elements.size() + "条图片 简介的链接");
for (Element element : elements) {
list.add(element.attr("href") + "\n");
}
System.out.println(list);
} catch (IOException e) {
e.printStackTrace();
}
return list;
}
/**
* 获取页码的链接
*/
public static List<String> test4() {
List<String> list = new ArrayList<String>();
Connection connection = Jsoup.connect("http://www.nipic.com/topic/show_27046_1.html");
try {
Document document = connection.get();
// System.out.println(document);
Elements elements = document.getElementsByClass("seo-page-num");
System.out.println("一共有" + elements.size() + "页码");
for (Element element : elements) {
list.add(element.attr("href"));
}
System.out.println(list);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return list;
}
/**
* 将图片保存到本地
*/
public static void test5(String downUrl, String fileName) {
try {
// 连接图片下载地址
URL url = new URL(downUrl);
URLConnection urlConnect = url.openConnection();
InputStream is = urlConnect.getInputStream();
byte myArray[] = new byte[1024];
int len = 0;
FileOutputStream fis = new FileOutputStream("C:\\Users\\Oven\\Desktop\\宠物照片\\patu\\" + fileName);
while ((len = is.read(myArray)) != -1) {
fis.write(myArray, 0, len);
fis.flush();
}
is.close();
fis.close();
System.out.println("保存完成");
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 将刚刚的所有方法融合到一个方法,获取多个图片的下载地址。
* 步奏:
* 1、传入一个url的图片链接
* 2、捕获页码
* 3、捕获每个图片的简介链接地址
* 4、捕获图片的下载地址
* 5、下载图片,保存到本地
*/
public static void test6(){
List<String> list = test4();
// 遍历页码
for (String string1 : list) {
System.out.println("页码" + string1);
// 遍历图片的简介链接地址
List<String> list2 = test3(string1);
for (String string2 : list2) {
// 调用test2()方法,获取文件名
// 遍历图片的下载地址
List<String> list3 = test1(string2);
// 遍历下每一张图片的下载地址,然后调用下载图片的方法,保存到本地
for (String string4 : list3) {
test5(string4, test2(string4));
}
}
}
}
运行结果: