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.

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 utilizzareHttpClient::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->request('GET', $this->url);
// Esempio semplice: estrarre tutti i dati <h1>
$titoli = $crawler->filtro('h1')->each(function ($node) {
return $node->text();
});
// Persistenza / registri / eventi...
foreach ($titles as $title) {
\Log::info("[Scraping] {$this->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.

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:
- Simulare la connessione con una richiesta POST che invia l'indirizzo e-mail e la password al modulo.
- 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:
- Scorrimento della prima pagina ed estrarre i dati utili.
- Rilevare il link “successivo” tramite un selettore CSS.
- 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\Excelper 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:
- Incapsulare ogni richiesta in un
try/catch. - 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.





