Web scraping con Symfony utilizando Panther

Web scraping con Symfony utilizando Panther
Solucionex
02
Nov 23

¿Qué es Panther?

Symfony Panther es una librería desarrollada por el equipo de Symfony, uno de los frameworks PHP más populares. Panther proporciona herramientas para realizar pruebas end-to-end (e2e) de aplicaciones web. Estas son algunas de sus características clave:

  • Navegador real: Symfony Panther utiliza automáticamente el navegador Chrome (mediante ChromeDriver) para ejecutar las pruebas, lo que significa que las pruebas se ejecutan en un navegador real. Esto garantiza que las pruebas sean lo más cercanas posible a la experiencia del usuario real.
  • Integración con PHPUnit: Panther se integra perfectamente con PHPUnit, lo que permite a los desarrolladores escribir pruebas e2e utilizando la misma estructura y sintaxis que las pruebas unitarias en Symfony.
  • Compatibilidad con Webdriver y PantherClient: Además de utilizar el protocolo WebDriver, Panther también ofrece un cliente propio, llamado PantherClient, que es una extensión del cliente HTTP de Symfony. Esto permite escribir pruebas que interactúen tanto con la API como con la interfaz del usuario.
  • Soporte para JavaScript: Dado que Panther utiliza un navegador real, también tiene soporte completo para JavaScript. Esto significa que las pruebas pueden interactuar con páginas que utilizan frameworks frontend modernos como React, Vue.js o Angular.
  • Base de datos aislada: Panther proporciona herramientas para manejar bases de datos de prueba. Esto garantiza que las pruebas no afecten la base de datos real de la aplicación y que cada prueba se ejecute en un entorno aislado.
  • Integración con otros componentes de Symfony: Al ser parte del ecosistema de Symfony, Panther se integra bien con otras herramientas y componentes de Symfony, lo que facilita la configuración y el uso en proyectos basados en Symfony.

En resumen, Symfony Panther es una poderosa herramienta para escribir pruebas end-to-end en aplicaciones web, permitiendo a los desarrolladores asegurarse de que tanto el frontend como el backend de sus aplicaciones funcionen correctamente y según las expectativas, además de una herramienta muy efectiva a la hora de extraer contenido web (web scraping).

A continuación, vamos a ver un par de ejemplos de lo que podemos realizar con Panther.

Ejemplos reales utilizando Panther

Instalación

Para instalar Panther, dependiendo de los entornos en los que queramos utilizarlo, lanzaremos los siguientes comandos:

# Como dependencia de desarrollo

composer require --dev symfony/panther

# Como dependencia de producción

composer require symfony/panther

En el caso de Symfony, su "recipe" se encargará de configurar la herramienta e integrarla debidamente en el entorno de pruebas.

Test end-to-end para comprobar el inicio de sesión de nuestra aplicación

// tests/e2e/LoginTest.php
namespace App\Tests\e2e;
use Symfony\Component\Panther\PantherTestCase;
class LoginTest extends PantherTestCase
{
   public function testUserCanLogin(): void
   {
       $client = static::createPantherClient(); // Crear un cliente Panther
       // Navegar a la página de inicio de sesión
       $crawler = $client->request('GET', '/login');
       // Rellenar el formulario de inicio de sesión
       $crawler->filter('input[name="username"]')->sendKeys('user@example.com');
       $crawler->filter('input[name="password"]')->sendKeys('securepassword');
       // Enviar el formulario
       $crawler->filter('button[type="submit"]')->click();
       // Verificar que el usuario ha sido redirigido a la página de inicio (o donde corresponda después del inicio de sesión)
       $this->assertStringContainsString('Welcome', $client->getPageSource()); // Asumiendo que la página de inicio contiene la palabra 'Welcome'
       // Terminar la sesión y cerrar el navegador
       $client->quit();
   }
}

Script de web scraping para traerse las noticias de portada de nuestra web

<?php

declare(strict_types=1);

use Symfony\Component\Panther\Client;
use Symfony\Component\Panther\DomCrawler\Crawler;

require 'vendor/autoload.php';

class ScrapeBlogSolucionex
{
    private function scrapePageContent(int $page, bool $firefox=false): array
    {
        $client = Client::createChromeClient();
        if($firefox) $client = Client::createFirefoxClient();
        $client->request('GET', "https://www.solucionex.com/blog?page={$page}");
        $crawler = $client->waitForVisibility('div.view-id-article > div > div.grid > div > div.grid');
        $posts = $crawler->filter('div.view-id-article > div > div.grid > div > div.grid > div')->each(
            function ($node, $i) {
                return [
                    'image' => $node->filter('a div.image > img')->attr('src'),
                    'title' => $node->filter('a div.headline')->text(),
                    'link' => $node->filter('a')->link()->getUri()
                ];
            }
        );
        return $posts;
    }

    public function scrapeBlogContent(){
        $pages = 73;
        $posts = [];
        for ($i=0; $i <= $pages; $i++) { 
            $posts[$i] = self::scrapePageContent($i);
        }
        return json_encode($posts, JSON_UNESCAPED_UNICODE);
    }
}

 

Otras alternativas PHP a Panther

Existen varias alternativas a Symfony Panther en el ecosistema PHP para realizar pruebas end-to-end y pruebas de navegador. A continuación, te presento algunas de las más populares:

  • Behat/Mink: Behat es una herramienta de prueba de comportamiento que utiliza el enfoque BDD (Behavior-Driven Development). Permite escribir pruebas utilizando un lenguaje natural que se transforma en código ejecutable. Mientras que Mink es una capa de abstracción entre las pruebas Behat y los diferentes navegadores o servicios de navegación. Soporta varios "drivers" como Selenium, Goutte, y Zombie.js.
  • Codeception: Es un framework de pruebas completo que ofrece soporte para pruebas unitarias, de aceptación y funcionales.
    Utiliza una combinación de PHPUnit, Mink, Selenium y otros para ofrecer una experiencia de prueba muy flexible y potente.
  • PHPUnit Selenium: Es una extensión de PHPUnit que permite escribir pruebas que interactúen directamente con el navegador a través de Selenium.
  • Laravel Dusk: Es una herramienta de prueba de navegador para el framework Laravel. Proporciona una API expresiva para interactuar con el navegador y está basada en ChromeDriver.

En resumen, mientras que Panther es una excelente herramienta para realizar pruebas e2e en proyectos Symfony, existen varias otras opciones en el ecosistema PHP, cada una con sus propias ventajas, características y enfoques. La elección entre estas herramientas dependerá en gran medida del contexto del proyecto, el framework utilizado y las preferencias del equipo de desarrollo.

symfony
web scraping
panther
php