Come si usa Laravel per il web scraping?

Autore :

Reagire :

Commento

Insieme a Laravel, puoi eseguire lo scraping di un sito web in tre passaggi: installare un pacchetto come Symfony DomCrawler via Composer, creare un ordine Artisan, quindi selezionare gli elementi HTML con selettori CSS.

Questa guida al web scraping ti spiega come procedere concretamente, utilizzando codice PHP pronto all’uso.

Interfaccia di codice Laravel con PHP per un progetto di web scraping
Laravel si avvale di PHP per offrire una struttura chiara e strumenti che semplificano il web scraping. ©Christina per Alucare.fr

Prerequisiti per lo scraping con Laravel

Laravel è un Struttura PHP progettato per le moderne applicazioni web. Il suo ricco ecosistema lo rende una base ideale per organizzare un progetto di scraping pulito e di facile manutenzione.

Prima di iniziare, assicurati di avere l'ambiente giusto:

  • Composer, il gestore delle dipendenze per installare i pacchetti.
  • Una versione recente di PHP compatibile con la tua versione di Laravel.
  • Laravel installato tramite composer create-project laravel/laravel il-mio-scraper.

Per quanto riguarda le competenze, bastano alcune nozioni di base per iniziare:

  • Conoscere i fondamenti di PHP e la struttura di un'applicazione Laravel (controllori, percorsi, architettura MVC).
  • Comprendere il HTML e il Selettori CSS per individuare con precisione gli elementi di una pagina.
  • Saper usare Composer da riga di comando per aggiungere un pacchetto al progetto.

Per quanto riguarda il crawling vero e proprio, ecco i strumenti di raschiatura i più utili:

  • Symfony DomCrawler + HttpClient : il duo di riferimento al giorno d’oggi. Scarica una pagina e naviga nel codice HTML grazie al metodo filter() da DomCrawler. Per inizializzare il client, devi utilizzare HttpClient::create() con le opzioni desiderate.
  • HTTP Client di Laravel : basato su Guzzle, recupera un contenuto semplice con Http::get() e gestisce bene le chiamate verso un API.
  • Puppeteer / Headless Chrome : un browser senza interfaccia, indispensabile per estrarre i dati dalle pagine che caricano i propri contenuti in JavaScript o tramite Ajax.

Tutorial per creare il vostro primo scraper con Laravel

Segui questi passaggi per creare un scraper funzionale insieme a Laravel. Installerai un pacchetto per lo scraping, genererai un comando Artisan, quindi filtrare i dati con i selettori CSS.

Passo 1: installazione e configurazione

Crea un nuovo progetto Laravel insieme a Composer, quindi aggiungi Goutte, un'integrazione pratica per lo scraping:

# 1) Creare un nuovo progetto Laravel
comporre creare-progetto laravel/laravel scraper-demo
cd scraper-demo

# 2) Aggiungere Goutte (integrazione di Laravel)
composer require weidner/goutte

I pacchetti weidner/goutte e fabpot/goutte sono oggi ufficialmente in disuso. Funzionano ancora, ma per un nuovo progetto si raccomanda la sostituzione da parte di Symfony è symfony/browser-kit, insieme a symfony/http-client e symfony/dom-crawler. Il codice riportato di seguito rimane valido se utilizzi weidner/goutte, che in sostanza riassume Goutte per Laravel.

Fase 2: Creare un ordine Artisan

Genera un comando che conterrà la tua logica di scraping con php artisan :

php artisan make:command ScrapeData

Il file viene creato qui : app/Console/Comandi/ScrapeData.php. È proprio in questa classe che ti occuperai di scrivere la richiesta HTTP e di estrarre i dati. La classe ScrapeData si estende Comando, e il metodo funzione pubblica handle() contiene tutta la logica di scraping.

Passo 3: scrivere il codice dello scraper

Nel comando generato, dovrai unire tre elementi fondamentali:

  • Una Richiesta HTTP per recuperare il contenuto HTML della pagina.
  • Delle Selettori CSS trasferiti al DomCrawler per selezionare i dati tramite filter().
  • Una anello per sfogliare gli elementi e visualizzare i risultati.

Ecco un esempio di codice completo per estrarre i titoli degli articoli da un blog:

info('Scraping: {$url}");

        // 1) Richiesta HTTP per recuperare l'HTML
 $crawler = Goutte::request("GET', $url);

        // 2) Utilizzo dei selettori CSS con DomCrawler
 $nodes = $crawler->filter('h2 a');

        // 3) Ciclo sugli elementi e visualizzazione
 $nodes->each(function (Crawler $node, $i) {
 $title = $node->text();
            $link  = $node->attr('href');
 $this->line(($i+1) . '. " . $title . " - " . $link);
 });

 return self::SUCCESS;
    }
}

Qui, DomCrawler si occupa di tutta l'analisi dell'HTML. Il metodo filter('h2 a') recupera ogni link presente in un titolo, quindi each() aggancia qui sopra per estrarre il testo e l'attributo href. A questo punto avvia lo scraper dal tuo terminale con php artisan scrape:data e vedrai i titoli apparire uno dopo l'altro. Puoi anche avviare php artisan serve per testare la tua applicazione in locale prima di implementarla.

Migliori pratiche per lo scraping del web con Laravel

Per eseguire lo scraping in modo corretto con Laravel, basta cambiare alcune abitudini per ottenere risultati molto diversi. Ecco le buone pratiche da seguire, sia che tu gestisca un bot per il web scraping oppure un ordine occasionale.

1. Gestione delle attività e delle code

Lo scraping può richiedere diversi secondi per pagina. Immagina di dover fare scraping 1000 pagine di un sito: la tua applicazione rimarrebbe bloccata e inutilizzabile per un bel po’ di tempo. La soluzione si riassume in due parole: i lavori e il code di Laravel.

  • UN lavoro, è un'operazione che vuoi eseguire in background.
  • Una coda (coda), è il luogo in cui vengono inseriti questi lavori per essere eseguiti uno dopo l'altro, senza bloccare il resto.

Ecco come incapsulare la logica di scraping in 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;
    }

    funzione pubblica handle(): void
    {
        $client = new Client();

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

        // Esempio semplice: estrarre tutti i dati <h1>
        $titoli = $crawler-&gt;filtro('h1')-&gt;each(function ($node) {
            return $node-&gt;text();
        });

        // Persistenza / registri / eventi...
        foreach ($titles as $title) {
            \Log::info("[Scraping] {$this-&gt;url} - H1: {$title}");
        }
    }
}
// app/Http/Controllers/ScraperController.php
onQueue('scraping'); // se vuoi una coda dedicata
 }

 return response()->json(['status' => 'Scraping avviato in background']);
    }
}

Per attivare questo controller, dichiara un strada nel tuo file strade/web.php Dove routes/api.php, ad esempio Route::get('/scrape', [ScraperController::class, 'start']). Puoi anche generare un controller dedicato con php artisan make:controller ScraperController.

Laravel offre diversi sistemi per gestire questa coda. I due più utilizzati sono:

  • File con database : i lavori vengono memorizzati come righe in una tabella SQL, per poi essere eseguiti uno alla volta da un worker.
  • Vai con Redis : i lavori vengono inseriti in memoria in una coda ultraveloce, ideale per un volume elevato di attività.

2. Automazione con il task scheduler di Laravel

Laravel integra un pianificatore delle attività (scheduler) che ti permette di automatizzare i tuoi scraper senza doverci pensare. Puoi così programmare l'esecuzione di un comando a intervalli regolari, ad esempio ogni ora.

Ecco come configurarlo in app/Console/Kernel.php :

command('scraper:run')->hourly();

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

 /**
 * Registrazione dei comandi.
     */
    protected function commands(): void
    {
 $this->load(__DIR__ . '/Commands');
    }
}

3. Bypassare la protezione anti-scraping

Molti siti adottano misure di protezione contro gli scraper. Per evitare di essere bloccati:

  • Modificare l'User-Agent : simula un vero browser al posto dell'intestazione predefinita del client HTTP.
  • Gestione delle scadenze : inserisce delle pause (sleep, throttle) tra le richieste, in modo da non sovraccaricare il server di destinazione.
  • Utilizzo di proxy : distribuisci le richieste su più indirizzi IP.

4. Rispettare il file robots.txt e il quadro normativo

Eludere una protezione non significa fare quello che ti pare. Lo scraping rimane soggetto a regole precise, e ignorarle potrebbe costarti caro.

  • Rispetta il file robots.txt : indica le pagine che il sito consente o vieta di scansionare. È la prima regola di cortesia da seguire.
  • Controlla le condizioni d'uso : un sito può vietare lo scraping tramite le proprie condizioni d'uso.
  • Tieni presente il GDPR : se raccogli dei dati personali, devi rispettare la normativa europea in materia di raccolta e trattamento dei dati.

Quali sono le alternative al web scraping con Laravel?

Laravel rimane un'ottima soluzione per integrare lo scraping in un'applicazione applicazione PHP esistente. Ma a seconda del tuo progetto, a volte altre soluzioni risultano più adatte. Ecco le due principali alternative, con i rispettivi vantaggi e limiti.

Il web scraping con Python

Pitone è il linguaggio più utilizzato per lo scraping. Si avvale di librerie consolidate come Scrapy e BeautifulSoup.

  • Vantaggi : ecosistema molto ricco, gestione nativa del crawling su larga scala, comunità enorme.
  • Svantaggi : bisogna uscire dall'ecosistema Laravel. Non è molto pratico se il tuo sito e la tua API funzionano già con PHP.

In pratica, scegli Python se lo scraping è il fulcro del progetto, non solo un semplice componente della tua applicazione.

Strumenti senza codice

Sono sempre più numerosi gli strumenti che consentono di effettuare lo scraping senza codifica, a volte con l’aiuto dell’IA. I più noti sono Dati luminosi, Octoparse e Apify.

  • Vantaggi : configurazione visiva, gestione integrata delle pagine in JavaScript e dei blocchi, nessuna riga di codice da scrivere.
  • Svantaggi : abbonamento a pagamento, controllo meno accurato rispetto a uno scraper fatto in casa con Laravel.

Interfaccia di Bright Data che mostra la raccolta di dati dal web senza scrivere codice.
Bright Data rimane una valida alternativa quando vuoi effettuare lo scraping senza dover gestire il codice. ©Christina per Alucare.fr

Domande frequenti

Come si esegue lo scraping di un sito web protetto da login con Laravel?

Il principio è semplice: si simula una connessione, poi si riutilizza la sessione per accedere alle pagine protette. In pratica, bisogna:

  1. Simulare la connessione con una richiesta POST che invia l'indirizzo e-mail e la password al modulo.
  2. Conserva i cookie di sessione affinché le richieste successive rimangano autenticate.

Con il HttpBrowser di Symfony, puoi eseguire le due fasi in modo molto ordinato. Crea un'istanza del client tramite HttpClient::create(), quindi gestisce automaticamente i cookie tra una richiesta e l'altra:

use Symfony\Component\BrowserKit\HttpBrowser;
use Symfony\Component\HttpClient\HttpClient;

$browser = new HttpBrowser(HttpClient::create());

$crawler = $browser->request('GET', 'https://exemple.com/login');
$form = $crawler->selectButton('Se connecter')->form();

$browser->submit($form, [
    'email'    => 'ton@email.com',
    'password' => 'ton_mot_de_passe',
]);

// Les cookies de session sont gardés automatiquement
$page = $browser->request('GET', 'https://exemple.com/compte');
echo $page->filter('h1')->text();

Nota bene: il HttpBrowser gestisce i cookie in modo autonomo tra una richiesta e l'altra. Non devi quindi salvare nulla manualmente.

Come si gestisce la paginazione durante il web scraping con Laravel?

Per sfogliare più pagine di seguito, basta individuare il link “pagina successiva” con un Selettore CSS, e poi continuare finché esiste. Ecco la logica:

  1. Scorrimento della prima pagina ed estrarre i dati utili.
  2. Rilevare il link “successivo” tramite un selettore CSS.
  3. Chiudere finché non ci saranno più pagine successive.
$url = 'https://exemple.com/blog?page=1';

while ($url) {
    $crawler = $browser->request('GET', $url);

    $crawler->filter('.article-title')->each(function ($node) {
        echo $node->text() . PHP_EOL;
    });

    // Récupère le lien "page suivante" s'il existe
    $next = $crawler->filter('a.next');
    $url  = $next->count() ? $next->attr('href') : null;
}

Questo ciclo si interrompe automaticamente non appena il selettore a.next non restituisce più alcun risultato.

Come si esportano i dati raccolti (in formato CSV, Excel o JSON)?

Una volta recuperati i tuoi dati, puoi esportarli in diversi formati con Laravel:

  • fputcsv() per generare un file CSV nativo.
  • La libreria Maatwebsite\Excel per creare un file Excel.
  • La funzione nativa json_encode() per un'esportazione JSON, utile se poi rendi accessibili i tuoi dati tramite un'API.

Come si gestiscono gli errori e le eccezioni durante lo scraping?

Un sito può restituire un errore, modificare la propria struttura HTML o interrompere la connessione. Per realizzare uno scraper affidabile, devi prevedere questi casi:

  1. Incapsulare ogni richiesta in un try/catch.
  2. Verificare i codici HTTP (404, 429, 500…) e registrare l'errore oppure riprovare dopo un certo intervallo di tempo.
try {
    $crawler = $browser->request('GET', $url);
    $status  = $browser->getResponse()->getStatusCode();

    if ($status !== 200) {
        \Log::warning("Réponse inattendue: $status sur $url");
    }
} catch (\Exception $e) {
    \Log::error('Scraping échoué: ' . $e->getMessage());
}

Il web scraping è legale o illegale?

Il legalità del web scraping dipende dal sito di destinazione e dall'uso che fai dei dati. Ecco i tre punti da tenere a mente:

  • Diritto sui generis sulle banche dati il direttiva europea 96/9/CE protegge il contenuto di un database. L'estrazione di una parte significativa di un sito può essere vietata.
  • Termini e condizioni d'uso : la sentenza Ryanair contro PR Aviation (CGUE, 2015) ha confermato che un sito può vietare lo scraping nelle proprie condizioni generali di utilizzo, anche in assenza di tutela del diritto d’autore.
  • RGPD : non appena raccogli dei dati personali (e-mail, nomi, profili), rientri nell'ambito di applicazione del regolamento europeo. Massima cautela.

In pratica, rispetta sempre il file robots.txt, limita la frequenza delle tue richieste ed evita di trattare dati personali senza una base giuridica. Hai una domanda o un caso particolare? Scrivilo nei commenti.

👍La vostra opinione
L'articolo è informativo
L'articolo è oggettivo
L'articolo risponde alla mia domanda
I contenuti sono aggiornati
🔍 Trovato qualche errore? Diteci dove!

Vi piace? Condividetelo!

Questo contenuto è originariamente in francese (Vedere l'editor appena sotto). È stato tradotto e corretto in varie lingue utilizzando Deepl e/o l'API di Google Translate per offrire aiuto al maggior numero possibile di Paesi. Questa traduzione ci costa diverse migliaia di euro al mese. Se non è 100 % perfetta, lasciateci un commento in modo da poterla correggere. Se sei interessato a correggere e migliorare la qualità degli articoli tradotti, inviaci un'e-mail tramite il modulo di contatto!
Apprezziamo il vostro feedback per migliorare i nostri contenuti. Se desiderate suggerire miglioramenti, utilizzate il nostro modulo di contatto o lasciate un commento qui sotto. I vostri commenti ci aiutano sempre a migliorare la qualità del nostro sito Alucare.fr


Alucare è un media indipendente. Sosteneteci aggiungendoci ai preferiti di Google News:

Pubblicare un commento sul forum di discussione