我正在研究一个需要在网站启动时从网站读取数据的Java程序。
有问题的网站是:http://bitcoincharts.com/charts/btceUSD#rg10zigHourlyztgSzm1g10zm2g25zv
要访问所需的表格,页面底部附近有一个标题为“加载原始数据”的按钮。单击时,会显示包含我需要的信息的表格。
虽然我以前从未这样做过,但我相信我可以轻松地学习如何解析表并将其放入某些数组中。但是,我无法弄清楚的是如何让我的程序“点击”该按钮以使表格显示。我怎么能这样做呢?
编辑:这是我现在正在使用的内容。目前这打印绝对没有,我怀疑这是因为jsoup没有看到表,因为“加载原始数据”按钮没有被“点击”。
for (Element table : doc.select("table[id=chart_table]")) {
for (Element row : table.select("tr:gt(2)")) {
Elements tds = row.select("td:not([rowspan])");
for (Element element : tds) {
System.out.println(element);
}
}
}
答案 0 :(得分:2)
要单击链接并执行其他交互式客户端脚本,您可能需要删除Jsoup
并使用HtmlUnit
。您将获得单击链接并刮取HTML页面所需的功能。
出于您的目的,您通过ajax
访问包含动态数据填充的链接。要复制此方案,您必须捕获HtmlElement
并通过单击再次呈现页面。
这样的事情:
final WebClient webClient = new WebClient(BrowserVersion.FIREFOX_17,
YOUR_PROXY_HOST, YOUR_PROXY_PORT);
WebRequest request = new WebRequest(
new URL(
"http://bitcoincharts.com/charts/btceUSD#rg60ztgSzm1g10zm2g25zv"));
webClient.getOptions().setThrowExceptionOnScriptError(false);
webClient.setJavaScriptTimeout(10000);
webClient.getOptions().setJavaScriptEnabled(true);
webClient.setAjaxController(new NicelyResynchronizingAjaxController());
webClient.getOptions().setTimeout(10000);
HtmlPage page = webClient.getPage(request);
webClient.waitForBackgroundJavaScript(30000);
List<HtmlAnchor> anchors1 = page.getAnchors();
HtmlAnchor link2 = null;
for (HtmlAnchor anchor : anchors1) {
//System.out.println(anchor.asText());
if (anchor.asText().indexOf("Load raw data") > -1) {
link2 = anchor;
break;
}
}
page = link2.click();
现在您处理渲染的数据。可能就像:
HtmlTable table = (HtmlTable) page.getElementById("chart_table");
System.out.println("Here : - > " + table.asText());
我能看到的唯一复杂因素是它是一个ajax调用,几秒后渲染页面可能有点棘手。 HtmlUnit上的FAQ页面提供了一些选项来克服它:
http://htmlunit.sourceforge.net/faq.html#AJAXDoesNotWork
修改强> 好吧,我刚刚尝试了上面的代码(出于好奇,当然)并且它会删除你要查找的所有数据,截图如下:
希望它有所帮助!
答案 1 :(得分:0)
查看您的链接,看起来好像所有链接都执行了javascript代码“load_table(); return false;”。这意味着您可以向页面发送这些命令,而不是单击链接,而是以相应的方式访问表格。
答案 2 :(得分:0)
该表的数据是动态的,并通过javascript生成。当您按下链接时,将发送ajax请求并接收数据。像Jsoup这样的解析器无法处理动态元素,因为它无法呈现javascript。检查硒。它包含一个js引擎,因此您可以执行js然后解析数据。
修改强>
经过一番挖掘后,我找到了http://bitcoincharts.com/about/markets-api/。该页面似乎包含一个REST服务,您可以点击并获取所需的数据。也许这是获取所需数据的更好方法,尽管它可能有一些使用限制。