Java网页爬虫问题:获取Betting View点击后网格数据时返回null
你的爬取代码存在几个关键问题,无法正常获取目标数据,具体分析和修复方案如下:
1. 目标URL构造错误
你当前的teamLink是https://www.teamrankings.com/nba/team/cleveland-cavaliers/.betting,这里多了一个不必要的点号。正确的Betting View页面URL应该是https://www.teamrankings.com/nba/team/cleveland-cavaliers/betting——直接在原球队URL后追加/betting即可。
2. XPath选择器写法错误
你使用的div.btn-group是CSS选择器的语法,但HtmlUnit的getFirstByXPath方法需要的是XPath表达式,正确的写法应该是//div[@class='btn-group']:
//表示从整个文档范围内查找匹配节点,而非从当前节点开始[@class='btn-group']明确指定要匹配class属性为btn-group的div元素,避免匹配到无关节点
3. 代码逻辑冗余且顺序不合理
你同时初始化了Jsoup的Document和HtmlUnit的WebClient,但实际上只需要用HtmlUnit处理动态交互即可,Jsoup在这里属于冗余代码。另外,你在获取div元素前没有等待页面JavaScript渲染完成,这会导致目标元素还未生成就被查找,自然返回null。
修复后的示例代码
String teamLink = "https://www.teamrankings.com/nba/team/cleveland-cavaliers/betting"; // 初始化HtmlClient并配置优化项 final WebClient webClient = new WebClient(BrowserVersion.FIREFOX_45); webClient.getOptions().setCssEnabled(false); // 禁用CSS加载提升速度 webClient.getOptions().setJavaScriptEnabled(true); // 启用JS以支持页面动态渲染 webClient.getOptions().setThrowExceptionOnScriptError(false); // 忽略JS执行错误,避免程序中断 webClient.waitForBackgroundJavaScript(3000); // 等待3秒让JS完成页面渲染 // 获取目标页面 HtmlPage page = webClient.getPage(teamLink); // 使用正确的XPath查找目标div final HtmlDivision div = page.getFirstByXPath("//div[@class='btn-group']"); if (div != null) { page = div.click(); // 点击后再次等待JS渲染,确保网格数据加载完成 webClient.waitForBackgroundJavaScript(2000); // 此处可添加代码提取网格数据,比如解析table元素 System.out.println("点击成功,可开始提取网格数据"); } else { System.out.println("未找到目标btn-group元素"); } // 关闭webClient释放资源 webClient.close();
额外提示
- 部分网站存在反爬机制,频繁请求可能会被封禁IP,建议添加请求间隔,或模拟真实浏览器的请求头信息
- 如果点击后的数据是通过AJAX异步加载的,直接分析接口获取数据会比模拟点击更高效稳定
内容的提问来源于stack exchange,提问作者manderson
相关产品推荐
相关产品推荐

