Contenidos:
- Introducción: Como funciona la comunicación en red.
- Leyendo desde una URL : Hora de conectar y leer de Internet.
- Programar Java para conectar a servidores proxy HTTP.
- A descargar contenido de Internet.
- Cotización en bolsa: Un programa aplicando lo aprendido.
- Programación de sockets: Más allá de los protocolos estándar.
5. Cotización en bolsa: Un programa aplicando lo aprendido.
En este artículo lo que se pretende es mostrar como consumir información desde internet; en nuestro caso información bursátil proporcionada por yahoo. Podríamos traernos toda la página html e ir desmenuzando el string para quitar las etiquetas html y quedarnos con el dato que nos interesa. De esta forma corremos el riesgo de que si yahoo cambia las etiqueta de su web tendremos que adpatar nuestro código. Menos mal que estos servicios públicos ofrecen su información en variso formatos (más legible y fáciles de "parsear").
Manos a la obra:
Entramos en :
Modificamos el código de nuestra clase
Si lo que quieres es quedarte con toda la web; podemos almacenarla en un string:
Pero como dijimos líneas arriba; esto no es lo más recomendable ya que si yahoo cambia el nombre de los componentes de su web nos veremos obligados a cambiar nuestro código. Por tal motivo usaremos la URL del recurso con la información que necesitamos disponible en formato CSV el que se muestran los valores separados por comas. La dirección en cuestión es:
Ahora todo se resume a hacer un "split" o usar StringTokenizer para obtener el dato que deseamos.
El código de la clase
http://finance.yahoo;
introducimos un símbolo cualquiera, por ejemplo NKE( símbolo bursátil de Nike) y le damos en Get Quote. Nos aparece la cotización en bolsa de Motorola. Nos interesa la URL que aparece en el navegador: http://finance.yahoo.com/q?s=NKE.
Modificamos el código de nuestra clase
LectorWebSite
vista en el capítulo 2 Leyendo desde una URL : Hora de conectar y leer de Internet.url = new URL("http://finance.yahoo.com/q?s=NKE");
Si lo que quieres es quedarte con toda la web; podemos almacenarla en un string:
String todaLaPagina;
String textoLeido;
while(textoLeido = buff.readLine() != null)
{
todaLaPagina=todaLaPagina + textoLeido;
}
Pero como dijimos líneas arriba; esto no es lo más recomendable ya que si yahoo cambia el nombre de los componentes de su web nos veremos obligados a cambiar nuestro código. Por tal motivo usaremos la URL del recurso con la información que necesitamos disponible en formato CSV el que se muestran los valores separados por comas. La dirección en cuestión es:
http://finance.yahoo.com/d/quotes.csv?s=NKE&f=sl1d1t1c1ohgv&e=.csv
Una vez descargado el fichero esta es la información que contiene:MMI,17.10,"4/17/2014","4:03pm",-0.01,17.11,17.26,17.05,15070
Ahora todo se resume a hacer un "split" o usar StringTokenizer para obtener el dato que deseamos.
El código de la clase
CotizaciónDeBolsa
muestra todo el proceso:
package com.pelusadev.programacionenlared;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.util.StringTokenizer;
/**
*
* @author pelusadev
*/
public class CotizaciónDeBolsa {
/**
* static void printCotizaciónDeBolsa(String simbolo)
*
* Se declara como método de la clase ( no es necesario instancia
* un objeto para usar el método ).
* Como no devuelve nada, solo pinta en pantalla; su valor de retorno
* es void.
* Recibe como parámetro un String.
*
* @param simbolo
*/
static void printCotizaciónDeBolsa(String simbolo)
{
String csvString; // Para guardar la respuesta a la solicitud
URL url=null; // La url :-).
URLConnection urlConn=null; // El enlace de comunicación entre nuestra
//aplicación y una URL
InputStreamReader inStream=null; // Para leer flujos de byte a caracter
BufferedReader buff=null; // Para leer desde el InputStream
try{
url = new URL("http://finance.yahoo.com/d/quotes.csv?s="+simbolo+"&f=sl1d1t1c1ohgv&e=.csv");
urlConn = url.openConnection();
inStream = new InputStreamReader(urlConn.getInputStream());
buff = new BufferedReader(inStream);
// Obtenemos la información como cadena
csvString = buff.readLine();
// Realizamos la descomposición de la cadena que está separada por comas
// MMI,17.10,"4/17/2014","4:03pm",-0.01,17.11,17.26,17.05,15070
StringTokenizer tokenizer = new StringTokenizer(csvString,",");
String empresa = tokenizer.nextToken();
String precio = tokenizer.nextToken();
String fecha = tokenizer.nextToken();
String tiempo = tokenizer.nextToken();
System.out.println("Símbolo: " + empresa +
"Precio: " + precio + " Fecha: " + fecha + " Tiempo: " + tiempo);
}catch(MalformedURLException emfurl){
System.out.println("¿Has escrito bien la URL? : esto es lo que escribiste: " + emfurl.toString());
}catch(IOException eio){
System.out.println("No se puede leer desde internet: " + eio.toString());
}finally{
try{
inStream.close();
buff.close();
}catch(Exception ex){
System.out.println("CotizaciónDeBolsa no puede cerrar");
}
}
}
public static void main(String[] args)
{
printCotizaciónDeBolsa("NKE");
}
}
Descárgate la clase CotizacionDeBolsa
Una clase magistral de como utilizar una url como un recurso para un programa. Es muy interesante obtener los recursos en csv y olvidarnos de la web entera.
ResponderEliminarFelicitaciones al profesor.