Scraping del web con il linguaggio di programmazione PHP

Guide, Come fare, Scraping, 25-dicembre-20245 minuti di lettura

Il web scraping è diventato uno strumento essenziale per gli sviluppatori e gli analisti di dati che devono estrarre e analizzare informazioni dal web. Che si tratti di monitorare i prezzi dei prodotti, di raccogliere dati per la ricerca o di costruire una dashboard personalizzata, il web scraping offre infinite possibilità.

Se siete appassionati di PHP, Goutte è una libreria fantastica da considerare per le vostre esigenze di scraping del web. Goutte è leggera, facile da usare e potente, combinando le capacità del client HTTP di Guzzle con DomCrawler di Symfony per uno scraping del web fluido ed efficiente.

Questa guida vi accompagnerà attraverso le basi del web scraping con PHP utilizzando Goutte, dall'installazione e il primo script alle tecniche avanzate come la gestione dei moduli e la paginazione.

Perché scegliere Goutte per il Web Scraping?

Goutte ha guadagnato popolarità tra gli sviluppatori per una serie di motivi, rendendola una delle librerie di scraping più utilizzate per PHP:

  • API semplice e pulita: Goutte offre un'interfaccia pulita e intuitiva, facile da imparare anche per i principianti.
  • Integrazione perfetta: Combina le richieste HTTP con l'analisi dell'HTML, eliminando la necessità di librerie separate.
  • Caratteristiche potenti: Goutte supporta funzionalità avanzate come la gestione delle sessioni, la gestione dei cookie e l'invio programmatico dei moduli.
  • Facile da usare per i principianti, ma robusto: Dalle attività di scraping più semplici ai progetti più complessi, ha tutto ciò che serve per iniziare.

Sia che siate alle prime armi con il PHP sia che siate sviluppatori esperti, Goutte rappresenta un equilibrio ideale tra semplicità e potenza.

Installazione di Goutte

Prima di lanciarsi nella codifica, assicuratevi che siano presenti i prerequisiti necessari:

  • PHP installato: Assicurarsi di avere installato PHP 7.3 o superiore nel proprio ambiente di sviluppo. Scaricare direttamente PHP utilizzando questo link.
  • Composer installato: Composer è necessario per gestire le dipendenze e installare Goutte.

Per installare Goutte, basta eseguire il seguente comando nel terminale:

compositore richiede fabpot/goutte

Una volta installata, verificare che la libreria sia accessibile richiedendo l'autoloader di Composer nel progetto:

richiedere 'vendor/autoload.php';

Ora siete pronti per iniziare a raschiare!

Il vostro primo script di scraping web con Goutte

Cominciamo con un semplice esempio. Scaveremo il titolo di una pagina web utilizzando Goutte. Di seguito è riportato lo script di base:

Recuperare e visualizzare il titolo della pagina

<?php
require 'vendor/autoload.php';

use Goutte\Client;

// Initialize Goutte Client
$client = new Client();

// Send a GET request to the target URL
$crawler = $client->request('GET', 'https://books.toscrape.com/');

// Extract the title of the page
$title = $crawler->filter('title')->text();
echo "Page Title: $title\n";

// Extract the titles of the first 5 books
echo "First 5 Book Titles:\n";
$crawler->filter('.product_pod h3 a')->slice(0, 5)->each(function ($node) {
    echo "- " . $node->attr('title') . "\n";
});
?>

Uscita:

Titolo della pagina: Tutti i prodotti | Libri da scartare - Sandbox
Primi 5 titoli di libri:
- Una luce in soffitta
- Il velluto che cola
- Soumission
- Oggetti taglienti
- Sapiens: Breve storia dell'umanità

È semplicissimo! Con poche righe di codice, è possibile richiamare e visualizzare i dati di titolodi qualsiasi pagina web.

Estrazione dei dati dalle pagine web

Una volta appreso come recuperare una pagina web, il passo successivo è l'estrazione di dati specifici, come link o contenuti, da elementi HTML specifici.

Extracting All Links (`<a>` Tags)

Il seguente script estrae il file href di tutti gli attributi <a> su una pagina web:

<?php
require 'vendor/autoload.php';

use Goutte\Client;

$client = new Client();
$crawler = $client->request('GET', 'https://books.toscrape.com/');

// Extract all <a> tags
$links = $crawler->filter('a')->each(function ($node) {
    return $node->attr('href');
});

// Print all extracted links
foreach ($links as $link) {
    echo $link . "\n";
}

Questo restituirà tutti i collegamenti ipertestuali presenti nella pagina.

Estrazione del contenuto per classe o ID

Goutte semplifica l'estrazione o il parsing dei dati da HTML utilizzando classe o ID selettori. Per questo esempio, utilizzeremo il selettore Libri da raschiare. In particolare, si cercheranno informazioni su ogni libro, poiché tutti condividono la stessa classe, prodotto_pod. Ecco come appare sul sito web:

Ecco un esempio di come si può ottenere questo risultato utilizzando Goutte:

<?php
require 'vendor/autoload.php';

use Goutte\Client;

$client = new Client();
$crawler = $client->request('GET', 'https://books.toscrape.com/');

// Extract all <a> tags
$links = $crawler->filter('a')->each(function ($node) {
    return $node->attr('href');
});

// Print all extracted links
foreach ($links as $link) {
    echo $link . "\n";
}

// Extract elements with class 'product_pod'
$products = $crawler->filter('.product_pod')->each(function ($node) {
    return $node->text();
});

// Print all extracted product details
foreach ($products as $product) {
    echo $product . "\n";
}

Navigazione tra le pagine

Esaminiamo ora come navigare o impaginare tra le pagine. Nella pagina di esempio che stiamo utilizzando, c'è un pulsante "Next" che consente la paginazione alla pagina successiva. Sfrutteremo questo pulsante per implementare la paginazione.

Per prima cosa, localizzeremo il pulsante utilizzando il suo classe che ha come valore prossimo . All'interno di questo elemento, c'è un <a> contenente l'URL della pagina successiva. Estraendo questo URL, possiamo usarlo per inviare una nuova richiesta e passare senza problemi alla pagina successiva.Ecco l'aspetto e la struttura HTML del tag prossimo sulla pagina.

Ecco come si presenta il codice per ottenere questo risultato:

<?php
require 'vendor/autoload.php';

use Goutte\Client;

$client = new Client();
$crawler = $client->request('GET', 'https://books.toscrape.com/');

// Handle pagination using the 'next' button
while ($crawler->filter('li.next a')->count() > 0) {
    $nextLink = $crawler->filter('li.next a')->attr('href');
    $crawler = $client->request('GET', 'https://books.toscrape.com/catalogue/' . $nextLink);
    
    // Extract and print the current page URL
    echo "Currently on: " . $crawler->getUri() . "\n";
}

Con questo approccio, è possibile automatizzare la navigazione tra le pagine e continuare lo scraping dei dati.

Gestione dei moduli con Goutte

Goutte è anche in grado di gestire i moduli. Per dimostrare questa funzionalità, utilizzeremo questo sito web, che presenta un singolo campo di input, come mostrato nell'immagine seguente:

Ecco come si presenta il codice per l'invio di questo modulo:

<?php
require 'vendor/autoload.php';

use Goutte\Client;

$client = new Client();
$crawler = $client->request('GET', 'https://www.scrapethissite.com/pages/forms/');

// Submit the search form with a query
$form = $crawler->selectButton('Search')->form();
$form['q'] = 'Canada';

$crawler = $client->submit($form);

// Extract and print the results
$results = $crawler->filter('.team')->each(function ($node) {
    return $node->text();
});

foreach ($results as $result) {
    echo $result . "\n";
}

Questo script compila un campo del modulo chiamato q con il valore scraping del web e inviarlo. Da qui è possibile estrarre il contenuto dalla pagina dei risultati della ricerca, proprio come negli esempi precedenti.

Gestione degli errori e buone pratiche

Gestione degli errori di rete

Aggiungete sempre una gestione degli errori per gestire situazioni impreviste, come una connessione di rete fallita o URL inesistenti.

<?php
require 'vendor/autoload.php';

use Goutte\Client;

$client = new Client();

try {
    $crawler = $client->request('GET', 'https://invalid-url-example.com');
    echo "Page title: " . $crawler->filter('title')->text();
} catch (Exception $e) {
    echo "An error occurred: " . $e->getMessage();
}
}

Rispetto di Robots.txt

Il web scraping deve sempre essere eseguito in modo etico e responsabile. Il file `robots.txt` è un semplice file di testo utilizzato dai siti web per comunicare con i web crawler, indicando quali parti del sito possono o non possono essere accessibili. Prima di effettuare lo scraping, è importante controllare il file `robots.txt` per assicurarsi di seguire le regole del sito e rispettarne i termini. Ignorare queste linee guida può portare a problemi legali ed etici, quindi fate sempre di questa fase una priorità nel vostro processo di scraping.

Per saperne di più robots.txt qui.

Limitazione della velocità

Siate cortesi ed evitate di inviare un numero eccessivo di richieste in un breve periodo di tempo, in quanto ciò potrebbe sovraccaricare il server e compromettere le prestazioni per gli altri utenti. È buona norma prevedere un breve intervallo di tempo tra una richiesta e l'altra per ridurre al minimo il carico sul server e garantire che possa gestire il traffico in modo efficiente. L'adozione di queste misure non solo contribuisce a mantenere la stabilità del server, ma dimostra anche un uso responsabile e attento delle risorse condivise.

sleep(1); // Attendere 1 secondo tra una richiesta e l'altra

Le insidie più comuni

  • Molti siti web moderni si affidano a JavaScript per caricare i contenuti, il che significa che gli strumenti di scraping tradizionali potrebbero non catturare tutti i dati necessari. Strumenti come Puppeteer o Selenium possono simulare le interazioni degli utenti e caricare i contenuti come farebbe un browser.
  • Per evitare errori, assicurarsi che gli endpoint HTTPS di cui si effettua lo scraping presentino certificati validi. I certificati non validi o scaduti possono causare il fallimento dello scraper o sollevare problemi di sicurezza. Verificate sempre lo stato dei certificati prima di eseguire lo scraping e prendete in considerazione l'utilizzo di librerie che gestiscano questi problemi senza problemi.

Conclusione

Il web scraping è uno strumento potente per raccogliere dati in modo efficiente, ma richiede un approccio responsabile e ponderato per evitare le insidie più comuni e garantire un uso etico. Aderire alle migliori pratiche, come il rispetto dei termini di servizio dei siti web, l'implementazione di ritardi appropriati tra le richieste e l'utilizzo di strumenti in grado di gestire contenuti dinamici, consente di creare uno scraper che funzioni in modo efficace riducendo al minimo l'impatto sui server. Inoltre, la verifica dei certificati HTTPS e le considerazioni sulla sicurezza proteggeranno il vostro scraper e i dati che raccoglie. Con una pianificazione e un'esecuzione adeguate, lo scraping del web può diventare una risorsa inestimabile per la ricerca, l'analisi e l'innovazione.