Foros del Web » Programando para Internet » PHP »

Extraer página con CURL y recuperar datos de tabla

Estas en el tema de Extraer página con CURL y recuperar datos de tabla en el foro de PHP en Foros del Web. Hola gente, he trabajado bastante con PHP pero poco con CURL , la verdad que no me ha resultado muy complicado recuperar un sitio remoto ...
  #1 (permalink)  
Antiguo 11/01/2013, 13:59
Avatar de Dundee  
Fecha de Ingreso: junio-2002
Ubicación: El Médano
Mensajes: 1.310
Antigüedad: 21 años, 9 meses
Puntos: 8
Extraer página con CURL y recuperar datos de tabla

Hola gente, he trabajado bastante con PHP pero poco con CURL , la verdad que no me ha resultado muy complicado recuperar un sitio remoto con CURL, pero me surgen algunas dudas ya que nunca he hecho esto y no tengo muy claro algunas cosas.

El código que utilizo es este:


Código:
$url="laquesea.com";
$ch = curl_init($url);//URL A ENVIAR EL CONTENIDO
  
        curl_setopt ($ch, CURLOPT_POST, 1);//SETEAMOS LA VARIABLE DE ENVIAR DE CONTENIDO POST EN TRUE (1)
        curl_setopt ($ch, CURLOPT_POSTFIELDS, 'cuerpo=I590&especialidad=004'); //SETEAMOS LOS VALORES A ENVIAR
   
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);//OPCIONAL: NO RETORNARA EL RESULTADO DE LA OPERACION
    curl_setopt($ch, CURLOPT_COOKIEJAR, "cookies/cookies-ja.txt");
    curl_setopt($ch, CURLOPT_COOKIEFILE, "cookies/cookies-ja.txtt");
   
    $html = curl_exec ($ch);//EJECUTAMOS
    curl_close ($ch);//CERRAMOS
Las dudas que tengo son las siguientes.

1 La página que recupero es una tabla con sus tr y td donde estan los datos que quiero guardar en una Bd en mi servidor local Mysql.

2 Dicha página esta páginada , por lo que necesito además de recuperar el contenido de la página de "aterrizaje" (la primera), recupere el contenido del resto de páginas.

3 Como se puede comprobar en la líneas de CURL :
curl_setopt ($ch, CURLOPT_POSTFIELDS, 'cuerpo=I590&especialidad=004'); le tengo que pasar por post datos para simular el formulario de entrada que tiene dicha web.

4 Una vez que recupero la página , no se como puedo "sacar" solo los datos que necesito y moverme por el dom de manera que pueda guardar en mi bd "nombre", "telf", "posición" etc etc.. que son datos que encontramos dentro de los TDs. Y claro esto sería lo suyo que lo pudiera hacer en todas las páginas (ya que está paginado).

Bueno no pretendo que nadie me lo haga Xd, pero si agradecería cualquier tipo de orientación , puesto que es la primera vez que me encuentro con un tema así en PHP; y he "googleado" mucho estos dos días buscando sobre este tema , y la verdad que he encontrado muchas cosillas (gracias a eso he podido recuperar la página y empezar a hacer algo con CURL), pero estoy aún muy lejos de conseguir lo que deseo, que es indexar todos esos datos en una bd que tengo en local.

Por ejemplo he encontrado esto en PHP.net sobre DOMXPath , pero la verdad que no entiendo muy bien como funciona, ya que la explicación de PHP.net es como poco pobre (si alguien me puede decir donde encontrar más info sobre esto y sobre todo si esto me sirve , se lo agradecería mucho).

Mil gracias de antemano.
__________________
Videotutoriales de Drupal
  #2 (permalink)  
Antiguo 11/01/2013, 14:04
Avatar de zokter  
Fecha de Ingreso: enero-2013
Mensajes: 7
Antigüedad: 11 años, 3 meses
Puntos: 0
Respuesta: Extraer página con CURL y recuperar datos de tabla

lo pudes sacar con preg_match_all por ejemplo:

Código PHP:
$result curl_exec($ch);
preg_match_all("(<input type=\'tel\' name=\'(.*)\' id=\'tel\' value=\'\' class=\'text\' />)siU"$result$matches1);
// lo que esta (.*) es lo que quueres sacar, Matches1 es donde volcas ese resultado
    
preg_match_all("(<input type=\'hidden\' name=\'(.*)\' id=\'tell\' value=\'\' class=\'texta\' />)iU"$result$matches2);
    
preg_match_all("(<input type=\"hidden\" name=\"(.*)\" value=\"(.*)\">)iU"$result$matches3);
    
    
$return trim($matches1[1][0]);
    
$key trim($matches2[1][0]);
    
$key2 trim($matches3[1][0]);
        
$key3 trim($matches3[2][0]); 
  #3 (permalink)  
Antiguo 11/01/2013, 14:30
Avatar de andresdzphp
Colaborador
 
Fecha de Ingreso: julio-2011
Ubicación: $this->Colombia;
Mensajes: 2.749
Antigüedad: 12 años, 8 meses
Puntos: 793
Respuesta: Extraer página con CURL y recuperar datos de tabla

No es tan complicado manejar las clases DOM de PHP, podrías colocar un poco de HTML?

Tienes el método getElementById para obtener etiquetas por ID (único).

El método getElementsByTagName para obtener etiquetas por nombre etiqueta

DOMXPath es una clase para búsquedas en el DOM más avanzadas, por ejemplo una etiqueta con un atributo específico. Pero para usar este debes saber como funciona el lenguaje Xpath.

Por ejemplo para obtener el contenido de todos los TD del HTML:

Código PHP:
Ver original
  1. $doc = new DOMDocument();
  2. $doc->loadHTML($html); //cargamos el HTML
  3. $td = $doc->getElementsByTagName('td');
  4.  
  5. foreach ($td as $data) {
  6.     echo $data->nodeValue . '<br />';
  7. }

Pero se puede ser más preciso si hay un div u otra etiqueta donde se encuentre la tabla.

Saludos.
__________________
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
  #4 (permalink)  
Antiguo 11/01/2013, 17:54
Avatar de Dundee  
Fecha de Ingreso: junio-2002
Ubicación: El Médano
Mensajes: 1.310
Antigüedad: 21 años, 9 meses
Puntos: 8
Respuesta: Extraer página con CURL y recuperar datos de tabla

Cita:
Iniciado por andresdzphp Ver Mensaje

Código PHP:
Ver original
  1. $doc = new DOMDocument();
  2. $doc->loadHTML($html); //cargamos el HTML
  3. $td = $doc->getElementsByTagName('td');
  4.  
  5. foreach ($td as $data) {
  6.     echo $data->nodeValue . '<br />';
  7. }

Pero se puede ser más preciso si hay un div u otra etiqueta donde se encuentre la tabla.

Saludos.
Gracias , tus sugerencias me han servido bastante, ya he conseguido sustraer los datos que necesitaba de la primera página e insertarlos en la base de datos, pero lo que no consigo acceder es a los enlaces de paginación , para así visitar las otras páginas (ya que esta paginada), y así poder hacer lo mismo. Otra forma de hacerlo es con un bucle FOR añadiéndole el número de página como una variable, algo así:
$url=$url.'?cuerpo=I590&especialidad=004&inicio='. $pagina; , pero no me funciona , y creo que puede ser porque al hacer el for en y meter dentro la llamada CURL , le vuelvo a pasar por POST los datos iniciales , que además en esta ocasión se los paso por GET , ¿puede ser eso o que necesito modificar para poder ver el resto de páginas?.

El código que tengo (esto es para solo la primera página):
Código:
set_time_limit(0);
//require("simple_html_dom.php");
$pagina=1;
$url='http://www.miweb.es/lista.html';

     echo $url.'<br />';

    //$pagina=$pagina+50;
    
    $ch = curl_init($url);//URL A ENVIAR EL CONTENIDO
  
        curl_setopt ($ch, CURLOPT_POST, 1);//SETEAMOS LA VARIABLE DE ENVIAR DE CONTENIDO POST EN TRUE (1)
        curl_setopt ($ch, CURLOPT_POSTFIELDS, 'cuerpo=I590&especialidad=004'); //SETEAMOS LOS VALORES A ENVIAR
   
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);//OPCIONAL: NO RETORNARA EL RESULTADO DE LA OPERACION
    curl_setopt($ch, CURLOPT_COOKIEJAR, "cookies/cookies-ja.txt");
    curl_setopt($ch, CURLOPT_COOKIEFILE, "cookies/cookies-ja.txtt");
   
    $html = curl_exec ($ch);//EJECUTAMOS
    curl_close ($ch);//CERRAMOS

    if (!$html) {
        echo "<br />cURL error number:" .curl_errno($ch);
        echo "<br />cURL error:" . curl_error($ch);
        exit;
    }

$doc = new DOMDocument();
$doc->loadHTML($html); //cargamos el HTML
$td = $doc->getElementsByTagName('td');
$paginacion=$doc->getElementById('paginacion');


var_dump($paginacion->tagName);

$cliente=array();
foreach ($td as $data) {
    
    echo $data->nodeValue . '<br />';
    if (strlen($data->nodeValue)===8){
        $cliente['dni']= $data->nodeValue;
    }elseif(strpos($data->nodeValue,',')){
        $cliente['name']=$data->nodeValue;

    if(!add_user($cliente)){
        echo "No se ha podido insertar el interino con DNI ".$cliente['dni']."<br />";
    }
    unset($cliente);
    $cliente=array();
    }

}
Seguro que existen mejores formas de hacerlo, pero para lo que lo necesito funciona perfectamente (ojo solo para la primera página, no como me gustaría con todas las páginas).

Gracias de antemano.
__________________
Videotutoriales de Drupal
  #5 (permalink)  
Antiguo 11/01/2013, 18:43
Avatar de andresdzphp
Colaborador
 
Fecha de Ingreso: julio-2011
Ubicación: $this->Colombia;
Mensajes: 2.749
Antigüedad: 12 años, 8 meses
Puntos: 793
Respuesta: Extraer página con CURL y recuperar datos de tabla

Así puedes obtener atributos, para acceder a los enlaces:

Código PHP:
Ver original
  1. $html = '<!DOCTYPE html>
  2. <html lang="es-ES">
  3. <head>
  4. <meta charset="utf-8" />
  5. <title>Prueba</title>
  6. </head>
  7. <body>
  8. <a href="pagina1.html">Pagina 1</a> -
  9. <a href="pagina2.html">Pagina 2</a>
  10. <div id="paginacion">
  11. <a href="http://www.google.com">Google</a> -
  12. <a href="http://www.gmail.com">Gmail</a> -
  13. <a href="http://www.forosdelweb.com">FDW</a>
  14. </div>
  15. </body>
  16. </html>';
  17.  
  18. $doc = new DOMDocument();
  19. $doc->loadHTML($html);
  20. $pag = $doc->getElementById('paginacion');
  21. $enlaces = $pag->getElementsByTagName('a');
  22.  
  23. foreach ($enlaces as $enl) {
  24.     echo $enl->attributes->getNamedItem('href')->nodeValue . '<br />';
  25. }
  26. /*
  27. http://www.google.com
  28. http://www.gmail.com
  29. http://www.forosdelweb.com
  30. */
__________________
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 10/09/2015, 09:33
 
Fecha de Ingreso: julio-2013
Mensajes: 4
Antigüedad: 10 años, 9 meses
Puntos: 0
Respuesta: Extraer página con CURL y recuperar datos de tabla

Hola gente, estoy haciendo algo parecido pero tengo complicaciones el proyecto es asi:
con un archivo php en una casilla ingreso el link y saco la info que necesito hasta hay excelente pero necesito llevar esta info a un formulario donde aparte ingreso unos datos extra para poder guardalos en mi base de datos pero no e podido hacer esto no se si ustedes tengo algun ejemplo o me puedan guiar a realizar esto. agradeceria mucho la ayuda prestada.

Etiquetas: curl
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




La zona horaria es GMT -6. Ahora son las 14:00.