java - HtmlUnit - 找不到动态内容
问题描述
加载此页面时,在 HtmlPage 对象中返回的动态内容没有任何运气:https ://www.fangraphs.com/leaders/splits-leaderboards?splitArr=5&strgroup=season&statgroup=1&startDate=2018-03-01&endDate= 2018-11-01&filter=IP%7Cgt%7C0&position=P&statType=player&autoPt=true&players=&pg=0&pageItems=30&sort=22,1&splitArrPitch=&splitTeams=false
“react-drop-test” div 是空的。我正在尝试使用“导出数据”文本找到锚点,以便我可以单击它并将内容作为流获取。
关于我可以做些什么来让 HtmlPage 包含动态内容的任何想法?
这是我现在拥有的样本。锚永远不会返回任何元素。
webClient = new WebClient(BrowserVersion.CHROME);
webClient.getOptions().setThrowExceptionOnFailingStatusCode(false);
webClient.getCookieManager().setCookiesEnabled(false);
webClient.getOptions().setThrowExceptionOnScriptError(false);
webClient.setAjaxController(new NicelyResynchronizingAjaxController());
webClient.setJavaScriptTimeout(jsTimeout);
updateJSErrorListener(webClient);
int thisYear = year;
if (isEarlySeason()) {
thisYear = year - 1;
}
String leftyURL = "https://www.fangraphs.com/leaderssplits.aspx?splitArr=5&strgroup=season&statgroup=1&startDate=" + thisYear + "-03-01&endDate=" + year + "-11-01&filter=IP%7Cgt%7C0&position=P&statType=player&autoPt=true&players=&pg=0&pageItems=30&sort=22,1";
HtmlPage page = webClient.getPage(leftyURL);
HtmlAnchor leftyAnchor = null;
HtmlDivision div = (HtmlDivision) page.getElementById("react-drop-test");
List<HtmlElement> anchors = div.getElementsByTagName("a");
for (DomElement anchor:anchors2) {
if ((anchor.getAttribute("class").contains("data-export"))) {
leftyAnchor = (HtmlAnchor) anchor;
break;
}
}
Page p = leftyAnchor.click();
InputStream is = p.getWebResponse().getContentAsStream();
List<List<String>> leftyCSV = readCSVFile(is);
解决方案
另一个网页充满了奇怪的js。因此,让我从一些一般性提示开始:
- 如果不需要,请不要更改默认配置(或者如果您不知道这会产生什么影响)
- 因为您的页面(或至少部分)是由 javscript 呈现的,所以您必须在某个地方等待
最后:您需要更新版本的 HtmlUnit 来完成工作,因为 javascript impl 缺少一个功能来使该页面使用的 javascript 代码正常工作。
要获得新的 (SNAPSHOT) 版本,您有以下选项:
- 等待下一个版本
- 等待 maven 提供的下一个快照构建(如果可用,将通过https://twitter.com/HtmlUnit通知)
- 等待构建服务器(http://83.169.43.181/jenkins/job/HtmlUnit%20-%20Fast%20Build/)再次变绿,然后下载最新的工件
- 或在 Github ( https://github.com/HtmlUnit/htmlunit )上 fork 项目并自己构建
使用最新的代码库,这将为您完成这项工作:
String url = "https://www.fangraphs.com/leaders/splits-leaderboards?splitArr=5&strgroup=season&statgroup=1&startDate=2018-03-01&endDate=2018-11-01&filter=IP%7Cgt%7C0&position=P&statType=player&autoPt=true&players=&pg=0&pageItems=30&sort=22,1&splitArrPitch=&splitTeams=false";
try (final WebClient webClient = new WebClient(BrowserVersion.FIREFOX_60)) {
webClient.getOptions().setThrowExceptionOnScriptError(false);
HtmlPage page = webClient.getPage(url);
webClient.waitForBackgroundJavaScript(50000);
System.out.println("----------------");
System.out.println(page.asText());
HtmlDivision div = (HtmlDivision) page.getElementById("react-drop-test");
List<HtmlElement> anchors = div.getElementsByTagName("a");
for (DomElement anchor:anchors) {
if ((anchor.getAttribute("class").contains("data-export"))) {
HtmlAnchor leftyAnchor = (HtmlAnchor) anchor;
Page p = leftyAnchor.click();
System.out.println();
System.out.println("----------------");
System.out.println(p.getWebResponse().getContentAsString());
break;
}
}
}
推荐阅读
- javascript - 仅在服务器上需要一个包
- java - Intellij IDEA 仅针对所有未提交的更改运行测试
- regex - 在换行符之前匹配字符,不包括空格?
- macos - MacOS - 使用带有launchd的脚本 - 启动,登录,注销,关闭?
- service-worker - Workbox 的服务人员在更改时未更新
- python - AllenNLP 共指分辨率的多 GPU 训练
- reactjs - 事件处理程序中带有 [name] 的 PrevState
- python - 如何解决 Django 开发中的错误 10013?
- rspec - Rspec 期望方法给出 ArgumentError: wrong number of arguments (given 0, expected 1..2)
- docker - 在 docker swarm 环境中部署 couchbase