d4v / dev blog
/ PHP

Web scrapping avec le composant Symfony DomCrawler

Web scrapping avec le composant Symfony DomCrawler

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.

Commentaires

Aucun commentaire pour le moment. Lancez la discussion !