Jsoup 是一个用于处理实际 HTML 的 Java 库,它提供了非常方便的 API 来提取和操作数据,常用于网页抓取(爬虫)和 HTML 解析。
基本用法
1. 添加依赖
首先需要在项目中添加 Jsoup 依赖:
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.16.1</version> <!-- 2023年最新稳定版 -->
</dependency>
2. 实用示例
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
/**
* #todo
*
* @author lyl
* @version v1.0
* @since 2025/6/18
*/
public class HttpTest {
public static void main(String[] args) {
//第0层挖热点
run("财经热点",0);
}
public static void run(String keyword,int num){
//String message="https://www.so.com/s?ie=utf-8&fr=360sou_newhome&ls=sm3014395&lm_extend=ctype%3A31&src=home_lm&ssid=083e41eefd6244e8bb13ded1eb7dd060&sp=a93&cp=06c0009a93&nlpv=global_place_b_shbt&q="+keyword;
String message="https://www.baidu.com/s?wd="+keyword+"&rsv_spt=1&rsv_iqid=0xf0222b4603305c3c&issp=1&f=3&rsv_bp=1&rsv_idx=2&ie=utf-8&tn=baiduhome_pg&rsv_dl=ih_0&rsv_enter=1&rsv_sug3=1&rsv_sug1=1&rsv_sug7=001&rsv_sug2=1&rsv_btype=i&rsp=0&rsv_sug9=es_2_1&rsv_sug4=2199&rsv_sug=9";
//String message="https://news.baidu.com/";
try {
Document doc = Jsoup.connect(message)
.timeout(5000) // 超时设置(毫秒)
.get();
List<String> result=new ArrayList<>();
// 2. 使用CSS选择器提取标题
String title = doc.select("title").text();
System.out.println("页面标题: " + title);
// 3. 提取所有段落文本
Elements paragraphs = doc.select("div");
for (Element p : paragraphs) {
//System.out.println("段落: " + p.text() + "...");
//获取当前节点的链接
p.forEach(node -> {
// System.out.println("段落: " + node.text() + "...");
// System.out.println("链接 url: " + node.attr("abs:href"));
if(node.text().matches("[0-9]+[\\u4e00-\\u9fa5]+")&&num==0){
// System.out.println("段落: " + node.text() + "...");
String[] allMessage=node.text().split(" ");
for (int i = 0; i < allMessage.length; i++) {
//根据正则表达式[数字中文】过滤
if(allMessage[i].matches("[0-9]+[\\u4e00-\\u9fa5]+")){
// System.out.println("第"+(i+1)+"条热搜:"+allMessage[i]);
if(result.contains(allMessage[i])||match(allMessage[i])){
continue;
}
result.add(allMessage[i]);
}
// System.out.println("第"+(i+1)+"条热搜:"+allMessage[i]);
}
}
else{
System.out.println("最新消息1: " + node.text());
}
});
}
for (String link : result){
//System.out.println("最新消息: " + link.replaceAll("^[0-9]+",""));
System.out.println("最新消息: " + link);
if(num==0) {
// run(link, 1);
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 过滤掉无用的信息和序列号
* @param message
* @return
*/
private static boolean match(String message){
if(message.matches("[0-9]+次阅读+")){
return true;
}
if( message.matches("[0-9]+人聊过+")){
return true;
}
if( message.matches("[0-9]+页")){
return true;
}
if (message.matches("[0-9]+下一页+")){
return true;
}
return false;
}
}
常用选择器
1. 通过标签选择元素
Elements links = doc.select("a"); // 获取所有<a>标签
2. 通过类选择元素
Elements newsHeadlines = doc.select(".news-headline"); // 获取class为news-headline的元素
3. 通过ID选择元素
Element logo = doc.select("#logo").first(); // 获取id为logo的元素
4. 组合选择器
Elements resultLinks = doc.select("div.results > a"); // 获取class为results的div下的直接a子元素
提取数据
1. 获取属性值
String linkHref = link.attr("href"); // 获取href属性 String linkText = link.text(); // 获取链接文本
2. 获取HTML内容
String html = div.html(); // 获取div内的HTML String text = div.text(); // 获取div内的文本(不含HTML标签)
3. 遍历元素
for (Element link : links) { String href = link.attr("href"); String text = link.text(); System.out.println(text + " -> " + href); }
注意事项
设置超时:建议设置连接超时时间
Document doc = Jsoup.connect(url) .timeout(10000) // 10秒超时 .get();
模拟浏览器:有些网站会检查User-Agent
Document doc = Jsoup.connect(url) .userAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64)") .get();
处理相对路径:使用
abs:
前缀获取绝对URLString absUrl = link.attr("abs:href");
遵守robots.txt:确保你的爬虫遵守目标网站的爬取规则
控制请求频率:避免给目标网站造成过大压力
Jsoup 是一个强大而简单的 HTML 解析库,适合大多数简单的爬虫需求。对于更复杂的爬虫任务,可能需要结合其他库如 HttpClient 等使用。