Comment faire du web scraping avec Laravel ?

Auteur :

Réagir :

Commenter

Le web scraping avec Laravel combine la puissance du framework PHP et des bibliothèques spécialisées pour automatiser l’extraction de données.

C’est une solution robuste pour collecter, traiter et organiser des informations en ligne. Découvrons ensemble dans cet article comment faire du web scraping avec Laravel.

Laravel utilise PHP comme moteur, offrant une structure organisée et des outils intégrés pour faciliter le web scraping.
Laravel utilise PHP comme moteur, offrant une structure organisée et des outils intégrés pour faciliter le web scraping. ©Christina pour Alucare.fr

Prérequis pour faire du scraping avec Laravel

Laravel est un framework PHP largement utilisé pour développer des applications web modernes.

Grâce à son écosystème riche, il offre un environnement idéal pour mettre en place du web scraping avec PHP de manière organisée et maintenable. Pour commencer, il est important de :

  • 🔥 Maîtriser les bases de PHP et de Laravel.
  • 🔥 Comprendre HTML et CSS pour cibler les éléments.
  • 🔥 Savoir manipuler Composer pour installer des paquets.

👉 Les outils essentiels sont :

  • Goutte : la bibliothèque PHP de référence. Elle simplifie les requêtes et l’extraction de données.
  • Puppeteer/Headless Chrome : un navigateur sans tête. Indispensable pour scraper les pages qui utilisent beaucoup de JavaScript.
  • HTTP Client de Laravel : permet de faire des requêtes avec Http::get() pour récupérer du contenu simple.

Tutoriel pour créer son premier scraper avec Laravel

Suivez ce tutoriel pas à pas pour créer un scraper fonctionnel avec Laravel.

⚠ Respectez toujours les conditions d’utilisation des sites, le robots.txt et la législation locale. Limitez la charge (rate-limit), identifiez un User-Agent et ne collectez pas de données sensibles.

Étape 1 : Installation et configuration

Créez un nouveau projet Laravel et ajoutez Goutte (intégration Laravel).

# 1) Créer un nouveau projet Laravel
composer create-project laravel/laravel scraper-demo
cd scraper-demo

# 2) Ajouter Goutte (intégration Laravel)
composer require weidner/goutte

Étape 2 : Créer une commande artisanale

Générez une commande qui contiendra votre logique de scraping :

php artisan make:command ScrapeData

Le fichier est créé ici : app/Console/Commands/ScrapeData.php.

Étape 3 : Écrire le code du scraper

Dans la commande générée, ajoutez :

  • ✅ Une requête HTTP pour récupérer le contenu HTML.
  • ✅ Des sélecteurs CSS pour cibler les données.
  • ✅ Une boucle pour parcourir les éléments et afficher les résultats.

Voici un exemple de code complet pour scraper les titres d’articles d’un blog :

<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;
use Weidner\Goutte\GoutteFacade as Goutte;
use Symfony\Component\DomCrawler\Crawler;

class ScrapeData extends Command
{
    protected $signature = 'scrape:data';
    protected $description = 'Scraper simple des titres d\'articles';

    public function handle(): int
    {
        $url = 'https://example.com/blog'; // URL du blog à scraper
        $this->info("Scraping: {$url}");

        // 1) Requête HTTP pour récupérer le HTML
        $crawler = Goutte::request('GET', $url);

        // 2) Utilisation de sélecteurs CSS
        $nodes = $crawler->filter('h2 a');

        // 3) Boucle sur les éléments et affichage
        $nodes->each(function (Crawler $node, $i) {
            $title = $node->text();
            $link  = $node->attr('href');
            $this->line(($i+1) . ". " . $title . " - " . $link);
        });

        return self::SUCCESS;
    }
}

Bonnes pratiques pour le web scraping avec Laravel

Pour faire du web scraping efficacement avec Laravel, voici quelques conseils à prendre en compte :

1. Gestion des tâches et de la mise en file d’attente

Le scraping peut prendre plusieurs secondes par page. Imaginez si vous devez scraper 1000 pages, votre application Laravel serait bloquée et inutilisable pendant un bon moment. La solution : les jobs et les queues de Laravel.

  • Un job, c’est une tâche que vous voulez exécuter en arrière-plan.
  • Une queue (file d’attente), c’est l’endroit où on range ces jobs pour qu’ils soient exécutés petit à petit, sans bloquer le reste.

👉 Voici un exemple de code pour encapsuler la logique de scraping dans un Job :

// app/Jobs/ScrapePageJob.php
<?php

namespace App\Jobs;

use Goutte\Client; // Ou Guzzle/Http, selon ta stack
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;

class ScrapePageJob implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

    protected string $url;

    public function __construct(string $url)
    {
        $this->url = $url;
    }

    public function handle(): void
    {
        $client = new Client();

        $crawler = $client->request('GET', $this->url);

        // Exemple simple : extraire tous les <h1>
        $titles = $crawler->filter('h1')->each(function ($node) {
            return $node->text();
        });

        // Persistance / logs / events...
        foreach ($titles as $title) {
            \Log::info("[Scraping] {$this->url} - H1: {$title}");
        }
    }
}

// app/Http/Controllers/ScraperController.php
<?php

namespace App\Http\Controllers;

use App\Jobs\ScrapePageJob;

class ScraperController extends Controller
{
    public function start()
    {
        $urls = [
            'https://example.com/page1',
            'https://example.com/page2',
            'https://example.com/page3',
        ];

        foreach ($urls as $url) {
            ScrapePageJob::dispatch($url);          // file d'attente par défaut
            // ScrapePageJob::dispatch($url)->onQueue('scraping'); // si tu veux une queue dédiée
        }

        return response()->json(['status' => 'Scraping lancé en arrière-plan 🚀']);
    }
}

👉 Comme vous avez vu, les jobs vont dans une queue (file d’attente). Laravel propose plusieurs systèmes pour gérer cette file. Les plus utilisées sont :

  • La file d’attente avec la base de données : les jobs sont stockés comme des lignes dans une table SQL, puis exécutés un par un par un worker.
  • La file d’attente avec Redis : les jobs sont placés en mémoire dans une file ultra-rapide, idéale pour traiter un gros volume de tâches.

2. Automatisation avec le planificateur de tâches de Laravel

Laravel intègre un planificateur de tâche (scheduler) qui permet d’automatiser les scrapers.

Vous pouvez ainsi planifier l’exécution d’une commande de scraping à des intervalles réguliers, par exemple toutes les heures.

👉 Voici comment l’exécuter dans app/Console/Kernel.php :

<?php

namespace App\Console;

use Illuminate\Console\Scheduling\Schedule;
use Illuminate\Foundation\Console\Kernel as ConsoleKernel;

class Kernel extends ConsoleKernel
{
/**
* Planifie les commandes artisan.
*/
protected function schedule(Schedule $schedule): void
{
// Toutes les heures
$schedule->command('scraper:run')->hourly();

    // Exemples utiles :
    // $schedule->command('scraper:run')->everyFifteenMinutes();
    // $schedule->command('scraper:run')->dailyAt('02:30')->timezone('Indian/Antananarivo');
}

/**
 * Enregistrement des commandes.
 */
protected function commands(): void
{
    $this->load(__DIR__ . '/Commands');
}


}

3. Contourner les protections anti-scraping

Beaucoup de sites mettent en place des protections contre les scrapers. Pour éviter d’être bloqué, il est mieux de :

  • ✅ Changer l’User-Agent : simulez un vrai navigateur.
  • Gérer les délais : insérez des pauses (sleep, throttle) entre les requêtes pour ne pas surcharger le serveur cible.
  • Utiliser des proxys : répartissez les requêtes sur plusieurs adresses IP.

Quelles sont les alternatives au web scraping avec Laravel ?

Même si Laravel est pratique pour intégrer le scraping dans une application PHP, il existe d’autres solutions souvent plus spécialisées.

Python est le langage le plus utilisé pour le scraping. Il dispose de bibliothèques puissantes comme Scrapy et BeautifulSoup.

  • Les outils sans code

De plus en plus d’outils permettent de faire du scraping sans coder ou avec l’aide de l’IA. On cite : Bright Data, Octoparse, Apify, etc.

Des solutions comme Bright Data permettent de collecter des données rapidement sans coder.
Des solutions comme Bright Data permettent de collecter des données rapidement sans coder. ©Christina pour Alucare.fr

FAQ

Comment scraper un site web protégé par un login avec Laravel ?

C’est l’un des défis les plus courants en web scraping. Pour y parvenir avec Laravel, il faut :

  1. Simuler la connexion avec une requête POST en envoyant l’email et le mot de passe.
  2. Gérer les cookies ou la session pour accéder aux pages protégées.

Comment gérer la pagination lors du web scraping avec Laravel ?

Pour gérer la navigation d’une page à l’autre avec Laravel, vous devez :

  1. Scraper la première page.
  2. Détecter le lien “page suivante” avec un sélecteur CSS.
  3. Boucler sur chaque lien jusqu’à la fin de la pagination.

Comment exporter les données scrapées (vers CSV, Excel, ou JSON) ?

Avec Laravel, vous pouvez utiliser :

  • fputcsv() pour le CSV.
  • la librairie Maatwebsite\Excel pour Excel.
  • La fonction native json_encode() pour générer un fichier JSON.

Comment gérer les erreurs et les exceptions pendant le scraping ?

Pour gérer les requêtes qui échouent avec Laravel, il faut :

  1. Encapsuler les requêtes dans un try/catch.
  2. Vérifier les codes d’état HTTP (404, 500, etc.). En cas d’erreur, les logger ou programmer un nouvel essai.

Le web scraping est-il légal ou illégal ?

La légalité du web scraping est un sujet complexe. Tout dépend du site ciblé et de l’usage des données.

📌 Le web scraping en France est souvent discuté dans le cadre du droit d’auteur et de la protection des bases de données.

💬 En bref, le web scraping avec Laravel est puissant et flexible, mais demande de bonnes pratiques pour rester efficace et légal. Dites-nous ce que vous en pensez dans les commentaires.

Vous avez trouvé cela utile ? Partagez-le avec un ami !


Alucare est un média indépendant et gratuit. Soutenez-nous en nous ajoutant à vos favoris Google News :

Publiez un commentaire sur le forum de discussion