|
||
|
![]() |
![]() |
Programación y Desarrollo para Android Subforo exclusivo para temas de programación de software para PDAs y desarrollo de aplicaciones, interfaces, etc bajo Android |
![]() |
|
Herramientas |
#1
|
||||
|
||||
¿Como obtengo datos de una web?
Buenas,
Estoy ya desesperado buscando info de como obtener datos de una web y tratarlos. La historia es que quiero hacer una aplicacion que haga una petición a una web y pueda obtener datos y tratarlos, como si se tratara de cualquier usuario que desde su pc selecciona valores de combos y posteriormente hace la consulta. A ver si alguien puede ayudarme y darme las claves para documentarme. Saludos. EDITO: He encontrado esto, pero no se como adaptar esto para consultar otras webs... Código:
public class OptionScraper { // example XPATH queries in the form of strings - will be used later private static final String NAME_XPATH = "//div[@class='yfi_quote']/div[@class='hd']/h2"; private static final String TIME_XPATH = "//table[@id='time_table']/tbody/tr/td[@class='yfnc_tabledata1']"; private static final String PRICE_XPATH = "//table[@id='price_table']//tr//span"; // TagNode object, its use will come in later private static TagNode node; // a method that helps me retrieve the stock option's data based off the name (i.e. GOUAA is one of Google's stock options) public static Option getOptionFromName(String name) throws XPatherException, ParserConfigurationException,SAXException, IOException, XPatherException { // the URL whose HTML I want to retrieve and parse String option_url = "http://finance.yahoo.com/q?s=" + name.toUpperCase(); // this is where the HtmlCleaner comes in, I initialize it here HtmlCleaner cleaner = new HtmlCleaner(); CleanerProperties props = cleaner.getProperties(); props.setAllowHtmlInsideAttributes(true); props.setAllowMultiWordAttributes(true); props.setRecognizeUnicodeChars(true); props.setOmitComments(true); // open a connection to the desired URL URL url = new URL(option_url); URLConnection conn = url.openConnection(); //use the cleaner to "clean" the HTML and return it as a TagNode object node = cleaner.clean(new InputStreamReader(conn.getInputStream())); // once the HTML is cleaned, then you can run your XPATH expressions on the node, which will then return an array of TagNode objects (these are returned as Objects but get casted below) Object[] info_nodes = node.evaluateXPath(NAME_XPATH); Object[] time_nodes = node.evaluateXPath(TIME_XPATH); Object[] price_nodes = node.evaluateXPath(PRICE_XPATH); // here I just do a simple check to make sure that my XPATH was correct and that an actual node(s) was returned if (info_nodes.length > 0) { // casted to a TagNode TagNode info_node = (TagNode) info_nodes[0]; // how to retrieve the contents as a string String info = info_node.getChildren().iterator().next().toString().trim(); // some method that processes the string of information (in my case, this was the stock quote, etc) processInfoNode(o, info); } if (time_nodes.length > 0) { TagNode time_node = (TagNode) time_nodes[0]; String date = time_node.getChildren().iterator().next().toString().trim(); // date returned in 15-Jan-10 format, so this is some method I wrote to just parse that string into the format that I use processDateNode(o, date); } if (price_nodes.length > 0) { TagNode price_node = (TagNode) price_nodes[0]; double price = Double.parseDouble(price_node.getChildren().iterator().next().toString().trim()); o.setPremium(price); } return o; } } Última edición por systemx2 Día 21/06/10 a las 12:06:48. |
|
#2
|
||||
|
||||
Obtener los datos es relativamente simple (empleando HTTP). Procesarlos... es otra historia.
Para acceder a la información necesitas abrir una conexión mediante el método openConnection() de un objeto URL. A partir de ahí puedes obtener los datos mediante el método getInputStream de la conexión. Este método retorna un objeto que implementa el interfaz InputStream. A partir de él sólo se puede leer byte a byte, o una matriz de bytes. En ambos casos, se llama a esos métodos repetidamente hasta que retorne un -1 (que indica que no hay más datos). Lo habitual (por simplificar) es crear un BufferedReader a partir del InputStream para disponer del método readLine() que lee el contenido línea a línea. En tu caso, podrías pasar el contenido de la página a un String y luego procesarlo. Cómo procesarlo depende del formato de la página Web. Puedes ir buscando los trozos que te interesan mediante indexOf. Para guardar el contenido de una página en un String, el código sería similar al siguiente: Código:
URL direccion; URLConnection cnn; BufferedReader reader; try { direccion = new URL("http://www.google.com"); cnn = direccion.openConnection(); String texto = ""; reader = new BufferedReader(new InputStreamReader(cnn.getInputStream())); String cad; while ( (cad = reader.readLine()) != null){ texto += cad ; } System.out.println("El contenido de la página\n"); System.out.println(texto); } catch (Exception ex) { ex.printStackTrace(); } |
#3
|
||||
|
||||
Lo primero, gracias por responder. Lo que yo busco, ademas de traerme toda la info de una web, es poder hacer una consulta despues, es decir, a la pagina inicial que me he traido, añadirle parámetros para que me devuelva otra página con los datos que necesito.
Un proyecto parecido al que quiero hacer es este: http://ascii164.com/blog/productos/urbanstep COn este programa, se sabe lo que tarda un bus en llegar a tu parada, pero claro, para eso habrá que hacer una petición (vete a saber donde) pasándole un parámetro que diga en qué aprada estás...Pues eso mismo quiero hacer yo...y me estoy volviendo loco... |
#4
|
||||
|
||||
Consulta URL
Lo primero es saber la consulta que tienes que hacer. Para ello, basta con ejecutar la consulta desde el navegador y mirar los parámetros que se les pasa.
Pero eso depende de la web a la que quieras acceder y de cómo se pasan los parámetros. Incluso en algunos casos puede ser simplemente imposible saberlo (por ejemplo, la web de autobuses de vizcaya -bizkaibus- emplea una página en flash con lo que no se ven los parámetros que se les pasa). Así que lo primero es saber a qué página quieres acceder y cómo se accede a ella normalmente. En cualquier caso, no sé si la información la obtendrán de la web directamente desde la aplicación. También se puede coger la información a mano y crear una base de datos sobre ella. Un saludo |
#5
|
||||
|
||||
Lo primero es saber la consulta que tienes que hacer. Para ello, basta con ejecutar la consulta desde el navegador y mirar los parámetros que se les pasa.
Pero eso depende de la web a la que quieras acceder y de cómo se pasan los parámetros. Incluso en algunos casos puede ser simplemente imposible saberlo (por ejemplo, la web de autobuses de vizcaya -bizkaibus- emplea una página en flash con lo que no se ven los parámetros que se les pasa). Así que lo primero es saber a qué página quieres acceder y cómo se accede a ella normalmente. En cualquier caso, no sé si la información la obtendrán de la web directamente desde la aplicación. También se puede coger la información a mano y crear una base de datos sobre ella. Un saludo ![]() Ya he intentado mirar qué parámetros se le pasan, pero no se ven. El caso es que ya hay una web que muestra este tipo de datos, lo que no se es de donde cogen esos datos, me imagino que de la web del Ministerio de Industria: http://gas.encooche.com No se, lo mismo existe algún web service que te devuelve este tipo de datos, si existiese no tengo ni idea de donde buscar esto. |
#6
|
||||
|
||||
Obtener datos precio gasolina
Hola de nuevo
Con la web del ministerio no parece que haya mucho que se pueda hacer. Pero echando un vistazo por ahí, he encontrado la web www.elpreciodelagasolina.com que tiene información de los precios de las gasolineras, accesible mediante parámetros. He hecho un pequeño programilla (en Java) de ejemplo para que veas cómo acceder. Código:
public static void main(String[] args) { try { String loc = javax.swing.JOptionPane.showInputDialog("Localidad /Provincia"); URL url = new URL("http://www.elpreciodelagasolina.com/gasolineras/" + loc); URLConnection cnn = url.openConnection(); BufferedReader br = new BufferedReader(new InputStreamReader(cnn.getInputStream())); String text; String rdo = ""; String nombre = ""; String direccion = ""; String localidad = ""; String provincia = ""; String gasolina95 = ""; String gasolina98 = ""; String gasoleo = ""; while ((text = br.readLine()) !=null){ rdo += text; } int pos = rdo.indexOf("<td>"); String distancia; int pos2; while (pos!=-1){ pos2 = rdo.indexOf("</td>",pos+5); distancia = (rdo.substring(pos+4,pos2)); pos = rdo.indexOf("<td>",pos2+5); pos2 = rdo.indexOf("</td>",pos+5); nombre = rdo.substring(pos+4,pos2); pos = rdo.indexOf("<td>",pos2+5); pos = rdo.indexOf(">",pos+5) + 1; pos2 = rdo.indexOf("</a>",pos); direccion = rdo.substring(pos,pos2); pos2 = rdo.indexOf("</td>",pos2+1); pos = rdo.indexOf("<td>",pos2+5); pos = rdo.indexOf(">",pos+5) + 1; pos2 = rdo.indexOf("</a>",pos); localidad = rdo.substring(pos,pos2); pos2 = rdo.indexOf("</td>",pos2+1); pos = rdo.indexOf("<td>",pos2+5); pos = rdo.indexOf(">",pos+5) + 1; pos2 = rdo.indexOf("</a>",pos); provincia = rdo.substring(pos,pos2); pos2 = rdo.indexOf("</td>",pos2+1); pos = rdo.indexOf("<td>",pos2+5); pos2 = rdo.indexOf("</td>",pos+5); gasolina95 = rdo.substring(pos+4,pos2); pos = rdo.indexOf("<td>",pos2+5); pos2 = rdo.indexOf("</td>",pos+5); gasolina98 = rdo.substring(pos+4,pos2); pos = rdo.indexOf("<td>",pos2+5); pos2 = rdo.indexOf("</td>",pos+5); gasoleo = rdo.substring(pos+4,pos2); pos = rdo.indexOf("<td>",pos2+5); System.out.println(distancia + " - " + nombre + " - " + direccion + " - " + localidad + " - " + provincia + " - " + gasolina95 + " - " + gasolina98 + " - " + gasoleo); } } catch (Exception ex){ ex.printStackTrace(); } } Código:
0,769 Km - CAMPSA - PLAZA ERNESTO ERCOREKA, S/N - BILBAO - Vizcaya - 1,154 € - - 0,955 Km - REPSOL - CL VIADUCTO MIRAFLORES-LARREAGA, 1 - BILBAO - Vizcaya - 1,167 € - 1,280 € - 1,096 € 1,034 Km - REPSOL - CL VIADUCTO MIRAFLORES-LARREAGA, 2 - BILBAO - Vizcaya - 1,167 € - 1,280 € - 1,096 € ...
Cuando acabes la aplicación ya me la pasarás para que le eche un vistazo, eh? ![]() Un saludo y suerte |
#7
|
||||
|
||||
Pues muchas gracias por tu ayuda. Por lo que veo, la forma de rescatar información es un poco rudimentaria.
La duda que tengo, es que no se de donde leches optiene esta web que has puesto por ejemplo, toda la info, no creo que tengan una base de datos, imagino que cogerán la info al vuelo de algún servidor. Lo ideal sería obtener un XML y así tratar la info mucho mejor. He estado investigando, y hay parseadores de html, miraré este: http://jericho.htmlparser.net/docs/index.html , a ver que tal es y como funciona. Por cierto, aún no he empezado la aplicación, estoy documentándome sobre Android, :P. Saludos! Última edición por systemx2 Día 21/06/10 a las 18:06:01. |
#8
|
||||
|
||||
Si buscas en el Marketplace "gasolineras España" encontraras una aplicación muy interesante que te dice los precios de la gasolina. Igual ellos te pueden asesorar en cuanto a la extracción de los precios..
Suerte. |
#9
|
||||
|
||||
Les escribiré, peor no creo no que se molesten en contestar. Saludos. |
#10
|
||||
|
||||
Pues yo quería coger el precio de los carburantes de la web del Ministerio de Industria, Turismo y Comercio--> http://geoportal.mityc.es/hidrocarburos/eess
Ya he intentado mirar qué parámetros se le pasan, pero no se ven. El caso es que ya hay una web que muestra este tipo de datos, lo que no se es de donde cogen esos datos, me imagino que de la web del Ministerio de Industria: http://gas.encooche.com No se, lo mismo existe algún web service que te devuelve este tipo de datos, si existiese no tengo ni idea de donde buscar esto. ![]() No sé si te servirá par algo, pero sí que se puede saber todos los parámetros que se envián en una petición, aunque no se muestren en la URL del navegador. Por ejemplo, para Firefox hay un plugin que se llama TamperData (si no recuerdo mal) en el que te muestra todos los parámetros que se mandan en la petición, ya sean por método POST o GET. Una vez tienes todos los parámetros, puedes montar la petición correcta. De todas formas, como ya te han comentado, en cuanto cambie el formato de la web, es más que probable que tu aplicación deje de funcionar (ya sea porque la petición que mandes sea incorrecta o porque el formato de la respuesta haya cambiado). Espero que te sirva de ayuda lo que te he comentado. Saludos. |
#11
|
||||
|
||||
Buenas,
No sé si te servirá par algo, pero sí que se puede saber todos los parámetros que se envián en una petición, aunque no se muestren en la URL del navegador. Por ejemplo, para Firefox hay un plugin que se llama TamperData (si no recuerdo mal) en el que te muestra todos los parámetros que se mandan en la petición, ya sean por método POST o GET. Una vez tienes todos los parámetros, puedes montar la petición correcta. De todas formas, como ya te han comentado, en cuanto cambie el formato de la web, es más que probable que tu aplicación deje de funcionar (ya sea porque la petición que mandes sea incorrecta o porque el formato de la respuesta haya cambiado). Espero que te sirva de ayuda lo que te he comentado. Saludos. ![]() Lo que me intriga es saber cómo hace la gente que crea aplicaciones para Android para coger datos de otras webs, como por ejemplo el valor del Euro en cada momento, el valor de la gasolina, etc... |
#12
|
||||
|
||||
A ver, todavía no tengo experiencia en el desarrollo de aplicaciones para Android (aunque ya estoy empezando), pero sí que tengo experiencia en desarrollo web (me gano la vida con ello jejeje). Bien, no sé cómo lo hacen los programadores de aplicaciones Android, pero se me ocurren dos formas para obtener datos "vivos": 1.- Conectarse a algún webservice. 2.- Parsear páginas web, es decir, recoger el código html devuelto tras una petición a una url y buscar los datos que quieres (en este caso podrías tener problemas si la página web a la que le realizas la petición modifica su contenido). En ambos casos deberías tener un servicio o proceso que fuera realizando las peticiones en un cierto intervalo de tiempo para tener los datos lo más actualizados posible. Espero que te sirva de ayuda. Si tienes alguna otra pregunta, ya sabes... "mu triste es pedir, pero más triste es robar... pero mucho, mucho más triste es tener que trabajar" ![]() |
#13
|
||||
|
||||
De nada.
A ver, todavía no tengo experiencia en el desarrollo de aplicaciones para Android (aunque ya estoy empezando), pero sí que tengo experiencia en desarrollo web (me gano la vida con ello jejeje). Bien, no sé cómo lo hacen los programadores de aplicaciones Android, pero se me ocurren dos formas para obtener datos "vivos": 1.- Conectarse a algún webservice. 2.- Parsear páginas web, es decir, recoger el código html devuelto tras una petición a una url y buscar los datos que quieres (en este caso podrías tener problemas si la página web a la que le realizas la petición modifica su contenido). En ambos casos deberías tener un servicio o proceso que fuera realizando las peticiones en un cierto intervalo de tiempo para tener los datos lo más actualizados posible. Espero que te sirva de ayuda. Si tienes alguna otra pregunta, ya sabes... "mu triste es pedir, pero más triste es robar... pero mucho, mucho más triste es tener que trabajar" ![]() ![]() Lo más lógico sería conectarse a un webservice, lo de parsear un html...me parece chapucero, si fuera un xml sería de puta madre, peeeeero, no es así. L a pregunta es, ¿donde leches miro si existe un webservice para el precio de la gasolina o por ejemplo el tiempo de espera de las paradas de la EMT? Saludos!. |
#14
|
||||
|
||||
Buenas de nuevo compañero, parece ser que somos del mismo gremio, yo tb me gano la vida con el desarrollo de aplicaciones web, :P.
Lo más lógico sería conectarse a un webservice, lo de parsear un html...me parece chapucero, si fuera un xml sería de puta madre, peeeeero, no es así. L a pregunta es, ¿donde leches miro si existe un webservice para el precio de la gasolina o por ejemplo el tiempo de espera de las paradas de la EMT? Saludos!. ![]() A ver, no te falta razón, parsear HTML es cutre cutre cutre... pero a veces no queda más remedio. Lo de encontrar Web Services... es algo que siempre he tenido en la cabeza, pero que nunca lo he hecho (me refiero a buscar)... No sé, supongo que es meterse a fondo en google y buscar a saco... sé que hay páginas con listados de Web Services... pero nunca he mirado en ninguna de ellas. Si, por un casual, encuentras alguna interesante, házmelo saber (lo mismo haré yo si encuentro alguna jejeje). Lo que creo que será complicado es encontrar un listado "exclusivo" de servicios referentes a España. |
#15
|
||||
|
||||
Buenas again...
A ver, no te falta razón, parsear HTML es cutre cutre cutre... pero a veces no queda más remedio. Lo de encontrar Web Services... es algo que siempre he tenido en la cabeza, pero que nunca lo he hecho (me refiero a buscar)... No sé, supongo que es meterse a fondo en google y buscar a saco... sé que hay páginas con listados de Web Services... pero nunca he mirado en ninguna de ellas. Si, por un casual, encuentras alguna interesante, házmelo saber (lo mismo haré yo si encuentro alguna jejeje). Lo que creo que será complicado es encontrar un listado "exclusivo" de servicios referentes a España. ![]() |
#16
|
||||
|
||||
Ya te digo que alguna vez he buscado alguna página con algún listado interesante y nunca encontré... voy a preguntar por ahí...
|
![]() |
![]() |
||||||
|
Herramientas | |