Foros del Web » Programación para mayores de 30 ;) » Java »

[SOLUCIONADO] Extracción de información de web que ejecuta script antes de mostrarse

Estas en el tema de Extracción de información de web que ejecuta script antes de mostrarse en el foro de Java en Foros del Web. De la página: http://lema.rae.es/drae/?val=perro Quiero extraer el siguiente código: Código: <div> <a name="55351"></a> <p class="p"> <span class="f"> <b>perro</b> </span> <span class="f"> <b> <sup>1</sup> </b> </span> ...
  #1 (permalink)  
Antiguo 19/03/2015, 06:23
(Desactivado)
 
Fecha de Ingreso: marzo-2012
Mensajes: 366
Antigüedad: 12 años
Puntos: 31
Extracción de información de web que ejecuta script antes de mostrarse

De la página:

http://lema.rae.es/drae/?val=perro

Quiero extraer el siguiente código:

Código:
<div>
	<a name="55351"></a>
	<p class="p">
		<span class="f">
			<b>perro</b>
		</span>
		<span class="f">
			<b>
				<sup>1</sup>
			</b>
		</span>
		<span class="f">
			<b>, rra</b>
		</span>
		<span class="f">
			<b>.</b>
		</span>
		</p>
		<p></p>
		<p></p>
		<p class="q">
			<a name="1_1"></a>
			<span class="d">
				<b> 1.</b>
			</span>
			<span title="adjetivo" class="d">adj.</span>
			<span class="d">
				<span title="coloquial" class="d">coloq.</span>
			</span>
			<span class="b"> Muy malo, indigno.</span>
		</p>
		<p class="q">
			<a name="1_2"></a>
		<span class="d">
			<b> 2.</b>
		</span>
		<span class="g">
			<span title="adjetivo" class="g">adj.</span>
		</span>
		<span class="d">
			<i>
				<span title="El Salvador" class="d">El Salv.</span>
			</i>
		</span>
		<span class="b"> Dicho de una persona: Enojada, de mal genio.</span>
	</p>
</div>
También quiero extraer más texto de la misma página. Ya que esto se refiere a 2 resultados de búsqueda. El código anterior se refiere al contenido del primer resultado. Y quiero poder extraer los 2 resultados. Lo único identificativo de cada resultado es que justo al acabar cada resultado, termina con la etiqueta </div> y justo después viene el siguiente código en cada uno de los resultados:

Código:
<p class="o">Real Academia Española © Todos los derechos reservados</p>
Y no se como hacerlo. A alguien se le ocurre alguna manera sencilla?

PD: El método propuesto no puede ser exclusivo para esta URL, tiene que valer para cualquier valor puesto después de "http://lema.rae.es/drae/?val="

Última edición por Kritik; 19/03/2015 a las 06:31
  #2 (permalink)  
Antiguo 19/03/2015, 10:27
Avatar de Profesor_Falken  
Fecha de Ingreso: agosto-2014
Ubicación: Mountain View
Mensajes: 1.323
Antigüedad: 9 años, 8 meses
Puntos: 182
Respuesta: Extracción de información de web que ejecuta script antes de mostrarse

Buenas,

Lo mas rapido seria extraerlo directamente mediante expresiones regulares:
http://alvinalexander.com/blog/post/...-matcher-group

Precisamente lo hemos discutido aqui en el foro hace unos dias:
http://www.forosdelweb.com/f45/conse...s-web-1122898/

Si quieres hacer cosas mas avanzadas siempre puedes usar jSoup:
http://jsoup.org/


Si tampoco sabes como recuperar el codigo html de la pagina en java (no esta claro):
http://picarcodigo.blogspot.fr/2013/...-con-java.html


Un saludo
__________________
If to err is human, then programmers are the most human of us
  #3 (permalink)  
Antiguo 26/03/2015, 13:01
(Desactivado)
 
Fecha de Ingreso: marzo-2012
Mensajes: 366
Antigüedad: 12 años
Puntos: 31
Respuesta: Extracción de información de web que ejecuta script antes de mostrarse

Llevo unos días investigando el tema. La cosa es que he comprobado que cuando en el buscador pongo la URL que quiero, antes de enseñarme el resultado que yo busco se ejecuta un script de JavaScript. Con lo que si copio directamente el código HTML de la URL... lo que obtengo es una página con un código JavaScript y un mensaje diciendo que mi navegador permita JavaScript. No se como solucionar esto con java.
  #4 (permalink)  
Antiguo 26/03/2015, 13:43
Avatar de Xerelo  
Fecha de Ingreso: mayo-2009
Mensajes: 2.175
Antigüedad: 14 años, 11 meses
Puntos: 306
Respuesta: Extracción de información de web que ejecuta script antes de mostrarse

Tercer enlace del Profesor_Falken

O llamar directamente a http://buscon.rae.es/drae/srv/search?val=perro
__________________
Cada vez que solucionas los problemas de alguien que no se esfuerza, piensa en que el día de mañana puede llegar a ser tu compañero de trabajo, o peor, tu jefe.
  #5 (permalink)  
Antiguo 02/04/2015, 05:00
(Desactivado)
 
Fecha de Ingreso: marzo-2012
Mensajes: 366
Antigüedad: 12 años
Puntos: 31
Respuesta: Extracción de información de web que ejecuta script antes de mostrarse

En esa dirección que apuntas pasa exactamente lo mismo. Primero se ejecuta un JavaScript y después se muestra el resultado. Este resultado no está en la página inicial y por lo tanto su código HTML original no contiene la información que busco.

He estado viendo a fondo la librería Jsoup y según he visto en otros foros tampoco sirve para recoger información que salga después de ejecutar ningún JavaScript. Si me equivoco decídmelo.

Hace unos días vi por internet otra librería para scraping que sí ejecutaba javascrits, pero tonto de mí no me apunté la página. Alguno me puede dar ideas?

Por último también he estado viendo que existe la posibilidad de usar navegadores dentro de java. Si no hay más remedio me pondría a ver esta posibilidad. Pero me gustaría poder evitarla por todos los recursos de memoria y otros que estoy seguro que dicha opción requeriría.

Edito:
Según Wikipedia:
HtmlUnit es un navegador web sin interfaz de usuario escrito en Java.

Al no usar interfaz de usuario quizá esto no requiera tantos recursos, y pueda ejecutar los scripts de JavaScript de la web que menciono arriba. Vosotros qué pensáis?

Última edición por Kritik; 02/04/2015 a las 05:05
  #6 (permalink)  
Antiguo 02/04/2015, 05:43
Avatar de Profesor_Falken  
Fecha de Ingreso: agosto-2014
Ubicación: Mountain View
Mensajes: 1.323
Antigüedad: 9 años, 8 meses
Puntos: 182
Respuesta: Extracción de información de web que ejecuta script antes de mostrarse

Buenas,

En ese caso tendras que utilizar efectivamente un browser que se ejecute en segundo plano y pueda interpretar el javascript.

Las opciones mas logicas serian Selenium y HTMLUnit.
http://www.seleniumhq.org/
http://htmlunit.sourceforge.net/

Selenium se basa en los drivers de rendering de los propios navegadores (webkit y gecko).

HTMLUnit es una implementacion de un navegador hecha desde cero en java por lo que no depende de drivers externos. Es mas rapida, pero su implementacion e interpretacion de javascript puede no ser tan precisa y potente como la que hacen los navegadores.

Yo he utilizado mucho Selenium y funciona bastante bien. HTMLUnit, ni idea...


Un saludo
__________________
If to err is human, then programmers are the most human of us
  #7 (permalink)  
Antiguo 04/04/2015, 08:57
(Desactivado)
 
Fecha de Ingreso: marzo-2012
Mensajes: 366
Antigüedad: 12 años
Puntos: 31
Respuesta: Extracción de información de web que ejecuta script antes de mostrarse

Al final he utilizado HTMLUnit y me ha resultado super-facil.

Muchas gracias.
  #8 (permalink)  
Antiguo 04/04/2015, 12:43
Avatar de Profesor_Falken  
Fecha de Ingreso: agosto-2014
Ubicación: Mountain View
Mensajes: 1.323
Antigüedad: 9 años, 8 meses
Puntos: 182
Respuesta: Extracción de información de web que ejecuta script antes de mostrarse

Cita:
he utilizado HTMLUnit y me ha resultado super-facil.
Genial. Podrías compartir entonces la solución que has hecho con HTMLUnit? De esa forma si alguien tiene un problema similar sabrá como solucionarlo.

Además, como comentaba, yo no lo he utilizado nunca y tengo curiosidad

Un saludo
__________________
If to err is human, then programmers are the most human of us
  #9 (permalink)  
Antiguo 04/04/2015, 14:24
(Desactivado)
 
Fecha de Ingreso: marzo-2012
Mensajes: 366
Antigüedad: 12 años
Puntos: 31
Respuesta: Extracción de información de web que ejecuta script antes de mostrarse

Después de incluir en el proyecto todos los archivos .jar de HTMLUnit, mi código es el siguiente:
Código:
package PruebasVarias;

import com.gargoylesoftware.htmlunit.BrowserVersion;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.HtmlPage;

public class AnalizadorHTML {
	public static void main(String[] args) throws Exception {
	// La siguiente línea desabilita los warnings de htmlunit
	java.util.logging.Logger.getLogger("com.gargoylesoftware").setLevel(java.util.logging.Level.OFF);

	// Escoje versión de explorador. En algunas webs es necesario:
	WebClient webClient = new WebClient(BrowserVersion.INTERNET_EXPLORER_11);
	// Espera un máximo de 50.000 milésimas de segundo a que se ejecute todo el JavaScript:
	webClient.waitForBackgroundJavaScript(50000);
	// Indica la web y la captura después del tiempo de los scripts:
	HtmlPage page = webClient.getPage("http://buscon.rae.es/drae/srv/search?val=perro");
	// Imprime el contenido de la etiqueta <body> de la web:
	System.out.println(page.getBody().getTextContent());
	}
}

Última edición por Kritik; 04/04/2015 a las 14:30 Razón: /

Etiquetas: ejecuta, extracción
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 23:53.