Foro de elhacker.net

Programación => PHP => Mensaje iniciado por: goditozor en 29 Agosto 2014, 00:57 am



Título: Hacer cURL en respuesta de cURL para posterior scraping.
Publicado por: goditozor en 29 Agosto 2014, 00:57 am
Hola amigos que tal?

Hace un par de meses que he estado aprendiendo scraping con diferentes clases como XPath.

Hace un par de semanas he estado intentando hacer algo que probablemente es sencillo pero no he podido encontrar la respuesta fácilmente así que me gustaría que me pudiesen ayudar.

Antes de mostrarle mi código, quiero que entiendan el problema.

Tengo una una pagina web que requiere un login y luego llenar otro formulario y enviarlo para que me muestre los datos que yo requiero.
Por lo tanto los pasos serian los siguientes.

1. Abrir la url y hacer login  (1er formulario)
2. En la nueva url despues de hacer login, debo llenar ciertos campos y enviar (2do formulario)
3. Hacer scraping.

Mi problema radica en el paso #2.  Despues de hacer el primer login no tengo idea de como usar el resultado del primer cURL (ver el codigo)

Este codigo toma una url que contiene el formulario y un Array que tiene los valores que pasare el formulario
Código:
function curlPost($postUrl, $postFields) {
     
        $cookie = 'cookie.txt'; // Setting a cookie file to store cookie
     
        $ch = curl_init();  // Initialising cURL session
     
        // Setting cURL options
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);    // Prevent cURL from verifying SSL certificate
        curl_setopt($ch, CURLOPT_FAILONERROR, TRUE);    // Script should fail silently on error
        curl_setopt($ch, CURLOPT_COOKIESESSION, TRUE);  // Use cookies
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE); // Follow Location: headers
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); // Returning transfer as a string
        curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie);  // Setting cookiefile
        curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie);   // Setting cookiejar
        curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1a2pre) Gecko/2008073000 Shredder/3.0a2pre ThunderBrowse/3.2.1.8");    // Setting useragent

        curl_setopt($ch, CURLOPT_URL, $postUrl);    // Setting URL to POST to       
        curl_setopt($ch, CURLOPT_POST, TRUE);   // Setting method as POST

        curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($postFields));    // Setting POST fields as array
                 
        $results = curl_exec($ch);  // Executing cURL session
       

        curl_close($ch);    // Closing cURL session
       
        return $results;
    }



Luego, este primer bloque, lo ejecuto de la siguiente manera:

Código:
$user ="userxxx";
        $pass = "passxxxxxxx";


        $login_url = "http://www.xxxxx.com/repositorio/consultas_web/";
        $post_array = array ('login' => $user,
                        'password' => $pass);   // Building post array.


        $results = curlPost($login_url, $post_array);


En este punto se que el primer paso cumple su función ya que si cambio la clave o user por uno invalido, me dara una advertencia de credenciales invalidos.

para verificar tengo que hacer un
Código:
echo $results;

Esto me lleva a la sub url que seria el "home" despues de hacer login

En mi caso, como estoy probando en localhost me da un error 404 cuando el login es correcto. La ruta es la siguiente:

Código:
[b]localhost/scraping/[/b]consultas_privadas.php
donde el texto en negritas es mi directorio local. y consultas_privadas.php es el subdirectorio que resulta despues de enviar el formulario.


El problema es que no se como continuar con la segunda etapa.


Pues, tengo que usar el resultado ( $results ) y hacer un cURL nuevamente  para repetir este método pero en un formulario diferente


intente utlizando el mismo metodo que en el paso 1 pero no se que estoy haciendo mal.
Código:
$results2 = curlPost($result, $post_array2);


y la verdad es que no se si esta mal o bien pues no se si tengo hacer un
Código:
echo $results;
para poder hacer el segundo $cURL.


 Alguien ha intentado hacer dos cURLs seguidos antes?


Estoy perdido :huh: cualquier ayuda es muy apreciada.
Gracias por tomar el tiempo para leer :)


Título: Re: Hacer cURL en respuesta de cURL para posterior scraping.
Publicado por: MinusFour en 29 Agosto 2014, 01:45 am
Necesitas obtener el campo action del formulario que te lleva al segundo enlace del resultado del curl del primero. Estas intentando pasar la respuesta del curl como url para tu segundo curl por eso no funciona.


Título: Re: Hacer cURL en respuesta de cURL para posterior scraping.
Publicado por: JorgeEMX en 31 Agosto 2014, 15:29 pm
En realidad no necesitas hacer nada más que llamar a tu segunda URL, no al resultado de la primera.

cURL lo único que hace es hacer peticiones HTTP y devolver el resultado, si iniciaste sesión correctamente en el primer request, deberías poder acceder a la segunda URL sin problema.


Título: Re: Hacer cURL en respuesta de cURL para posterior scraping.
Publicado por: WHK en 1 Septiembre 2014, 20:32 pm
Porque la gente usa curl? no todos los servidores web lo tienen instalado, además no hace nada que no pueda hacer file_get_contents() el cual es nativo de php y está diseñado para este tipo de situaciones:

Código
  1. <?php
  2.  
  3. /* Primera petición */
  4. if(!$result = file_get_contents(
  5. 'http://www.xxxxx.com/repositorio/consultas_web/',
  6. false,
  7. array('http' =>
  8. 'method'  => 'POST',
  9. 'header'  => 'Content-type: application/x-www-form-urlencoded',
  10. 'content' => http_build_query(
  11. 'login' => 'userxxxxx',
  12. 'password' => 'passxxxxx'
  13. )
  14. )
  15. )
  16. )
  17. )
  18. ))
  19. die('Error en la primera consulta');
  20.  
  21. /* Obtiene las cookies de autentificación */
  22. $cookies = array();
  23. foreach($http_response_header as $cabecera)
  24. if(strtolower(substr($cabecera, 0, strlen('set-cookie: '))) == 'set-cookie: ')
  25. $cookies[] = substr($cabecera, strlen('set-cookie: '));
  26. $cookies = implode('; ', $cookies);
  27.  
  28. /* Segunda petición */
  29. if(!$result = file_get_contents(
  30. 'http://www.xxxxx.com/repositorio/privado/',
  31. false,
  32. array('http' =>
  33. 'method'  => 'POST',
  34. 'header'  => implode("\r\n", array(
  35. 'Content-type: application/x-www-form-urlencoded',
  36. 'Cookie: '.$cookies
  37. )),
  38. 'content' => http_build_query(
  39. 'data1' => 'val1',
  40. 'data2' => 'val2'
  41. )
  42. )
  43. )
  44. )
  45. )
  46. ))
  47. die('Error enl a segunda consulta');
  48.  
  49. /* Resultado */
  50. echo '<plaintext>';
  51. print_r($result);