java - tablas - Analizar tabla HTML después de hacer clic en un botón para hacerlo visible
tablas en html5 (3)
Estoy trabajando en un programa Java que necesita leer datos de un sitio web cuando se inicia.
El sitio web en cuestión es este: http://bitcoincharts.com/charts/btceUSD#rg10zigHourlyztgSzm1g10zm2g25zv
Para acceder a la tabla que se necesita, hay un botón cerca de la parte inferior de la página titulada "Cargar datos sin procesar". Cuando se hace clic, aparece la tabla con la información que necesito.
Aunque nunca lo había hecho antes, creo que puedo aprender fácilmente a analizar la tabla y obtenerla en algunas matrices. Lo que no he podido descifrar, sin embargo, es cómo hacer que mi programa "haga clic" en ese botón para que aparezca la tabla. ¿Cómo puedo hacer esto?
Editar: aquí es con lo que estoy trabajando ahora mismo. Actualmente esto no imprime absolutamente nada, y sospecho que es porque jsoup no está viendo la tabla porque el botón "Cargar datos sin procesar" no ha sido "hecho clic".
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);
}
}
}
Al mirar su enlace, parece que todo lo que hace es ejecutar el código javascript "load_table (); return false;". Esto significa que en lugar de hacer clic en el enlace, puede enviar estos comandos a la página y acceder a la tabla de esa manera.
Los datos de la tabla son dinámicos y se generan a través de javascript. Cuando presiona el enlace, se envía una solicitud ajax y se reciben los datos. Un analizador como Jsoup no puede manejar elementos dinámicos porque no puede representar javascript. Revisa el selenio por eso. Incluye un motor js, por lo que puede ejecutar js y luego analizar los datos.
EDITAR
Después de excavar, encontré este http://bitcoincharts.com/about/markets-api/ . Parece que la página incluye un servicio REST al que puede acceder y obtener los datos que desea. Tal vez esta es una mejor manera de obtener los datos que desea, aunque puede tener algún límite de uso.
Para hacer clic en enlaces y obtener otros scripts de cliente interactivos ejecutados, es posible que desee soltar Jsoup
y usar HtmlUnit
lugar. Obtendrá la funcionalidad que necesita para hacer clic en los enlaces y raspar la página HTML también.
Para su propósito, está accediendo a un enlace con la población de datos dinámicos a través de ajax
. Para replicar este escenario, debe capturar el elemento HtmlElement
y volver a representar la página haciendo clic en él.
Algo como esto:
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();
Ahora maneja los datos representados. Probablemente me gusta:
HtmlTable table = (HtmlTable) page.getElementById("chart_table");
System.out.println("Here : - > " + table.asText());
La única complicación que puedo ver es que, como es una llamada de AJAX, podría ser un poco complicado renderizar la página después de unos segundos. La página de preguntas frecuentes en HtmlUnit ofrece algunas opciones para superarlo:
http://htmlunit.sourceforge.net/faq.html#AJAXDoesNotWork
EDITAR: Bueno, acabo de probar mi código anterior (por curiosidad, por supuesto) y raspa la totalidad de los datos que está buscando, captura de pantalla a continuación:
¡Espero eso ayude!