jsoup简介

jsoup是一款java的HTML解析器,主要用来对HTML解析,可以直接解析某个地址的url地址,获取HTML文本内容,他提供了一套非常省力的API,可以通过DOM,CSS以及类似于JQuery的方法来取

出操作数据,可以配合下面的图,来进行理解

java爬取手机客户端数据 java爬取新闻_并存储在磁盘


要是想要爬取网页内容,首先需要导入依赖的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");
				}
			}
		}
	}


java爬取手机客户端数据 java爬取新闻_Jsoup实现java爬虫_02


根据图片我们可以看到,存放新闻标题内容的全部在一个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();
	}