¡Bienvenido a Foros Hosting ...!

Aquí encontraras una experiencia comunitaria para aprender todo lo relacionado con hosting.

Encuentra soporte en español para: Web Hosting, Servidores Dedicados, Servidores VPS, Clouds, Seguridad, Programación y muchos más.

Obtén más experiencia como Administrador de Sistemas, Crea tu propia empresa de hosting. Comparte tus conocimientos de forma libre.

¡Regístrate ahora y forma parte de nuestra comunidad!

Aporte Scraping: Extraer datos de reseñas desde Trustpilot en PHP con un cron job

JesusSuarez

Jesus Suarez
Miembro del equipo
Administradores
9/22/19
208
98
28
Bogotá - CO
cangurohosting.com
Seguidores
1
trustpilot.jpg

Lo siguiente fue duro hacerlo, dure como 3 días pensando como lograrlo de una forma correcta e ideando una forma que me funcionara bien.

Entonces para explicar lo que hace mi script.

Para los que no conocen bien trustpilot, es una web en la cual pueden hacer evaluaciones o reseñas de tu sitio web, la web tiene planes de pago que son de unos 100$ aproximadamente mensuales. evidentemente no quería pagar por esto y pensé en una forma de, traerme los comentarios para mostrarlos en mi web.

Entonces, la única forma era hacer un análisis del contenido del sitio e ir parseando poco a poco el contenido hasta traer los comentarios, las estrellas, la calificación, el nombre del usuario que realiza la crítica, y la imagen del usuario que realizo la crítica y ponerlo todo en un array para luego guardar el contenido en un archivo .json y así poder consumir ese archivo luego desde mi web.

La pregunta que se harán es ¿por qué guardarlo en un archivo .json y no mostrarlos directamente en tu web?

La respuesta es muy sencilla, el servidor de trustpilot usa el WAF de cloudfront el cual si realizas demasiadas peticiones (requests), te bloquea la conexión, entonces imagina que 3 o 4 usuarios ingresen a tu web, automáticamente el WAF detectara demasiadas peticiones desde la IP de tu servidor y te bloqueara el acceso, entonces no se imprimiría ningún contenido en tu web.

entonces para aclarar (el código lo arme apurado porque tenía otras cosas que hacer así que si encuentran algún error sería interesante reportarlo para arreglarlo lo antes posible sin embargo se puede ver en funcionamiento actualmente en
Por favor, Acceder o Registro para ver las URLs y el contenido!
)

¿Ahora, el código como funciona?

El script se conecta a trustpilot para traer los últimos comentarios > luego los guarda en un archivo llamado data.json en donde se almacenan hasta que hay nuevos comentarios.

El script se debe ejecutar con una tarea cron job en tu servidor o en tu cuenta cPanel diariamente para verificar si hay nuevos comentarios.

Iniciando el proceso de configuración, simplemente basta con solo cambiar la URL de tu sitio web en la variable: $website de la línea 10, por su sitio y ya funciona.

debes crear un archivo llamado data.json el cual trae en forma de array algo como:

JSON:
		{
    "ID del comentario": {
        "nombre": "Nombre de quien te da la critica",
        "estrellas": 5,
        "titulo": "Titulo de la evaluacion o reseña",
        "critica": "El comentario de la evaluacion",
        "imagen": "La imagen, algo como: https://user-images.trustpilot.com/id_imagen/73x73.png",
        "fecha": "Fecha, en formato: 28 January 2021"
    }
}
		

Quiero aclarar que el script trae los últimos 12 comentarios hechos por tus clientes en trustpilot para no realizar tantas peticiones al servidor de trustpilot, Además solo trae los comentarios que tengan 5 estrenas.

También indicar que si el usuario que hace el comentario no tiene ningún avatar hay que configurar la ruta de la carpeta en la línea 58, yo les deje aquí adjunto la carpeta que hice con las estrellas y el archivo no_avatar por si algún usuario no contiene avatar.

Ahora para usar el codigo creen un archivo llamado cron.php dentro de una carpeta que diga trustpilot y allí colocan el código

Aquí les dejo el código PHP

PHP:
		<?php
declare(strict_types = 1);
header("Content-Type: text/plain;charset=utf-8");
$ch = curl_init();
curl_setopt($ch, CURLOPT_ENCODING, ''); // habilitar compresion
$reviews = [];
    // agregado
    curl_setopt( $ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT'] );
    curl_setopt( $ch, CURLOPT_TIMEOUT, 40000 );
    $website = "cangurohosting.com";
    curl_setopt($ch, CURLOPT_URL, "https://es.trustpilot.com/review/$website?languages=all");
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
    $trustpilot = curl_exec($ch);
    //var_dump($trustpilot);
    // checkear si pasa un error de lo contrario seguir
    $trust_error = trim($trustpilot);
    $error_internet = "We have received an unusually large amount of requests from your IP so you have been rate limited";
    if (curl_errno($ch)) {
        die('Error fatal: curl_exec fallo, ' . curl_errno($ch) . ": " . curl_error($ch));
    }
    elseif (strip_tags($trust_error) == $error_internet) {
        die("La direccion IP de tu servidor fue bloqueda, mensaje de error desde trustpilot: (" . strip_tags($trust_error).')');
    }
    else {
        echo "trustpilot cargado correctamente.. se guardo la data en el archivo JSON";
    }
    //var_dump(strip_tags($trust_error));
    // aqui esta la magia (no tocar)
    $domd = @DOMDocument::loadHTML($trustpilot);
    $xp = new DOMXPath($domd);
    // contador definido en 0 (definir 10 reviews mas abajo en el if)
    $i = 0;
    //$numero_total = count($xp->query(".//article[@class='review']")); //numero total de criticas
    foreach ($xp->query(".//article[@class='review']") as $review) {
            //id del comentario
            $id = $review->getAttribute("id");
            $data_review_user_id = $review->getAttribute("data-review-user-id");
            // toda la data sin parcear
            $dataall = $xp->query(".//*[@data-initial-state='review-info']", $review)->item(0)->textContent;
            // nombre de quien comenta
            $reviewer = $xp->query(".//*[@class='consumer-information__name']", $review)->item(0)->textContent;
            // estrellas del comentario
            $estrella = "stars";
            $estrella1 = strstr($dataall, $estrella);
            $estrella2 = strstr($estrella1, ':');
            $estrella3 = preg_replace('([^A-Za-z0-9])', '', $estrella2);
            $stars = $estrella3;
            // titulo del review
            $title = $xp->query('.//*[@class="review-content__title"]', $review)->item(0)->textContent;
            $title = preg_replace('([^A-Za-z0-9 !])', '', $title);
            // texto de la critica
            $text = $xp->query('.//*[@class="review-content__text"]', $review)->item(0)->textContent;
            //imagen de perfil si no tiene imagen coloca una por default
            $url = "https://user-images.trustpilot.com/$data_review_user_id/73x73.png";
            $h = get_headers($url);
            if ($h[0] === "HTTP/1.1 403 Forbidden") {
                $img = "/trustpilot/img/no_avatar.png";
            } else {
                $img = "https://user-images.trustpilot.com/$data_review_user_id/73x73.png";
            }
            // fecha
            $fecha = $xp->query('.//*[@class="review-content-header__dates"]', $review)->item(0)->textContent;
            $fecha1 = explode(",", $fecha);
            $fecha2 = substr($fecha1[0], 0, -16);
            $fecha3 = substr($fecha2, -10, 10);
            $original_date = "$fecha3";
             // Creating timestamp from given date
            $timestamp = strtotime($original_date);
            // Creating new date format from that timestamp
            $new_date = date("d F Y", $timestamp);
            // esta verificacion es para no guardar datos NULL
            // tambien valida que el comentario tiene 5 estrellas para ser publicado en el json
            if ($i <= 12 && $text != NULL && $stars == 5 && $reviewer != NULL) {
            //convierte todo en un string
            $reviews[$id] = array(
            'nombre' => mytrim($reviewer),
            'estrellas' => mytrim($stars),
            'titulo' => mytrim($title),
            'critica' => ($text),
            'imagen' => ($img),
            'fecha' => ($new_date),
        );
        }
        $i++;
    }
    //variable final a imprimir
$var_all = json_encode($reviews, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE | (defined("JSON_UNESCAPED_LINE_TERMINATORS") ? JSON_UNESCAPED_LINE_TERMINATORS : 0) | JSON_NUMERIC_CHECK);
// si habilitas esta parte puedes traer la calificacion completa de tu sitio y la cantidad de opiniones
/*
foreach ($xp->query(".//div[@class='right-section']") as $puntos) {
    $estrellas_master = $xp->query(".//*[@class='header-section']", $puntos)->item(0)->textContent;
    $estrellas_master = preg_replace("/\s+/", " ", trim($estrellas_master));
    $estrellas_master = explode(" ", $estrellas_master);

     $puntuacion_final = $xp->query(".//*[@class='star-rating__trustscore']", $puntos)->item(0)->textContent;
     $puntuacion_final = preg_replace("/\s+/", " ", trim($puntuacion_final));


//var_dump($puntos);


     $var_puntos = array(
        'estrellas_global' => ($puntuacion_final),
        'opinion' => ($stars),
    );
    }
    $var_puntos1 = json_encode($var_puntos);
    $stars_file = fopen("puntuacion.json", "w");
    fwrite($stars_file, $var_puntos1 . PHP_EOL);
    fclose($stars_file);
*/
// escribir el json
$file = fopen("data.json", "w");
fwrite($file, $var_all . PHP_EOL);
fclose($file);
curl_close($ch);
// todo lo pasa a string (sin importar ni siquiera que sea HTML)
function mytrim(string $text): string
{
    return preg_replace("/\s+/", " ", trim($text));
}
		

Si leen el código verán que hay una sección que está comentada en el código, en esa sección puedes traer la cantidad de opiniones y de estrellas desde trustpilot y las guarda en un archivo llamado puntuacion.json

Luego les toca a ustedes hacer el diseño similar a trustpilot (el html)

el cron job lo pueden configurar de esta manera:

Código:
		php -q /home/user/public_html/trustpilot/cron.php
		

adjunto dejo la carpeta de las imagenes de las estrellas y no avatar.
 

Adjuntos

  • trustpilot.zip
    11,9 KB · Visitas: 0
Última edición:

Hosting por ...
Arriba Pie