jsoup简介
jsoup是一款java的HTML解析器,主要用来对HTML解析,可以直接解析某个地址的url地址,获取HTML文本内容,他提供了一套非常省力的API,可以通过DOM,CSS以及类似于JQuery的方法来取
出操作数据,可以配合下面的图,来进行理解
要是想要爬取网页内容,首先需要导入依赖的jar包
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.12.1</version>
</dependency>
其次就可以直接写我们的java代码了
这里我使用的是junit单元测试,如果代码看不懂可以结合下面图片和解释进行理解
//获取新浪微博内容
@Test
public void jsoupXL() throws Exception{
//获取jsoup对象并使用get方法获取html元素
Document document = Jsoup.connect("https://www.sina.com.cn/").get();
//根据id获取元素内容
Elements div = document.select("#newslist_a");
//找到a连接的元素
Elements a = div.select("li a");
for (Element element : a) {
//因为a连接中间的内容就是文件标题
String title = element.text();
//文件名使用文章标题会有一些特殊字符 所以进行处理
title = title.replaceAll("[`~!@#-_$%^&*()+=|{}':;',\\[\\]<>/?~!@#¥%……&*()——+|{}【】《》 ‘;:”“’。,、?\\\"]", "");
//获取文章详情的url地址
String url = element.attr("href");
if(!url.equals("")){
//因为有些网站会有反扒机制所以需要对地址没有加http的路径添加http
if((!url.startsWith("http"))){
url = "http:"+url;
}
//获取文章详情的内容
Document articleDiv = Jsoup.connect(url).get();
//文章内容全在一个div里
Elements details = articleDiv.select(".article");
for (Element element2 : details) {
//获取文章内容
String content = element2.text();
//通过工具类将内容写入文件
writeFile("D:/data/"+title+".txt", content, "utf8");
}
}
}
}
根据图片我们可以看到,存放新闻标题内容的全部在一个id为newslist_a的div盒子里我们就可以使用jsoup获取HTML元素内容,并且每个li里面都有一个a连接,我们就可以获取a连接里的href值,来进入文章详情查看文章内容.
获取到a连接href的值以后我们就可以使用jsoup再次获取文章详情的内容,找到存放文章内容的盒子,获取文本内容就可以完成爬取内容.
工具类代码
public static void writeFile(String path, String content, String charset) throws IOException {
// 创建写入的文件
File file = new File(path);
// 判断父目录是否存在
if (!file.getParentFile().exists()) {
// 创建父目录
file.getParentFile().mkdirs();
}
// 创建输出流对象
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file), charset));
//将内容写入文件
bw.write(content);
//记得要刷新
bw.flush();
//关闭流对象
bw.close();
}