1. 为什么选择JSoup作为Java爬虫入门工具
在Java生态中处理HTML解析时,我们通常会面临几个核心痛点:HTML结构的复杂性、标签嵌套的混乱性以及数据提取的精确性要求。JSoup的出现完美解决了这些问题,它提供了一套类似jQuery的API,让HTML解析变得像操作DOM一样简单。
与HttpClient等基础网络库相比,JSoup最大的优势在于它的"All-in-One"特性。一个典型的爬虫工作流程包含网络请求、HTML解析、数据提取三个关键环节,而JSoup用一个简洁的API体系覆盖了全流程。以下是它最突出的三个特点:
- CSS选择器支持:使用
document.select("div.content > a[href]")这样的表达式就能精准定位元素,比XPath更符合前端开发者的思维习惯 - 容错处理机制:能自动修复残缺的HTML标签,即使面对最混乱的网页源码也不会解析失败
- 防注入安全:内置的HTML清理功能可以过滤危险的脚本标签,避免XSS攻击风险
提示:虽然JSoup也能发送HTTP请求,但在生产环境中建议配合专业HTTP客户端(如OkHttp)使用,以获得更好的连接池管理和重试机制。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境搭建与基础用法
2.1 项目依赖配置
对于Maven项目,在pom.xml中添加最新版本依赖(截至2023年7月最新版为1.16.1):
xml复制<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.16.1</version>
</dependency>
如果是Gradle项目,则使用:
groovy复制implementation 'org.jsoup:jsoup:1.16.1'
2.2 第一个爬虫示例
我们以爬取知乎热榜为例,演示最基本的加载-解析-提取流程:
java复制public class ZhihuHot {
public static void main(String[] args) throws IOException {
// 1. 加载文档
Document doc = Jsoup.connect("https://www.zhihu.com/hot")
.userAgent("Mozilla/5.0") // 模拟浏览器
.timeout(5000) // 超时设置
.get();
// 2. 使用CSS选择器提取数据
Elements hotItems = doc.select(".HotItem-title");
// 3. 遍历结果
for (Element item : hotItems) {
System.out.println(item.text());
}
}
}
这段代码揭示了一个爬虫最核心的三步走逻辑。值得注意的是.userAgent()的设置非常重要,许多网站会对没有User-Agent或使用默认Java UA的请求直接拒绝。
3. 高级选择器技巧实战
3.1 属性提取与多层嵌套
实际项目中我们往往需要提取特定属性的值,比如链接的href或图片的src。假设我们要抓取豆瓣电影Top250:
java复制Docum
