Maison >développement back-end >tutoriel php >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.
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.
La classe se compose de cinq propriétés privées et huit méthodes publiques, y compris la méthode magique __construct.
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.
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.
<span>public function process() { </span> <span>$this->domCrawler(); </span> <span>$this->createZip(); </span> <span>$this->deleteCreatedFolder(); </span> <span>$this->getStatus(); </span><span>}</span>
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!
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.
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.
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');
});
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.
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.
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');
});
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.
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.
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');
});
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!