New question

Question:

 
  2  
 
Date: 21-07-2016 07:12:45 (In Spanish)

Web Scraping, pequeña duda[Resolved]

Hola compañeros,

me han pedido que haga una especie de Crawler que rastree los precios de las viviendas de ciertos portales conocidos para poder calcular el precio medio de las viviendas por zonas y de esta manera poder ayudar a los clientes a que no paguen más de lo que deben.

El problema viene con el portal Mil-Anunc-Ios por ejemplo, (me da el mismo problema en otros), se ve que detecta que soy un robot y me dice lo siguiente:

ERROR

The request could not be satisfied.

Request blocked.
Generated by cloudfront (CloudFront)
Request ID: _7G5x0pdXMgnBVZPacKaZhUIGB-mYR6xNTQxr_Loz_mEwe_vZL5M9Q==


Estoy usando la librería Curl y le estoy especificando como CURLOPT_USERAGENT el siguiente:

$agents = 'Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.155 Safari/537.36';


En teoría según tengo entendido esto es para que piense que soy un usuario accediendo desde un navegador

Si me pudierais ayudar os lo agradecería mucho.

Saludos
Tags: cURL - PHP - Question - Scraping - Web - Web Scraping Votes: 2 - Answers: 9 - Views: 18 Share on: Google Facebook Twitter LinkedIn Link
 

Answers:

  • Date: 23-07-2016 04:31:02 Hola Fran, sería de ayuda ver como estas armando toda la petición CURL, te invito a que compartas esa porción de código y vemos desde ahí. Al margen de esto, por que complicarse con CURL cuando puedes utilizar file_get_contents()

    Por ejemplo:
    <?php
    $página = file_get_contents('https://www.google.com/');
    echo $página;
    ?>


    Saludos y buen código!
      Votes: 1 - Link answer
     
  •  
      1  
     
    Date: 23-07-2016 06:06:10 Hola Fernando, muchas gracias por tu respuesta,

    no se usar file_get_contents() :(

    te dejo el código, no todo porque son iteraciones, pero te dejo el principio:

    $url = "http://www.milanuncios.com/$tipo-$provincia/?vendedor=part&pagina=$pag";
    $agents = 'Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.155 Safari/537.36';
    $referer = 'http://www.milanuncios.com';
    
    $ch = curl_init();  
    curl_setopt($ch, CURLOPT_URL, $url);  
    curl_setopt($ch, CURLOPT_REFERER, $referer);
    curl_setopt($ch, CURLOPT_USERAGENT, $agents);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    $data = curl_exec($ch);
    curl_close($ch);
    
    $doc = new DOMDocument();
    $doc->loadHTML($data);
    $xpath = new DOMXPath($doc);
    
    //Obtengo todos los contenedores de anuncio que son lo que llevan la clase x1
    $ads =  $xpath->query('//div[@class="x1"]');
    
    //Imprimo la canidad de anuncios que hay
    //ESTO YA NO ME VA TAMPOCO
    utilesRastreador::miEcho("<b>Pisos Encontrados </b>: " . $ads->length,1 );
    
    //Recorro todos los contenedores de anuncio de la página actual
    foreach ($ads as $ad){
    	$tipo_node = $xpath->query("div[@class='x2']/div[@class='x3']", $ad)->item(0);
    	$tipo = $tipo_node->nodeValue;
    	//echo $tipo;
    	
    	$link_poblacion = $xpath->query("div[@class='x2']/div[@class='x4']/a/@href", $ad)->item(0)->nodeValue;
    	
    	$link_poblacion = ereg_replace("[./]", "",$link_poblacion);
    	//echo $link_poblacion;
    	$ar_link = explode("-", $link_poblacion);
    	$poblacion = $ar_link[count($ar_link) - 2];
    }



    espero que puedas ayudarme

    muchas gracias
      Votes: 1 - Link answer
     
  • Date: 23-07-2016 07:27:37 Hola Fran, file_get_contents() lo usas muy fácil, aquí modifico la primera parte de tu ejemplo para que entiendas la idea:

    Remplaza esto:
    $url = "http://www.milanuncios.com/$tipo-$provincia/?vendedor=part&pagina=$pag";
    $agents = 'Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.155 Safari/537.36';
    $referer = 'http://www.milanuncios.com';
    $ch = curl_init();  
    curl_setopt($ch, CURLOPT_URL, $url);  
    curl_setopt($ch, CURLOPT_REFERER, $referer);
    curl_setopt($ch, CURLOPT_USERAGENT, $agents);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    $data = curl_exec($ch);
    curl_close($ch);


    Por esto:
    $url = "http://www.milanuncios.com/$tipo-$provincia/?vendedor=part&pagina=$pag";
    $data = file_get_contents($url);


    Tan simple como eso..., cargas la variable $data con el contenido de la $url solicitada (no necesita CURL).

    Para ver si controla referer y demás yerbas (con lo que tu te estas complicando) hice una simple prueba y funcionó, básicamente puse el siguiente código en un archivo "test.php" y lo ejecute, file_get_contents se encarga de guardar la web en la variable $página y con el echo la imprimo (no hay referer, ni sesión, ni nada...., un simple get con la función file_get_contents)
    <?php
    $página = file_get_contents('http://www.milanuncios.com/venta-de-apartamentos-en-torrevieja-alicante/torrevieja-centro-202098815.htm');
    echo $página;
    

    Saludos y buen código!
      Votes: 1 - Link answer
     
  •  
      0  
     
    Date: 26-07-2016 04:58:02 Hola Fernando,

    a mi no me va así. mira el código super simple:

    <?php
    $url = "http://www.milanuncios.com/alquiler-de-viviendas-en-valencia/?vendedor=part&pagina=1";
    
    $data = file_get_contents($url);
    
    echo $data;
    
    /*//Instancio para recibir un HTML
    $doc = new DOMDocument();
    //Cargo el HTML
    $doc->loadHTML($data);
    //Para ver XPATH
    $xpath = new DOMXPath($doc);
    
    echo $xpath;exit;*/
    ?>


    Estoy empezando a pensar que esto tiene que ver con mi server, es posible?
      Votes: 0 - Link answer
     
  • Date: 26-07-2016 08:00:43 Ejecuto ese código tanto local como en un servidor productivo y me funciona OK, se carga la web "milanuncios" en la url de test.

    Obtienes algún error?, prueba agregar estas directivas al comienzo del script así te muestra los errores en pantalla (en el caso que a nivel php.ini no lo tengas habilitado):

    ini_set('display_errors', 1);
    error_reporting(-1);
    


    Saludos,
      Votes: 0 - Link answer
     
  •  
      1  
     
    Date: 27-07-2016 05:09:10 Hola Fernando, al final no iba yo muy desorientado, efectivamente era el servidor, he podido probar en otro server y con mi código de origen funciona todo, sin modificar nada.

    No obstante muchas gracias por tu interés.
      Votes: 1 - Link answer
     
  • Date: 27-07-2016 05:43:08 De nada Fran, estamos para ayudarnos y aprender juntos.

    ¿Pudiste identificar el problema en el servidor? si es así por favor comenta cual fue así sirve de ayuda a futuros lectores (alguna resticción, configuración, etc.). También no olvides cambia el estado de la pregunta a estado "resuleta".

    Un abrazo desde Argentina.
      Votes: 0 - Link answer
     
  •  
      0  
     
    Date: 27-07-2016 06:20:20 No Fernando,

    porque al ser hosting compartido, cada empresa tiene sus reestricciones, y no me han dicho nada. Antes de hacerlo funcionar, probé en otro server y el error era distinto, y por último en el que probé todo ha funcionado.

    Pero no he podido saber por qué, lo siento.
      Votes: 0 - Link answer
     
  • Date: 07-09-2017 06:48:14 Fernando,

    Buenos días, tengo una consulta relacionado con el tema que antecede:

    El URL de busqueda es el siguiente: https://www.iess.gob.ec/calificacion-web/pages/public/calificacionAtencion.jsf

    En esta pagina ingreso dos parámetros:

    Cedula: 1702991553
    Contingencia: Enfermedad

    Sin embargo la respuesta que recibo la respuesta solo obtengo el html inicial, su valiosa ayuda con sugerencias de cual seria el proceso para obtener el resultado después de enviar los parámetros de búsqueda.



    <?php

    $url = " https://www.iess.gob.ec/calificacion-web/pages/public/calificacionAtencion.jsf";

    $data = file_get_contents($url);

    echo $data;

    ?>
      Votes: 1 - Link answer
     
To actively participate in the community first must authenticate, enter the system.Sign In