Scraping web avec le langage de programmation PHP

Guides, Comment faire, Le scraping, 25 décembre 20245 minutes de lecture

Le web scraping est devenu un outil essentiel pour les développeurs et les analystes de données qui ont besoin d'extraire et d'analyser des informations du web. Qu'il s'agisse de suivre les prix des produits, de collecter des données à des fins de recherche ou de créer un tableau de bord personnalisé, le web scraping offre des possibilités infinies.

Si vous êtes un passionné de PHP, Goutte est une bibliothèque fantastique à considérer pour vos besoins en web scraping. Goutte est légère, conviviale et puissante, combinant les capacités du client HTTP Guzzle avec le DomCrawler de Symfony pour un scraping web fluide et efficace.

Ce guide vous présente les bases du web scraping en PHP avec Goutte - de l'installation et de votre premier script aux techniques avancées comme la gestion des formulaires et la pagination.

Pourquoi choisir Goutte pour le Web Scraping ?

Goutte a gagné en popularité parmi les développeurs pour un certain nombre de raisons, ce qui en fait l'une des bibliothèques de scraping les plus utilisées en PHP :

  • Une API simple et claire: Goutte fournit une interface propre et intuitive qui est facile à apprendre, même pour les débutants.
  • Intégration transparente: Il combine les requêtes HTTP avec l'analyse HTML, ce qui élimine la nécessité d'utiliser des bibliothèques distinctes.
  • Fonctionnalités puissantes : Goutte prend en charge des fonctionnalités avancées telles que la gestion des sessions, la gestion des cookies et la soumission de formulaires par programme.
  • Convivialité et robustesse: Des tâches de scraping les plus simples aux projets les plus complexes, il dispose de tout ce dont vous avez besoin pour démarrer.

Que vous soyez novice en PHP ou développeur chevronné, Goutte trouve un équilibre idéal entre simplicité et puissance.

Installation de la Goutte

Avant de se lancer dans le codage, il faut s'assurer que les conditions préalables nécessaires sont réunies :

  • PHP installé: Assurez-vous que PHP 7.3 ou une version plus récente est installé sur votre environnement de développement. Téléchargez PHP directement en utilisant ce lien.
  • Composer installé: Composer est nécessaire pour gérer les dépendances et installer Goutte.

Pour installer Goutte, il suffit de lancer la commande suivante dans votre terminal :

composer require fabpot/goutte

Une fois installée, vérifiez que la bibliothèque est accessible en exigeant l'autoloader de Composer dans votre projet :

requiert 'vendor/autoload.php';

Vous pouvez maintenant commencer à gratter !

Votre premier script de scraping Web avec Goutte

Commençons par un exemple simple. Nous allons récupérer le titre d'une page web en utilisant Goutte. Voici le script de base :

Récupérer et afficher le titre de la page

<?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";
});
?>

Sortie :

Titre de la page: Tous les produits | Livres à gratter - Bac à sable
5 premiers titres de livres:
- Une lumière dans le grenier
- Une lumière dans le grenier
- Soumission
- Sharp Objects
- Sapiens : Une brève histoire de l'humanité

C'est aussi simple que cela ! Avec seulement quelques lignes de code, vous pouvez récupérer et afficher les données du titrede n'importe quelle page web.

Extraction de données à partir de pages Web

Une fois que vous avez appris à récupérer une page web, l'étape suivante consiste à extraire des données spécifiques telles que des liens ou du contenu à partir d'éléments HTML spécifiques.

Extracting All Links (`<a>` Tags)

Le script suivant permet d'extraire le href les attributs de tous les <a> sur une page 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";
}

Cela renverra tous les liens hypertextes présents sur la page.

Extraction de contenu par classe ou par identifiant

Goutte facilite l'extraction ou l'analyse de données à partir de HTML à l'aide de classe ou ID sélecteurs. Pour cet exemple, nous utiliserons le sélecteur Livres pour le site web Scrape. Plus précisément, nous allons récupérer des informations sur chaque livre, étant donné qu'ils partagent tous la même classe, produit_pod. Voici comment il apparaît sur le site web :

Voici un exemple de la manière dont vous pouvez y parvenir en utilisant la 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";
}

Naviguer entre les pages

Voyons maintenant comment naviguer ou paginer entre les pages. Dans la page d'exemple que nous utilisons, il y a un bouton "Suivant" qui permet de passer à la page suivante. Nous allons exploiter ce bouton pour mettre en œuvre la pagination.

Tout d'abord, nous allons localiser le bouton à l'aide de sa fonction classe qui a pour valeur suivant . Dans cet élément, il y a un <a> contenant l'URL de la page suivante. En extrayant cette URL, nous pouvons l'utiliser pour envoyer une nouvelle requête et passer de manière transparente à la page suivante.Voici l'apparence et la structure HTML de la balise suivant sur la page.

Voici à quoi ressemble le code qui permet d'atteindre cet objectif :

<?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";
}

Cette approche vous permet d'automatiser la navigation entre les pages et de continuer à collecter des données.

Manipuler des formulaires avec Goutte

Goutte est également capable de gérer des formulaires. Pour démontrer cette fonctionnalité, nous allons utiliser ce site web, qui comporte un seul champ de saisie, comme le montre l'image ci-dessous :

Voici à quoi ressemble le code de soumission de ce formulaire :

<?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";
}

Ce script remplit un champ de formulaire nommé q avec la valeur scraping web et la soumet. À partir de là, vous pouvez extraire le contenu de la page de résultats de la recherche, comme dans les exemples précédents.

Gestion des erreurs et bonnes pratiques

Gestion des erreurs de réseau

Ajoutez toujours une gestion des erreurs pour gérer les situations inattendues telles qu'une connexion réseau défaillante ou des URL inexistantes.

<?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();
}
}

Respecter Robots.txt

Le "web scraping" doit toujours être pratiqué de manière éthique et responsable. Le fichier `robots .txt` est un simple fichier texte utilisé par les sites web pour communiquer avec les robots d'indexation, indiquant quelles parties du site peuvent ou ne peuvent pas être consultées. Avant de procéder au scraping, il est important de vérifier le fichier `robots.txt` pour s'assurer que vous suivez les règles du site et que vous respectez ses conditions. Ignorer ces directives peut entraîner des problèmes juridiques et éthiques, c'est pourquoi vous devez toujours faire de cette étape une priorité dans votre processus de scraping.

En savoir plus robots.txt ici.

Limitation du taux

Soyez courtois et évitez d'envoyer trop de demandes dans un court laps de temps, car cela peut submerger le serveur et perturber ses performances pour les autres utilisateurs. Une bonne pratique consiste à prévoir un court délai entre chaque requête afin de minimiser la charge du serveur et de s'assurer qu'il peut gérer le trafic de manière efficace. En prenant ces mesures, vous contribuez non seulement à maintenir la stabilité du serveur, mais vous faites également preuve d'une utilisation responsable et réfléchie des ressources partagées.

sleep(1) ; // Attendez 1 seconde entre les requêtes

Les pièges les plus fréquents

  • De nombreux sites web modernes s'appuient sur JavaScript pour charger le contenu, ce qui signifie que les outils de scraping traditionnels risquent de ne pas capturer toutes les données dont vous avez besoin. Des outils tels que Puppeteer ou Selenium peuvent simuler les interactions des utilisateurs et charger le contenu comme le ferait un navigateur.
  • Assurez-vous que les points d'extrémité HTTPS que vous scrapez présentent des certificats valides afin d'éviter les erreurs. Les certificats invalides ou expirés peuvent faire échouer votre scraper ou poser des problèmes de sécurité. Vérifiez toujours l'état du certificat avant de procéder au scrapping et envisagez d'utiliser des bibliothèques qui gèrent ces problèmes de manière transparente.

Conclusion

Le web scraping est un outil puissant pour collecter des données de manière efficace, mais il nécessite une approche responsable et réfléchie afin d'éviter les pièges les plus courants et de garantir une utilisation éthique. En adhérant aux meilleures pratiques, telles que le respect des conditions d'utilisation des sites web, la mise en place de délais appropriés entre les requêtes et l'utilisation d'outils capables de gérer des contenus dynamiques, vous pouvez créer un scraper efficace tout en minimisant l'impact sur les serveurs. En outre, la vérification des certificats HTTPS et la prise en compte des considérations de sécurité protégeront votre scraper et toutes les données qu'il recueille. Avec une planification et une exécution appropriées, le web scraping peut devenir une ressource inestimable pour la recherche, l'analyse et l'innovation.