Supongamos que queremos mostrar en nuestra página información sobre el Estado del Tiempo. Evidentemente nosotros no vamos a estar actualizando a cada instante los valores. Necesitamos sacarla de algún lugar donde eso suceda automáticamente. Hay distintas formas: utilizar algún sitio que nos permita insertar su código (The Weather Channel por ejemplo), utilizar un iframe o lo que les voy a contar a continuación.
PHP nos permite leer archivos de texto de forma local (en la misma computadora donde se ejecuta el script) y de forma remota (cualquier sitio web por ejemplo). La técnica es la siguiente: en cada ejecución del script leemos el HTML de alguna página, de allí extraemos la información que necesitamos y la presentamos como queremos.
La ventaja de esto muy clara: podemos elegir que información mostrar, integrarla a nuestro diseño y no tendremos que soportar publicidad de ningún tipo.
El ejemplo será con el Estado del Tiempo y la víctima de nuestro “robo” Buquebus. Podría aplicarse la misma idea para casi cualquier sitio e información. Otro ejemplo que se me ocurre de similares características es la cotización de la moneda.
Hay una cuestión básica en esto y es que cada página es diferente. Eso significa que no hay un algoritmo genérico: debemos estudiar a la víctima (cómo presenta la información, dónde está esa información y cómo varía en cada actualización del sitio) y en función de eso diseñar el código.
En este caso, Buquebus tiene una marquecina en la parte superior central donde corre el Estado del Tiempo de Buenos Aires, Colonia, Montevideo y Punta del Este. Si analizamos el código vemos que:
- Las ciudades se presentan siempre en el mismo órden: 1. BsAs, 2. Col, 3. Montevideo y 4. Punta.
- La información de cada ciudad también sigue un órden: 1. imágen, 2. temperatura y 3. descripción.
- Las imágenes están en la carpeta clima_up y la carpeta clima_up aparece en el código solamente cuando hay una imágen del tiempo. Ergo, la carpeta clima_up aparece 4 y solo 4 veces en el código: una vez por cada ciudad.
Concluímos que si bien el contenido de la página es muy dinámico, hay algunas referencias fijas. De esas referencias nos vamos a valer para ir directamente a donde precisamos, siendo lo suficientemente flexibles para recabar la información sin saber su largo.
Ahora vamos a ensuciarnos las manos con el código:
$nombre_archivo = “http://www.buquebus.com/cache/HomeARG.html”;
$archivo = fopen($nombre_archivo, rb);
$texto_archivo = stream_get_contents($archivo);
Lo primero es la dirección dónde está el archivo de texto (html en este caso).
Lo segundo es la función que nos abre ese archivo.
La tercera variable, $texto_archivo, es un string (una cadena de caracteres) con todo el código html de la página. De esa cadena justamente vamos a sacar lo que precisamos.
Ahora buscamos la posición de la primera aparición de la cadena clima_up. Sabemos que la información a continuación corresponde a Buenos Aires -por lo que decía del órden anteriormente-, que el próximo caracter será un “/” y que en los siguientes vendrá el nombre de la imágen. Ese nombre de la imágen puede tener cualquier largo pero cuando lleguemos al caracter ” (comillas) se terminó. Esto se traduce en lo siguiente:
$bueno_aires_imagen = “”;
$buenos_aires_numero = strpos($texto_archivo, “clima_up”);
$buenos_aires_numero += 8; //adelantamos 8 posiciones, correspondientes a “c l i m a _ u p /” para llegar a donde comienza el nombre del archivo.
do {
$buenos_aires_numero += 1;
$bueno_aires_imagen .= $texto_archivo[$buenos_aires_numero];
}
while($texto_archivo[$buenos_aires_numero + 1] != “\““); //Vamos agregando a la variable con el nombre los caracteres siguientes hasta que lleguemos al caracter comillas.
$buenos_aires_imagen contendría algo así como “nublado.gif”.
Para la temperatura, siguiente dato, hacemos algo similar:
$buenos_aires_numero += 8; //Adelantamos los caracteres ‘ ” > & n b s p ; ‘ y quedamos prontos para recibir la temperatura.
$buenos_aires_temperatura = “”;
do {
$buenos_aires_numero += 1;
$buenos_aires_temperatura .= $texto_archivo[$buenos_aires_numero];
}
while($texto_archivo[$buenos_aires_numero + 1] != “&”);
$buenos_aires_temperatura es otro string con los grados.
La descripción de la imágen (“Mayormente Nublado”, “Soleado”, “Nublado”, etc.) la armamos con una pequeña función dónde ingresamos el nombre del archivo y nos devuelve el texto. Esto se puede hacer porque a cada nombre de archivo corresponde una y una sola descricpión.
Hasta aquí tendríamos Buenos Aires. Para conseguir el resto de las ciudades aplicamos el mismo proceso con la diferencia que al buscar la carpeta clima_up fijamos un número de caracter a partir del cuál hacer la búsqueda. Ese número de caracter será cualquiera inmediatamente posterior al de Buenos Aires. En mi caso puse $buenos_aires_numero que ya estaba suficientemente adelantado. Me quedó así: $colonia_numero = strpos($texto_archivo, “clima_up”, $buenos_aires_numero);
Cómo presentan la información es problema de ustedes
No olviden mis tutoriales anteriores sobre PHP y HTML (aquí y aquí).
Un ejemplito de lo que hice yo: http://martin.com.uy/sitio/tiempo/tiempo.php (las descripciones no están completas un poco por vago y otro poco porque no las ví en el sitio de Buquebus).
A las órdenes por consultas.
PD: Amigos de Buquebus: no se me ofendan y no cambien el código de la página. Gracias. jajaja!!



