¡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
264
107
43
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
error_reporting(0);
ini_set('display_errors', 0);
declare(strict_types = 1);
header("Content-Type: text/plain;charset=utf-8");
$ch = curl_init();
curl_setopt($ch, CURLOPT_ENCODING, ''); // habilitar compresion
curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);
curl_setopt($ch, CURLOPT_TIMEOUT, 40000);
$website = "cambiar_por_tu_dominio_o_tu_usuario_trustpilot";
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);
// 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";
}
// 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;
$todas_reviews = $xp->query(".//article[@class='review']");
$reviews = []; //array global
foreach ($todas_reviews as $review) {
    if ($i < 12) {
        //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
        $convert_array_content = json_decode($dataall);
        $json = json_encode($convert_array_content);
        $array = json_decode($json, true);
        $id = $array[reviewId];
        $nombre = $array[consumerName];
        $estrellas = $array[stars];
        $titulo = $array[reviewHeader];
        $critica = $array[reviewBody];
        $imagen = $array[consumerProfileImage];
        if ($imagen != null) {
            $img = $imagen;
        } else {
            $img = "/trustpilot/img/no_avatar.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);
        // if (++$i == 2) break;
        if ($titulo != null && $estrellas == 5 && $critica != null) {
            $reviews[$id] = array(
            'nombre' => $nombre,
            'estrellas' => $estrellas,
            'titulo' => $titulo,
            'critica' => $critica,
            'imagen' => $img,
            'fecha' => $new_date,
            );
        }
        $i +=1;
    }
}
$json_alt = json_encode($reviews);
$file = fopen("data.json", "w");
fwrite($file, $json_alt . PHP_EOL);
fclose($file);
curl_close($ch);
		

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.

PD: si descargaste el zip, simplemente copia el código php, y reemplázalo por el del archivo trustpilot.php que está dentro del zip.
 

Adjuntos

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

yonikani

Usuario Nuevo
11/18/21
3
0
1
28
Seguidores
0
Directamente no me recoge ningún elemento --> //$numero_total = count($xp->query(".//article[@class='review']")); //numero total de criticas
 

JesusSuarez

Jesus Suarez
Miembro del equipo
Administradores
9/22/19
264
107
43
Bogotá - CO
cangurohosting.com
Seguidores
1
Eso lo hice yo en su momento, y tampoco me recogía ninguno
Probé el script y sigue funcionando, lo único que se me ocurra es que sea algo con tu versión de PHP, que falte por ejemplo la dependencia de php-curl o que tengas un bloqueo en tu firewall que evite esto, además ten en cuenta que este script solo te funciona bajo un dominio "diferente a localhost, ya realizando la petición desde tu computadora sin un dominio válido no debería funcionar.

en otras palabras te dejo el siguiente post:
Por favor, Acceder o Registro para ver las URLs y el contenido!


o lo ejecutas con un no-ip (por ejemplo), o desde
Por favor, Acceder o Registro para ver las URLs y el contenido!
, pero jamás como:
Por favor, Acceder o Registro para ver las URLs y el contenido!
(ya que este último no te traerá nada del curl.)

Creería que por eso no te está funcionando, o no trae nada.

Recomendación: prueba el script dentro de un hosting en la nube, con un dominio o sub-dominio, esto debería funcionar bien de esa manera.
 

Hosting por ...
Arriba Pie