ayuda php-mysql

deak0n

Hola! Necesito una pequeña gran ayuda con un trabajo que me encomendaron. Necesito meter los datos de una página web, concretamente

a una base de datos MySQL mediante un script de PHP, que me lo haga de forma automática cada 1 hora. Sólo meter los datos de la columna CURRENT.

Y luego mediante, supongo otro script PHP o no se muy bien el método, cuando el usuario queda importar todos esos datos que se han ido guardando en la base de datos en un EXCEL columna por columna.

¿Alguien me puede echar una mano? No digo que me hagan el código ni mucho menos, pero si puede ser necesito un empujoncito, estoy en prácticas y me mandaron a hacer eso y no tengo ni idea de PHP.

Algún link donde te expliquen como hacer esto o algo.

Gracias de antemano.

Soltrac

CURL, abres la web, la parseas y listo.

3 respuestas
RaymaN

Como te ha dicho #2 puedes hacerlo con CURL y una práctica librería como simple html dom (http://simplehtmldom.sourceforge.net/), pero si quieres quedar como el puto amo, usa alguna api de las miles que hay para servicios de meteorología y te quedará todo mucho más limpio y fácil de entender.

Además, si cambian la web que pones te jode el parser y tienes que volver a rehacerlo.

3 respuestas
deak0n

#2 #3 Muchas gracias por la información, me pondré a ello.

Otra cosita, #3 lo que dices de usar una API de meteorología, el tema es que la estación meteorológica manda directamente los datos a esa página web que es donde esta el usuario registrado, ¿Como funciona esto de las API's? Me podrías dar un link para informarme como debería hacerlo.

Gracias de nuevo.

1 respuesta
RaymaN

#4 puedes usar por ejemplo el XML que genera MSN: http://weather.service.msn.com/data.aspx?weadegreetype=c&culture=es-ES&wealocations=wc:SPXX0074

Y un ejemplo para leerlo en PHP:

$ch = curl_init("http://weather.service.msn.com/data.aspx?weadegreetype=c&culture=es-ES&wealocations=wc:SPXX0074");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADER, 0);
$data = curl_exec($ch);
curl_close($ch);

$xml = new SimpleXmlElement($data, LIBXML_NOCDATA);

$temp = $xml->weather->current['temperature'];
NickNack

Te dejo un trocito de código que use hace tiempo para algo parecido. Es simplemente el extractor de datos de la API de http://openweathermap.org.

En este caso es usando la respuesta json.

Prueba a poner: (http://openweathermap.org/data/2.1/find/city?lat=0&lon=0&cnt=1&lang=es) y verás el resultado.

No es exactamente lo que pides, pero igual te sirve como idea xD


$str_datos = file_get_contents("http://openweathermap.org/data/2.1/find/city?lat=". $latitud . "&lon=" . $longitud . "&cnt=1&lang=es");
    $datos = json_decode($str_datos,true);
    
// Get Data
$ciudad = $datos['list']['0']['name']; $tempC = (($datos['list']['0']['main']['temp']) - 273); $tempmaxC = (($datos['list']['0']['main']['temp_max']) - 273); $tempminC = (($datos['list']['0']['main']['temp_min']) - 273); $humedad = $datos['list']['0']['main']['humidity']; $viento = $datos['list']['0']['wind']['speed']; $tiempoid = $datos['list']['0']['weather']['0']['id']; $tiempo = $datos['list']['0']['weather']['0']['main']; $tiempoEXT = $datos['list']['0']['weather']['0']['description'];

Que te quede claro que hay mil maneras de parsear los datos de una web, ya sea curl como te han dicho por arriba, con respuesta de una API (en muchos formatos y usando tecnicas como SimpleXml o Json_decode (aparte de unos cuantos más xD)

deak0n

#2 #3 Perdona que os moleste de nuevo. El tema de utilizar CURL, como exactamente puedo parsear la web para que me saque los datos de la columna curent? Es decir, no veo que la columna en si tenga ni tag ni un id ni nada y no se muy bien como programar el código para que recoja dicha información.

He estado mirando esta

y veo que los datos los coge mediante una referencia. El caso es que yo solo tengo una tabla y tengo que coger los datos de la segunda columna, hay algún código que te saque los datos de la columna que quieras? Lo único que veo es que los datos que quiero recoger tienen en común el ancho de la columna (width="170")

2 respuestas
Soltrac

#7 RegEx o filtrar a pelo, en plan, subcadenas, búsqueda en texto, etc. No existe nada automático.

B

Como ya te han dicho curl + expresiones regulares. De todas formas no entiendo que en el trabajo te pidan eso si saben que no sabes php.

1 respuesta
deak0n

#9 El tema es que estoy de prácticas y quieren que en estos dos meses me aprenda PHP-MySQL para quedarme trabajandooooo.

A ver, he seguido básicamente los pasos de este

Y creo que con la función preg_match_all puedo ir sacando los datos que quiera. Una vez tenga todos los datos sacados ya supongo que el camino será mas fácil para meterlos en una base de datos.

A ver si lo consigo.

djtonight

#7 con el html dom que te dicen en #3 puedes especificiar por ejemplo...primera tabla-->segunda fila-> primera columna y cosas asi

// Example
echo $html->find("#div1", 0)->children(1)->children(1)->children(2)->id;
// or 
echo $html->getElementById("div1")->childNodes(1)->childNodes(1)->childNodes(2)->getAttribute('id');

http://simplehtmldom.sourceforge.net/manual.htm

1 respuesta
deak0n

#11 Gracias por la información, pero con ese código, a mi entender de novato, esta buscando todos los elementos que tenga la misma id no? que sería buscar dentro de div1. El caso es que el código fuente con el que yo tengo que trabajar no me puedo apoyar en ninguna id ni tag ni nada. Mirate el código fuente de la página para que veas... por eso estoy usando el curl y a ver si saco petróleo de ahí...

1 respuesta
djtonight

#12 ese en concreto busca el primer elemento que se llame #div1 y luego su primer elemento que haya dentro, y dentro de este el primero y dentro de ese el segundo.

pero puedes utilizar lo que quieras. si por ejemplo buscas la primera tabla que haya, sustituye "#div1" por "table"

deak0n

Al final conseguí sacar los datos mediante DOM. Ya puedo guardar los datos sin problemas en la base de datos, y ahora tengo otro problemilla. Necesito que ese código que creé (que guarda los datos en la base de datos), se ejecute automáticamente cada hora en punto, ¿Alguna ayudita de como puedo hacer esto?

Y otra cosa, tengo ya una página web con un formulario que te permite escoger el día, la fecha y la hora inicial y dia, fecha y hora final y cuando escojas todo esto, me gustaría que esos datos se pasaran de la base de datos a un archivo excel.
El código de pasar todos los datos de la base de datos de mysql a excel ya lo tengo, pero es eso, me pasa TODOS los datos. ¿Es posible que mediante el formulario anteriormente dicho, pueda sacar esos datos y pasarle el script php de imprimir en excel?

Adjunto el script que de impresión a excel:

code

Básicamente lo que quiero es que me haga ese script para la consulta que hago en el formulario.

Gracias de antemano.

1 respuesta
Soltrac

#14 En linux, cron.

Para lo segundo, necesitas crear el excel "a mano", es decir, seleccionar los campos de la base de datos y pasarlos a excel.

http://phpexcel.codeplex.com/

Usuarios habituales