New question

Question:

 
  2  
 
Date: 14-09-2016 22:32:56 (In Spanish)

¿Por qué mi Script PHP de Web Scraping se detiene inesperadamente? (para ejecuciones distintas, en distintas partes)[Resolved]

Hola amigos,

hace un tiempo expuse un tema sobre rastrear en páginas web externas a la de origen. En muchos casos no dejaba hacerlo etc etc.. al final era porque dependiendo desde que hosting lanzara el Web Scraping no dejaba por limitaciones de mismo hosting. Encontré un hosting que tenía menos limitaciones y sin cambiar nada de código empezó a funcionar.

Ahora necesito vuestra ayuda para que me deis ideas de por qué el código actual se me para a veces. No pongo código porque es seguro que no es por el código, os comento como ocurre y ya me dais ideas.

El código lo que hace es en esencia recorrer páginas web almacenando información sobre anuncios de por ejemplo mil anuncios para sacar precios medios de por ejemplo alquileres de pisos en la actualidad.

Al lanzar el código a veces se para sin terminar de rastrear todos los bucles pero cada vez en una parte distinta, entonces lo que hice es simplemente eliminar la parte de donde extraigo la información para ver si se hacen todos los bucles y se hacían todos perfectamente, entonces volví a poner la parte de extracción de anuncios y al rastrear por ejemplo se me paraba en una provincia X, yo cogía la URL de esa provincia, y probé a rastrearla directamente y la rastrea perfectamente. Por lo tanto no es error de código.

Me comuniqué con el Hosting por si acaso tenía alguna limitación a la hora del tiempo de ejecución y me lo aumentaron. Pero nada... unas veces lanzo el Web Scraping y se para cuando ha insertado 800 inmuebles y otras veces inserta 4000, nunca se para en el mismo sitio , cada vez son sitios diferentes y los sitios donde se para los escaneo independientemente y funciona perfectamente...

A alguien se le ocurre que tipo de limitación puede estar ocasionando esto?, ya que no genera errores ni nada por el estilo?

Como os digo el código funciona bien, debe ser del hosting pero no tengo conocimientos suficientes para poder obtener ideas y hacer pruebas, estoy valorando el adquirir un servidor dedicado pero no quiero gastarme ese diner sin tenerlo claro o sin ser necesario.

Desde ya muchas gracias por vuestros aportes.
Tags: cURL - PHP - Question - Scraping - Script PHP - Web - Web Scraping Votes: 2 - Answers: 4 - Views: 12 Share on: Google Facebook Twitter LinkedIn Link
 

Answers:

  • Date: 16-09-2016 04:40:30 Hola Fran, menudo problema tienes entre manos. Los motivos por los cuales puede fallar tu script de web scraping son de los mas variados, veamos algunas situaciones.

    A) Error en tu script PHP: cuando digo error no solo me estoy refiriendo a un error en tiempo de ejecución arrojado por el interprete (que ya tu has dejado claro que no sucede) sino también a un error en tu logica (un mal uso de llamadas a funciones anidadas, no liberación de variables, no liberación de buffer, etc) que terminan consumiendo los recursos del servidor y/o alcanzando los limites/restricciones configuradas en el mismo.
    Aquí te recomiendo que utilices una estructura try catch para intentar capturar cualquier mensaje que se pueda dar y que no estes detectando en las ejecuciones individuales/manuales.
    Un pequeño ejemplo:
    try {
        //aquí tu código de web scraping
    } catch (Exception $e) {
        file_put_contents('logo.txt', $e->getMessage() . PHP_EOL, FILE_APPEND | LOCK_EX);
    }


    B) Configuración del servidor / contexto de ejecución: hace un tiempo escribí una nota sobre esto, te recomiendo leer Configurar el limite de memoria y tiempo máximo de ejecución de nuestros script's PHP

    C) Admininistración del servidor: los administradores de servidores suelen configurar reglas para garantizar la estabilidad de los servicios, reglas que pueden llegar a matar procesos (kill process) que esten consumiendo más de x recursos, que llevan más de x tiempo en ejecución, etc..., y sobre todo en los servidores compartidos (shared server) donde el uso (mal uso) de un script en un cliente puede afectar negativamente a los otros clientes que comparten el servidor.

    Espero que mi respuesta te sea de ayuda.

    Saludos y buen código!
      Votes: 2 - Link answer
     
  •  
      1  
     
    Date: 18-09-2016 21:25:17 Buenos días Fernando,

    muchas gracias por tu respuesta, voy a probar los 3 puntos que me enumeras y posteo el resultado.

    A ver si hay suerte que ya me van a salir canas con el maldito rastreador.
      Votes: 1 - Link answer
     
  •  
      0  
     
    Date: 20-09-2016 22:22:57 Hola de nuevo...

    te comento... modifiqué mi script y una de las cosas que hice es vaciar variables al final de cada bucle, en cada vuelta imprimo un mensaje que me dice cuanta memoria estoy usando del total, hice un condicional para todos y cada uno de los datos que rastreo...

    Pues nada, nunca da error, unas veces llega muy lejos y otras sin embargo se para antes.

    Siempre empieza a rastrear desde el mismo sitio, lo cual quiere decir que muchas veces no se para donde se paró la vez anterior.

    La verdad es que estoy un poco frustrado ya.. no se por qué ocurre esto.

    Voy a tener que buscar alternativas en la programación. Ahora mismo lo hago con la librería Curl voy a tener que mirar si existen librerias para esto y ver si puedo aprender a usarlas.

    En fin.... garcias
      Votes: 0 - Link answer
     
  •  
      0  
     
    Date: 28-09-2016 05:48:25 Compañeros traigo nuevas pistas para mi calvario de rastrear jejeje.

    Después de probar mil y una cosas decidí a probar el rastreador desde localhost.

    Mi sorpresa que he encontrado unos mensajes que no me daba en ningún server online. Os los pongo a ver si podéis ayudarme.

    Antes de mostraros el error decir que cuando lo da, lleva rastreadas entre 1800 y 5000 urls, con lo cual y sabiendo que el portal siempre tiene la misma estructura no hay error en la extracción de los datos.

    $ch = curl_init();
    $cReferer = curl_setopt($ch, CURLOPT_REFERER, $referer);
    $cUrl = curl_setopt($ch, CURLOPT_URL, $url);
    $cAgents = curl_setopt($ch, CURLOPT_USERAGENT, $agents);
    $cHttp = curl_setopt($ch, CURLOPT_HTTPHEADER, array("Accept-Language: es-es,en"));
    $cTime = curl_setopt($ch, CURLOPT_TIMEOUT, 10);
    $cLocation = curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
    $cRetTrans = curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    $cBinary = curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1);
    $data = curl_exec($ch);
    

    curl_exec($ch) me da error y el error que me muestra :
    $errorCurl = curl_error($ch);
    

    curl_error($ch) me diceesto:
    Operation timed out after 10017 milliseconds with 9608 out of -1 bytes received
    curl_close($ch);
    @$doc = new DOMDocument();
    


    Estos errores nunca salen en el servidor online imagino que porque las empresas modificaran ciertas cosas a su antojo y el XAMP viene un poco menos personalizado.

    Este es el unico error que me muestra, que online se para el script pero en localhost continua, pero eso si!!, continua pero después del primer error, todas las URLS que viene detrás dan el mismo error.

    Alguna idea compañeros? si no me podéis ayudar me va a tocar intentar rastrear sin la librería Curl y de nuevo volver a empezar... espero que no sea así que esto ya me está frustrando demasiado.
      Votes: 0 - Link answer
     
To actively participate in the community first must authenticate, enter the system.Sign In