Java: Obtener código fuente de una página web

zildjian

¡Buenas tardes mediavideros! Tengo un pequeño proyecto entre manos, y una de las partes requiere que mediante Java haga una función que se conecte a Internet, a una página web y obtenga su código fuente y lo almacene en un String. Mirando por ahí he encontrado una función que haría algo parecido, pero quiero saber si hace exactamente lo que pido.

No os pediría ayuda, pero todavía soy algo novato en Java, es decir, se crear programas básicos pero cuando se trata de librerías desconocidas para mi... la cosa se complica. Así pues, os pongo el trozo de código que he encontrado:

http://nopaste.info/e3bd1fdf94.html

¿Se supone que todo el código se almacenaría en el String Data? Muchas gracias de antemano, y un saludo :)

Soltrac

Sin conocer Java (al menos sus funciones) te diría que sí.

Pero pregunto yo...¿por qué no lo pruebas?

zildjian

Quería saber antes orientativamente si estaba medio-bien, pero visto lo visto, lo probaré xD

dagavi

¿Te has tirado un día esperando a que alguien te diga si está bien cuando en 1 minuto podías haber ejecutado el código y comprobarlo por ti mismo? (y de no funcionar venir y preguntar)

Aun así, sin saberlo ya que no me lo se de memoria, diría que eso puede funcionar. Es que para esto hay 1000 formas y todas hacen lo mismo.

Puedes crear un InputStreamReader(URL, string-codificación) y utilizarlo para realizar lecturas normales y corrientes, con lo que leerías la web.

Diría que la clase URL también tiene algo como "openInputStream" que te devuelve lo anterior ya configurado, o "openConection que te retornará el objeto del tipo URLConection... Como ves 1000 formas para acabar haciendo lo mismo.

Forma simple, puedes crear el objeto tipo URL y pedirle el inputstream. Con el lees como se lee siempre de un input stream (por ejemplo, como si fuera de teclado).

Edit: Ejemplo

		URL url = new URL("http://www.mediavida.com");
		BufferedReader bs = new BufferedReader(new InputStreamReader(url.openStream()));
		String txt;
		while ((txt = bs.readLine()) != null) System.out.println(txt);
1
zildjian

Vale, ya tengo el código, y es el siguiente:

http://nopaste.info/9c746308bf.html

Ahora bien, si por ejemplo tengo lo de "No cerrar sesión" en el Facebook o Gmail, por qué cuando intento obtener el código fuente de esa página se obtiene el código de como si no me hubiera logueado? No se si me he explicado bien :$

dagavi

Por el mismo motivo que si inicias sesión en Firefox y le dices "No cerrar sesión" al abrir la web con Internet Explorer la sesión no está abierta.

zildjian

Y... ¿alguna manera de solventarlo? .

cabron

Tendrás que añadir gestión de cookies a tu programa.

erdanblo

Tendrás que mirar de alguna libreria que te permita enviar peticiones POST, como curl, para mandar el usuario y password al formulario de login.

dagavi

Como te han dicho, tienes que enviar POST, pero entonces te encontrarás con el problema de mantener la sesión abierta. URLConection no la mantiene, pero he leído que algo que resuelve estos inconvenientes es HttpClient (http://hc.apache.org ) aunque no lo he probado (solo he buscado esta información a raíz de este post).

erdanblo

Quizás lo que intentas conseguir te lo proporcione la propia API de Facebook :P

zildjian

Pero vi que la API de Facebook estaba en JSP, es igual o "casi igual" que Java?

Patt0n

#12 La API de facebook no está en JSP, eso no tiene sentido.

JSP es un acrónimo para Java Server Pages, a grandes rasgos, páginas html clásicas (o xml) entremezcladas con llamadas a código Java.

Si quieres hacer algo con facebook, intenta hacerlo a través del API, probablemente te evite muchos quebraderos de cabeza.

http://developers.facebook.com/docs/guides/web
http://developers.facebook.com/docs/api

Por lo que veo las respuestas son objetos JSON (¿eso es lo que habías leído?)

zildjian

Probablemente, ida de olla. Lo siento xD

zildjian

Por cierto, lo que quiero hacer no sólo es con Facebook. Por ejemplo, se podría hacer: le metes una URL que no requiera de login y obtiene el código con el código que posteé. Ahora bien, si el string es "www.facebook.com", llame a funciones de la API. Es posible?

dagavi

if (facebook) callAPI();
else getCode();

Patt0n

Cómo te han dicho :)

Pero vas a tener el mismo problema con cualquier sitio que requiera login... Con el api de facebook puedes loguear un usuario y recibir la información que ese usuario puede consultar (si tienes sus datos) pero o bien miras cómo manejar sesiones y cookies desde java o te toca ir mirando api por api de las páginas que quieras "utilizar"...

Todo depende de lo que quieras hacer.

zildjian

Sólo Gmail y Facebook, ahora miraré si tiene también API, y si no pues a investigar sobre cookies!

Tu_Dios

Yo te aconsejo que no te líes con las cookies, usa API sea como sea y si no... no uses nada.

¿Cual es tu idea? ¿Pillar el chorrazo de html en una string y parseartelo? (Porque imagino que cosas como las cabeceras las querrás descartar) Pues te vas a tirar un ratito mirando que patrones buscar para sacar el dato X.
Si lo quieres hacer perfecto, pero.... ¿que pasa si mañana Gmail cambia la estructura aunque sea ligerisimamente (como por ejemplo hizo hace dos días con la nueva forma de gestionar contactos)? Pues te lo digo yo, te toca revisarte tu código y así te tocara estar hasta que quieras matar el proyecto.

Lo dicho, API o nada.

Usuarios habituales

  • Tu_Dios
  • zildjian
  • Patt0n
  • dagavi
  • erdanblo
  • cabron
  • Soltrac