Maison >développement back-end >tutoriel php >Stracage d'image avec Domcrawler de Symfony

Stracage d'image avec Domcrawler de Symfony

Jennifer Aniston
Jennifer Anistonoriginal
2025-02-21 08:47:11517parcourir

Stracage d'image avec Domcrawler de Symfony

Un de mes amis photographes m'a imploré de trouver et de télécharger des images de trames d'image sur Internet. J'ai finalement atterri sur une page Web qui avait un certain nombre d'entre elles disponibles gratuitement, mais il y avait un problème: un lien pour télécharger toutes les images ensemble n'était pas présent.

Je ne voulais pas passer par le stress du téléchargement des images individuellement, alors j'ai écrit cette classe PHP pour trouver, télécharger et zip toutes les images trouvées sur le site Web.

Les plats clés

  • La classe PHP utilise le composant Domcrawler de Symfony pour gratter les images d'une page Web, les télécharger et les enregistrer dans un dossier, créer une archive zip du dossier, puis supprimer le dossier. Cette classe est conçue pour automatiser le processus de téléchargement de plusieurs images à partir d'un site Web.
  • La classe comprend cinq propriétés privées et huit méthodes publiques. Les propriétés stockent des informations telles que le nom du dossier, l'URL de la page Web, le code de document HTML, le nom du fichier zip et l'état de l'opération. Les méthodes incluent des fonctions pour définir le nom du dossier et du fichier, instancier le Domcrawler, télécharger et enregistrer des images, créer un fichier zip, supprimer le dossier et obtenir l'état de l'opération.
  • Pour utiliser la classe, tous les fichiers requis doivent être inclus, via Autoload ou explicitement. Les méthodes SetFolder et SetFileName doivent être appelées avec leurs arguments respectifs, et la méthode de processus est ensuite appelée pour mettre la classe à fonctionner. Le composant Domcrawler et la fonction CREATE_ZIP doivent être inclus pour que la classe fonctionne.

comment fonctionne la classe

Il recherche une URL pour les images, télécharge et enregistre les images dans un dossier, crée une archive zip du dossier et supprime enfin le dossier.

La classe utilise le composant Domcrawler de Symfony pour rechercher tous les liens d'image trouvés sur la page Web et une fonction zip personnalisée qui crée le fichier zip. Crédit à David Walsh pour la fonction zip.

codage de la classe

La classe se compose de cinq propriétés privées et huit méthodes publiques, y compris la méthode magique __construct.

Stracage d'image avec Domcrawler de Symfony

Vous trouverez ci-dessous la liste des propriétés de classe et leurs rôles.
1. $ Dossier: stocke le nom du dossier qui contient les images grattées.
2. $ URL: stocke l'URL de la page Web.
3. $ HTML: stocke le code de document HTML de la page Web à gratter.
4. $ nom de fichier: stocke le nom du fichier zip.
5. $ Status: économise l'état de l'opération. C'est-à-dire s'il s'agissait d'un succès ou d'un échec.

Commençons à construire la classe.

Créez les zipimages de classe contenant les cinq propriétés ci-dessus.

<span><span><?php
</span></span><span><span>class ZipImages {
</span></span><span>    <span>private $folder;
</span></span><span>    <span>private $url;
</span></span><span>    <span>private $html;
</span></span><span>    <span>private $fileName;
</span></span><span>    <span>private $status;</span></span>

Créez une méthode magique __construct qui accepte une URL comme argument.
La méthode est assez explicite.

<span>public function __construct($url) {
</span>    <span>$this->url = $url; 
</span>    <span>$this->html = file_get_contents($this->url);
</span>    <span>$this->setFolder();
</span><span>}</span>

L'archive zip créée a un dossier qui contient les images grattées. La méthode setfolder ci-dessous configure ceci.

Par défaut, le nom du dossier est défini sur les images, mais la méthode fournit une option pour modifier le nom du dossier en passant simplement le nom du dossier comme argument.

<span><span><?php
</span></span><span><span>class ZipImages {
</span></span><span>    <span>private $folder;
</span></span><span>    <span>private $url;
</span></span><span>    <span>private $html;
</span></span><span>    <span>private $fileName;
</span></span><span>    <span>private $status;</span></span>

SetFileName fournit une option pour modifier le nom du fichier zip avec un nom par défaut défini sur les zipimages:

<span>public function __construct($url) {
</span>    <span>$this->url = $url; 
</span>    <span>$this->html = file_get_contents($this->url);
</span>    <span>$this->setFolder();
</span><span>}</span>

À ce stade, nous instancions le composant Crawler Symfony pour rechercher des images, puis téléchargez et enregistrez toutes les images dans le dossier.

<span>public function setFolder($folder="image") {
</span>    <span>// if folder doesn't exist, attempt to create one and store the folder name in property $folder
</span>    <span>if(!file_exists($folder)) {
</span>        <span>mkdir($folder);
</span>    <span>}
</span>    <span>$this->folder = $folder;
</span><span>}</span>

Une fois le téléchargement terminé, nous compressons le dossier d'image vers une archive zip à l'aide de notre fonction Create_zip personnalisée.

<span>public function setFileName($name = "zipImages") {
</span>    <span>$this->fileName = $name;
</span><span>}</span>

Enfin, nous supprimons le dossier créé après la création du fichier zip.

<span>public function domCrawler() {
</span>    <span>//instantiate the symfony DomCrawler Component
</span>    <span>$crawler = new Crawler($this->html);
</span>    <span>// create an array of all scrapped image links
</span>    <span>$result = $crawler
</span>        <span>->filterXpath('//img')
</span>        <span>->extract(array('src'));
</span>
<span>// download and save the image to the folder 
</span>    <span>foreach ($result as $image) {
</span>        <span>$path = $this->folder."/".basename($image);
</span>        <span>$file = file_get_contents($image);
</span>        <span>$insert = file_put_contents($path, $file);
</span>        <span>if (!$insert) {
</span>            <span>throw new <span>\Exception</span>('Failed to write image');
</span>        <span>}
</span>    <span>}
</span><span>}</span>

Obtenez l'état de l'opération. C'est-à-dire s'il a réussi ou si une erreur s'est produite.

<span>public function createZip() {
</span>    <span>$folderFiles = scandir($this->folder);
</span>    <span>if (!$folderFiles) {
</span>        <span>throw new <span>\Exception</span>('Failed to scan folder');
</span>    <span>}
</span>    <span>$fileArray = array();
</span>    <span>foreach($folderFiles as $file){
</span>        <span>if (($file != ".") && ($file != "..")) {
</span>            <span>$fileArray[] = $this->folder."/".$file;
</span>        <span>}
</span>    <span>}
</span>
    <span>if (create_zip($fileArray, $this->fileName.'.zip')) {
</span>        <span>$this->status = <span><span><<<HTML</span>
</span></span><span>File successfully archived. <a href="<span><span>$this->fileName</span>.zip">Download it now</a>
</span></span><span><span>HTML<span>;</span></span>
</span>    <span>} else {
</span>        <span>$this->status = "An error occurred";
</span>    <span>}
</span><span>}</span>

traiter toutes les méthodes ci-dessus.

<span>public function deleteCreatedFolder() {
</span>    <span>$dp = opendir($this->folder) or die ('ERROR: Cannot open directory');
</span>    <span>while ($file = readdir($dp)) {
</span>        <span>if ($file != '.' && $file != '..') {
</span>            <span>if (is_file("<span><span>$this->folder</span>/<span>$file</span>"</span>)) {
</span>                <span>unlink("<span><span>$this->folder</span>/<span>$file</span>"</span>);
</span>            <span>}
</span>        <span>}
</span>    <span>}
</span>    <span>rmdir($this->folder) or die ('could not delete folder');
</span><span>}</span>

Vous pouvez télécharger la classe complète de GitHub.

Dépendance des classes

Pour que la classe fonctionne, le composant Domcrawler et la fonction CREATE_ZIP doivent être inclus. Vous pouvez télécharger le code pour cette fonction ici.

Téléchargez et installez le composant Domcrawler via Composer simplement en ajoutant l'instruction exige suivante à votre fichier composer.json:

<span>public function getStatus() {
</span>    <span>echo $this->status;
</span><span>}</span>

Exécutez $ php composer.phar Installez pour télécharger la bibliothèque et générer le fichier Autoloader Vendor / Autoload.php.

en utilisant la classe

  • Assurez-vous que tous les fichiers requis sont inclus, via Autoload ou explicitement.
  • Appelez le Setfolder et SetFileName et transmettez leurs arguments respectifs. Appelez uniquement la méthode setfolder lorsque vous devez modifier le nom du dossier.
  • Appelez la méthode de processus pour mettre la classe au travail.
<span>public function process() {
</span>    <span>$this->domCrawler();
</span>    <span>$this->createZip();
</span>    <span>$this->deleteCreatedFolder();
</span>    <span>$this->getStatus();
</span><span>}</span>

Stracage d'image avec Domcrawler de Symfony

Résumé

Dans cet article, nous avons appris à créer un simple grattoir d'image PHP qui compresse automatiquement les images téléchargées dans une archive zip. Si vous avez d'autres solutions ou suggestions d'amélioration, veuillez les laisser dans les commentaires ci-dessous, tous les commentaires sont les bienvenus!

Questions fréquemment posées (FAQ) sur le grattage d'image avec Domcrawler de Symfony

Quel est le composant Domcrawler de Symfony?

Le composant Domcrawler de Symfony est un outil puissant qui permet aux développeurs de traverser et de manipuler les documents HTML et XML. Il fournit une API facile à utiliser et à comprendre, ce qui en fait un choix populaire pour les tâches de grattage Web. Le composant Domcrawler peut être utilisé pour sélectionner des éléments spécifiques sur une page, en extraire des données et même modifier leur contenu.

Comment installer le composant Domcrawler de Symfony?

L'installation du composant Domcrawler de Symfony est direct. Vous pouvez utiliser Composer, un outil de gestion des dépendances pour PHP. Exécutez la commande suivante dans votre répertoire de projet: Composer Exiger Symfony / Dom-Crawler. Cela téléchargera et installera le composant Domcrawler avec ses dépendances.

Comment utiliser le composant Domcrawler de Symfony pour gratter les images?

Pour gratter les images en utilisant le composant Domcrawler de Symfony, vous devez d'abord créer une nouvelle instance de la classe Crawler et charger le contenu HTML. Ensuite, vous pouvez utiliser la méthode du filtre pour sélectionner les éléments d'image et extraire leurs attributs SRC. Voici un exemple de base:

$ CRAWLER = NOUVEAU CRAWLER ($ HTML);
$ CRAWLER-> Filter ('IMG') -> Chaque (fonction (Crawler $ node) {
echo $ Node-> attr ('src');
});

puis-je utiliser le composant Domcrawler de Symfony avec Laravel?

Oui, vous pouvez utiliser le composant Domcrawler de Symfony avec Laravel. La fonctionnalité de test HTTP de Laravel utilise en fait le composant Domcrawler sous le capot. Cela signifie que vous pouvez utiliser les mêmes méthodes et techniques pour traverser et manipuler le contenu HTML dans vos tests Laravel.

Comment sélectionner les éléments en utilisant le composant Domcrawler de Symfony?

Le composant Domcrawler de Symfony fournit plusieurs méthodes pour Sélectionnez des éléments, y compris Filtre, filterXpath et SelectLink. Ces méthodes vous permettent de sélectionner des éléments en fonction de leur nom de balise, de leur expression XPath ou du texte de liaison, respectivement.

Puis-je modifier le contenu des éléments en utilisant le composant Domcrawler de Symfony?

Oui, vous pouvez Modifiez le contenu des éléments à l'aide du composant Domcrawler de Symfony. La méthode vous permet d'itérer sur chaque élément sélectionné et d'effectuer des opérations dessus. Par exemple, vous pouvez modifier l'attribut SRC d'un élément d'image comme celui-ci:

$ CRAWLER-> Filter ('IMG') -> Chaque (fonction (Crawler $ node) {
$ node-> att ('src', 'new-image.jpg');
});

comment gérer les erreurs et les exceptions lorsque vous utilisez Symfony Composant Domcrawler?

Lors de l'utilisation du composant Domcrawler de Symfony, des erreurs et des exceptions peuvent être manipulées à l'aide de blocs d'essai. Par exemple, si la méthode du filtre ne trouve aucun élément correspondant, il lancera une invalidargumentException. Vous pouvez assister à cette exception et le gérer de manière appropriée.

Puis-je utiliser le composant Domcrawler de Symfony pour gratter les sites Web qui nécessitent une authentification?

Oui, vous pouvez utiliser le composant Domcrawler de Symfony pour gratter les sites Web qui nécessitent une authentification. Cependant, cela nécessite des étapes supplémentaires, comme l'envoi d'une demande de poste avec les informations d'identification de connexion et le stockage du cookie de session.

Comment extraire les valeurs d'attribut à l'aide du composant Domcrawler de Symfony?

Vous pouvez extraire des attributs Valeurs utilisant la méthode ASTR fournie par le composant Domcrawler de Symfony. Par exemple, pour extraire l'attribut SRC d'un élément d'image, vous pouvez effectuer les éléments suivants:

$ CRAWLER-> Filter ('IMG') -> Chaque (fonction (Crawler $ node) {
echo $ node-> attr ('src');
});

Puis-je utiliser le composant Domcrawler de Symfony pour gratter le contenu chargé Ajax?

Malheureusement, le composant Domcrawler de Symfony ne peut pas gratter directement le contenu chargé Ajax car il n'exécute pas JavaScript. Cependant, vous pouvez utiliser des outils comme Guzzle et Goutte en combinaison avec le composant Domcrawler pour envoyer des demandes HTTP et gérer le contenu chargé de l'Ajax.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn