Web scrapping avec le composant Symfony DomCrawler

Web scrapping avec le composant Symfony DomCrawler

Date de publication : 04/11/2025

Introduction

Le composant DomCrawler simplifie la navigation dans le DOM des fichiers HTML et XML.

Voyons cela de plus prêt à travers quelques exemples.

Quelques pré-requis

Installation de la lib

composer req symfony/dom-crawler

Créons le code qui permet de récupérer le contenu de la page distante et de construire l'instance du crawler :

require 'vendor/autoload.php';

use Symfony\Component\DomCrawler\Crawler;

//récupération de l'HTML de la page distante
$html = file_get_contents('https://d4v.dev');

//Instanciation du crawler et affectation de l'HTML
$crawler = new Crawler();
$crawler->addHtmlContent($html);

HTML

Une fois notre crawler instancié, nous pouvons l'utiliser pour parcourir les élements H3 de notre DOM par exemple :

$crawlContent = $crawler->filter('h3')->each(function (Crawler $node, $i) {
    return $node->text();
});

Le résultat est un tableau contenant les éléments demandés :

array:4 [
  0 => "Surveiller les files d’attente dans Laravel : Guide étape par étape"
  1 => "Plusieurs préfixes de table MYSQL avec Laravel"
  2 => "Introduction à Composer : Le Gestionnaire de Dépendances pour PHP"
  3 => "Web scrapping avec Python et BS4."
]

XML

Prenons l'exemple d'un feed RSS simple, celui d'un blog :

$feed = file_get_contents('https://freek.dev/feed');
$crawler->addXmlContent($feed);

$crawlFeedContent = $crawler->filter('entry > title')->each(function (Crawler $node, $i) {
    return $node->text();
});
array:20 [
  0 => "Architectural debt is not just technical debt"
  1 => "Deferred Queue Driver in Laravel 12.35"
  2 => "Building a procedurally...

Pour un flux plus avancé en terme d'organisation, les flux ATOM des chaînes Youtube avec namespaces, DomCrawler crée automatiquement un préfixe “default” en interne ce qui facilité grandement l'usage :

<feed
  xmlns:yt="http://www.youtube.com/xml/schemas/2015"
  xmlns:media="http://search.yahoo.com/mrss/"
  xmlns="http://www.w3.org/2005/Atom">

Ce qui change du code précédent est la syntaxe de l'argument de la méthode filter : default|entry media|group media|title qui permet de récupérer le contenu des éléments suivants en traversant et itérant :

<feed xmlns:yt="http://www.youtube.com/xml/schemas/2015" xmlns:media="http://search.yahoo.com/mrss/" xmlns="http://www.w3.org/2005/Atom">
        ...
        <entry>
        ...
            <media:group>
			  	<media:title>...</media:title>
feed = file_get_contents('https://www.youtube.com/feeds/videos.xml?channel_id=UCwI-JbGNsojunnHbFAc0M4Q');

$crawler->addXmlContent($feed);

$crawlFeedContent = $crawler->filter('default|entry media|group media|title')->each(function (Crawler $node, $i) {
    return $node->text();
});

etc.

Ces exemples sont simplistes en vue d'aborder le sujet et cet article n'a pas vocation à remplacer la doc.

J'espère que cela vous a donné envie de tester le composant, pour ma part je vais l'utilser sur mon lecteur RSS en remplacement de simpleXML.

Vos commentaires
Aucun commentaire