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.