Java Jsoup爬取in-the-sky网页指定文本失败如何排查解决
Jsoup爬取目标内容失败排查
代码无法正常获取内容由3个核心问题导致:
- CSS选择器语法错误:
div.col-md-6 col-md-pull-6中的空格代表后代选择器,语义为查找div.col-md-6节点下名为col-md-pull-6的子标签,这类标签不存在。匹配同时带有多个class的节点时,多个类选择器需要直接连写,不能加空格,正确写法为div.col-md-6.col-md-pull-6。 - 选择器匹配范围过泛:页面中存在多个带
col-md-6类名的div节点,直接按类匹配容易选中非目标区块,建议先定位到id唯一的主内容父容器再向下查找,避免匹配到空节点。 - 请求头缺失:该站点会拦截无合法User-Agent的请求,Jsoup默认携带的Java客户端UA会被反爬规则识别,返回的文档结构和浏览器端看到的结构不一致,导致选择器匹配失效。
修正后可运行代码
import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; public class Main { public static void main(String args[]) { int num = 216; int day = 17; int month = 6; int year = 2022; String url ="https://in-the-sky.org/data/object.php?id=A"+num+"&day="+day+"&month="+month+"&year="+year; System.out.println(url); Document doc = null; try { // 模拟浏览器UA,绕过基础反爬拦截 doc = Jsoup.connect(url) .userAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36") .get(); } catch (Exception e) { e.printStackTrace(); } System.out.println("======================================================="); // 先定位唯一主内容区,再匹配目标多类div,多类选择器不加空格 Element targetDiv = doc.selectFirst("div#mainContent div.col-md-6.col-md-pull-6"); if (targetDiv != null) { String output = targetDiv.select("p").text(); System.out.println(output); } else { System.out.println("未匹配到目标节点,可打印doc.html()检查实际返回的页面结构"); } System.out.println("======================================================="); } }
若运行后仍无法获取内容,优先打印返回的完整HTML源码,确认目标节点是否存在,部分动态渲染内容无法被静态爬取直接获取。
内容的提问来源于stack exchange,提问作者Siwoo Park
相关产品推荐
相关产品推荐

