Foros del Web » Programando para Internet » PHP »

Parsear Curl-PHP-MySQL

Estas en el tema de Parsear Curl-PHP-MySQL en el foro de PHP en Foros del Web. Hola a todos! Necesito una ayudita. Veréis necesito pasar los datos automáticamente cada 1 hora de esta página web: http://www.weatherlink.com/user/agustinrh/index.php?view=summary&headers=0 a una base de datos ...
  #1 (permalink)  
Antiguo 03/04/2013, 07:43
 
Fecha de Ingreso: abril-2013
Mensajes: 6
Antigüedad: 11 años
Puntos: 1
Exclamación Parsear Curl-PHP-MySQL

Hola a todos! Necesito una ayudita.

Veréis necesito pasar los datos automáticamente cada 1 hora de esta página web:

http://www.weatherlink.com/user/agustinrh/index.php?view=summary&headers=0

a una base de datos MySQL mediante el uso de un script en PHP. Solamante necesito coger los datos de la columna Current.

He estado buscando información y parece que la mejor opción es parsear con Curl y hacer uso de html dom.

Mi problema es que soy un iniciado de la programación PHP y no tengo mucha idea de como hacerlo.

Viendo el código fuente de la página que puse anteriormente, no sé muy bien como es esto del parseo y que código tengo que poner exactamente para coger los datos de la columna current.

Alguna ayudita?

Gracias de antemano.
  #2 (permalink)  
Antiguo 03/04/2013, 08:14
Avatar de maycolalvarez
Colaborador
 
Fecha de Ingreso: julio-2008
Ubicación: Caracas
Mensajes: 12.120
Antigüedad: 15 años, 9 meses
Puntos: 1532
Respuesta: Parsear Curl-PHP-MySQL

recuerda que con Curl lo que obtienes en realidad es el HTML de dicha página, y con DomDocument (simpleXml podria servir) recorres la estructura de objetos de la página, con funciones similares a JS.

aunque lo mejor es implementar un web service tipo JSON o XML, verifica si dicha pagina lo tiene
__________________
¡Por favor!: usa el highlight para mostrar código
El que busca, encuentra...
  #3 (permalink)  
Antiguo 03/04/2013, 11:13
 
Fecha de Ingreso: abril-2013
Mensajes: 6
Antigüedad: 11 años
Puntos: 1
Respuesta: Parsear Curl-PHP-MySQL

Buenas, ya mas o menos tengo una posible solución en la cabeza. He seguido este video de aquí: http://www.youtube.com/watch?v=iZ-HVvoFFIU&list=PLE058CAAADCD16AF2&index=11

Creo que con la funcion preg_match_all puedo llegar a coger los elementos que necesito y después ir guardandolos.

El problema es que siguiendo el video que puse antes, copié básicamente todo el código para probarlo y me sale el siguiente error:

Undefined offset: 5 in C:\wamp\www\curlprueba.php on line 35

No entiendo que si teniendo copiado lo mismo que en el video me suelte dicho error, ¿Alguna solución?
  #4 (permalink)  
Antiguo 03/04/2013, 11:17
Avatar de andresdzphp
Colaborador
 
Fecha de Ingreso: julio-2011
Ubicación: $this->Colombia;
Mensajes: 2.749
Antigüedad: 12 años, 9 meses
Puntos: 793
Respuesta: Parsear Curl-PHP-MySQL

No no no esa es una pésima idea, tienes 2 opciones:

1. Revisa si tienen un webservice y utiliza SimpleXML o json_decode. Según el formato.
2. Si no tienen utiliza las clases DOM para sacar ese valor.
__________________
Si sabemos como leer e interpretar el manual será mucho más fácil aprender PHP. En lugar de confiar en ejemplos o copiar y pegar - PHP

Última edición por andresdzphp; 03/04/2013 a las 14:33
  #5 (permalink)  
Antiguo 03/04/2013, 12:08
Avatar de andresdzphp
Colaborador
 
Fecha de Ingreso: julio-2011
Ubicación: $this->Colombia;
Mensajes: 2.749
Antigüedad: 12 años, 9 meses
Puntos: 793
Respuesta: Parsear Curl-PHP-MySQL

Te hice este ejemplo, para el que le pueda servir. Ya está en vos si lo mejoras o no:

Código PHP:
Ver original
  1. <?php
  2.  
  3. $doc = new DOMDocument();
  4. $doc->loadHTMLFile('http://www.weatherlink.com/user/agustinrh/index.php?view=summary&headers=0');
  5. $xpath = new DOMXPath($doc);
  6. $rows = $xpath->query('//table/tr[position()>7 and position()<31]');
  7.  
  8. foreach ($rows as $row) {
  9.     $td = $row->getElementsByTagName('td');
  10.     if ($td->length == 6) {
  11.         echo $td->item(0)->nodeValue . ' = ' . $td->item(1)->nodeValue . '<br />';
  12.     }
  13. }

Cita:
Outside Temp = 24.8 C
Outside Humidity = 47%
Inside Temp = 24.4 C
Inside Humidity = 44%
Heat Index = 24.4 C
Wind Chill = 25.0 C
Dew Point = 12.8 C
Barometer = n/a
Bar Trend = n/a
Wind Speed = Calm
Wind Direction = SE 139°
Wind = 2 Minute
Average Wind Speed = Calm
__________________
Si sabemos como leer e interpretar el manual será mucho más fácil aprender PHP. En lugar de confiar en ejemplos o copiar y pegar - PHP
  #6 (permalink)  
Antiguo 03/04/2013, 12:48
 
Fecha de Ingreso: abril-2013
Mensajes: 6
Antigüedad: 11 años
Puntos: 1
Respuesta: Parsear Curl-PHP-MySQL

Muchas gracias Andrés, me será de gran ayuda. La página no tiene webservice ni json a si que tendré que utilizar DOM. Me voy a poner a ello. Gracias de nuevo.
  #7 (permalink)  
Antiguo 03/04/2013, 14:40
 
Fecha de Ingreso: abril-2013
Mensajes: 6
Antigüedad: 11 años
Puntos: 1
Respuesta: Parsear Curl-PHP-MySQL

Andres me podrías decir que es lo que hace exactamente esta línea de código?

$rows = $xpath->query('//table/tr[position()>7 and position()<31]');

No me queda muy claro, no se si ahí esta el error de que no muestre algunas líneas como "12 Hour Forecast", "Rain" y "Last Hour Rain".
  #8 (permalink)  
Antiguo 03/04/2013, 14:55
Avatar de andresdzphp
Colaborador
 
Fecha de Ingreso: julio-2011
Ubicación: $this->Colombia;
Mensajes: 2.749
Antigüedad: 12 años, 9 meses
Puntos: 793
Respuesta: Parsear Curl-PHP-MySQL

Eso significa que capture el tr 8 al tr 30, lo que pasa es que al principio hay 7 tr sin información y al final hay otros tr innecesarios, para coger desde Outside Temp hasta Last Hour Rain, debe ir del tr 8 hasta el tr 36, algo así:

Código PHP:
Ver original
  1. <?php
  2.  
  3. $doc = new DOMDocument();
  4. $doc->loadHTMLFile('http://www.weatherlink.com/user/agustinrh/index.php?view=summary&headers=0');
  5. $xpath = new DOMXPath($doc);
  6. //cogemos la información del tr 8 al tr 36 de la tabla
  7. $rows = $xpath->query('//table/tr[position()>7 and position()<37]');
  8.  
  9. foreach ($rows as $row) {
  10. //sacamos los td de cada tr
  11.     $td = $row->getElementsByTagName('td');
  12. //si el row no tiene 6 td no nos sirve
  13.     if ($td->length == 6) {
  14.         echo $td->item(0)->nodeValue . ' = ' . $td->item(1)->nodeValue . '<br />';
  15.     }
  16. }
__________________
Si sabemos como leer e interpretar el manual será mucho más fácil aprender PHP. En lugar de confiar en ejemplos o copiar y pegar - PHP
  #9 (permalink)  
Antiguo 04/04/2013, 02:02
 
Fecha de Ingreso: abril-2013
Mensajes: 6
Antigüedad: 11 años
Puntos: 1
Respuesta: Parsear Curl-PHP-MySQL

Perdona que siga dando un poco el coñazo. Pero necesito otra pequeña ayuda.

Me podrían decir donde puedo mirar información de cómo hacer un contador para que me vaya almacenando los datos cada 1 hora en una base de datos que ya tengo creada. Con el código anteriormente puesto lo que necesito es coger el segundo item de cada tr ($td->item(1)->nodeValue) e ir metiendolos en una base de datos MySQL.

El tema es que yo ya tengo creada mi base de datos, cada columna con un nombre (Temperatura Interior, Humedad, Velocidad del viento... etc) Y lo que quiero es que cada hora se me guarden todos los datos debajo de cada columna.

Sabéis si hay alguna guia que me pueda ayudar a hacer este tipo de contador?

Gracias de antemano.
  #10 (permalink)  
Antiguo 04/04/2013, 11:43
 
Fecha de Ingreso: abril-2013
Mensajes: 6
Antigüedad: 11 años
Puntos: 1
Respuesta: Parsear Curl-PHP-MySQL

No pasa nada. Ya lo tengo echo. Ahora solo me falta que pueda hacer ese script automáticamente a cada hora en punto. ¿Alguna ayudita?
  #11 (permalink)  
Antiguo 30/05/2013, 02:24
 
Fecha de Ingreso: enero-2012
Mensajes: 24
Antigüedad: 12 años, 3 meses
Puntos: 1
Respuesta: Parsear Curl-PHP-MySQL

Me parece muy interesante

Como se pueden extraer los datos de forma inversa?....
  #12 (permalink)  
Antiguo 30/05/2013, 04:03
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 15 años, 8 meses
Puntos: 2237
Respuesta: Parsear Curl-PHP-MySQL

De forma inversa?... creo que necesitas ser muuuuucho más específico con tu consulta.
__________________
- León, Guanajuato
- GV-Foto
  #13 (permalink)  
Antiguo 30/05/2013, 05:32
 
Fecha de Ingreso: enero-2012
Mensajes: 24
Antigüedad: 12 años, 3 meses
Puntos: 1
Respuesta: Parsear Curl-PHP-MySQL

Disculpas

Me explico mejor:


yo obtengo por ejemplo estos datos:

13.1, 13.2, 13.3, 13.3, 13.3, 13.3, 13.3, 13.4, 13.4, 13.3, 13.3, 13.3, 13.4, 13.4, 13.4, 13.4, 13.4, 13.4, 13.4, 13.3, 13.2, 13.3, 13.4

Bien, los necesito de forma inversa, es decir 13.4, 13.3, 13.2, 13.3, 13.4, 13.4,......, 13.2,13.1

Hice esta prueba:

Código HTML:
 $td = $row->getElementsByTagName('td');


    if ($td->length == 19) {
    	
                $invertir=strrev($td->item(14)->nodeValue . ',');

    echo $invertir;

    }
}
pero jeje me da este resultado:

,3.31 ,3.31 ,3.31 ,4.31 ,4.31 ,3.31 ,3.31 ,3.31 ,4.31 ,4.31 ,4.31 ,4.31 ,4.31 ,4.31 ,4.31 ,3.31 ,3.31 ,3.31 ,4.31 ,4.31 ,3.31 ,4.31

nota: (esta serie no corresponde con la anterior por estar tomada en distinto momento.)
Gracias
  #14 (permalink)  
Antiguo 30/05/2013, 06:51
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 15 años, 8 meses
Puntos: 2237
Respuesta: Parsear Curl-PHP-MySQL

Con explode() puedes separar esos valores por coma, se guardan en un arreglo, lo inviertes con array_reverse() y lo vuelves a colocar en una cadena con implode()

Si no sabes cómo usar alguna función, consulta el manual: php.net/nombre_de_funcion
__________________
- León, Guanajuato
- GV-Foto
  #15 (permalink)  
Antiguo 30/05/2013, 08:03
 
Fecha de Ingreso: enero-2012
Mensajes: 24
Antigüedad: 12 años, 3 meses
Puntos: 1
Respuesta: Parsear Curl-PHP-MySQL

Cita:
Iniciado por Triby Ver Mensaje
Con [URL="http://www.php.net/explode"]explode()[/URL] puedes separar esos valores por coma, se guardan en un arreglo, lo inviertes con array_reverse() y lo vuelves a colocar en una cadena con implode()

Si no sabes cómo usar alguna función, consulta el manual: php.net/nombre_de_funcion
Vamos a probar.... php me queda un poco justo, pero al menos lo voy a intentar.
  #16 (permalink)  
Antiguo 31/05/2013, 00:24
 
Fecha de Ingreso: enero-2012
Mensajes: 24
Antigüedad: 12 años, 3 meses
Puntos: 1
Respuesta: Parsear Curl-PHP-MySQL

Seguro que algo estoy haciendo mal, me funciona pero me devuelve la cadena ordenada.


Código HTML:
$td = $row->getElementsByTagName('td');

    if ($td->length == 19) {
    	
$ordenado=($td->item(14)->nodeValue . ',');
$ordenado = explode(" ",$ordenado);
$invertido = array_reverse($ordenado);
$invertido = implode(" ",$invertido);
echo $invertido;

    }
}
13.3, 13.3, 13.4, 13.4, 13.3, 13.4, 13.4, 13.4, 13.4, 13.4, 13.4, 13.4, 13.4, 13.4, 13.3, 13.3, 13.4, 13.3, 13.3, 13.3, 13.3, 13.3,

Aprovecho también para averiguar si hay una forma digna de quitar la última coma, lo consigo extrayendo el último valor independientemente, pero no me parece muy correcto.

Etiquetas: html, mysql, parsear
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta

SíEste tema le ha gustado a 2 personas




La zona horaria es GMT -6. Ahora son las 09:01.