Jsoup是Java初学者写网络爬虫最稳妥的选择,但必须设置超时和User-Agent以防403错误;优先用select()而非getElementById();保存文件需显式指定UTF-8编码;JS渲染等复杂场景需换用Selenium或Playwright。

Java初学者直接上手写网络爬虫,Jsoup 是最稳妥的选择——它不强制你处理 HTTP 连接细节、编码转换、DOM 解析异常,也不会因为一个重定向就抛出 IOException 而卡住。
用 Jsoup.get() 抓取页面前必须设超时和用户代理
默认超时是 30 秒,且没有 User-Agent,很多网站会直接返回 403 或空响应。不加这两项,你可能反复看到 HttpStatusException: status code is 403 却查不出原因。
-
connectTimeout(5000):设为 5 秒,避免卡死 -
userAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"):模拟主流浏览器,绕过基础反爬 - 别用
Jsoup.connect(url).get()简写,漏掉超时设置是新手高频失误
解析 HTML 时优先用 select() 而不是 getElementById()
getElementById() 要求 ID 唯一且静态,而实际网页中 ID 可能动态生成、重复或根本不存在;select() 支持 CSS 选择器,灵活又贴近前端调试习惯,比如抓取所有新闻标题:doc.select("h3.title a")。
- 用
select("a[href]")提取带链接的标签,比遍历所有Element更快 - 若选择器返回空集合,
Elements不会报错,但.first()会返回null——记得判空再调.text() - 避免写
doc.body().getElementsByTag("div").get(2),结构微调就崩
保存爬取内容到本地文件需手动指定 UTF-8 编码
用 FileWriter 直接写中文会乱码,因为它的默认编码依赖系统(Windows 是 GBK)。即使源页面声明了 UTF-8,不显式指定,文件里就是问号或方块。
立即学习“Java免费学习笔记(深入)”;
- 改用
Files.write(Paths.get("output.txt"), content.getBytes(StandardCharsets.UTF_8)) - 如果用
PrintWriter,必须传入Charset.forName("UTF-8")构造参数 - 写入前建议先用
doc.charset()确认网页实际编码,有些页面 meta 声明是 UTF-8,但响应头是 GB2312
Document doc = Jsoup.connect("https://example.com")
.userAgent("Mozilla/5.0")
.timeout(5000)
.get();
Elements titles = doc.select("h2.post-title");
for (Element title : titles) {
String text = title.text();
if (!text.isEmpty()) {
System.out.println(text);
}
}
真正难的不是写出第一版爬虫,而是当目标网站加了 JavaScript 渲染、登录态校验或请求频率限制时,Jsoup 就彻底失效——这时候得换 Selenium 或 Playwright,但那已经不是“初学者项目”范畴了。










