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.
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>
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 taches 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!

Outils d'IA chauds

Undress AI Tool
Images de déshabillage gratuites

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Clothoff.io
Dissolvant de vêtements AI

Video Face Swap
échangez les visages dans n'importe quelle vidéo sans effort grace à notre outil d'échange de visage AI entièrement gratuit?!

Article chaud

Outils chauds

Bloc-notes++7.3.1
éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Les problèmes et les solutions courants pour la portée de la variable PHP incluent: 1. La variable globale ne peut pas être accessible dans la fonction, et elle doit être transmise en utilisant le mot-clé ou le paramètre global; 2. La variable statique est déclarée avec statique, et elle n'est initialisée qu'une seule fois et la valeur est maintenue entre plusieurs appels; 3. Des variables hyperglobales telles que $ _get et $ _post peuvent être utilisées directement dans n'importe quelle portée, mais vous devez faire attention au filtrage s?r; 4. Les fonctions anonymes doivent introduire des variables de portée parents via le mot clé Utiliser, et lorsque vous modifiez les variables externes, vous devez passer une référence. La ma?trise de ces règles peut aider à éviter les erreurs et à améliorer la stabilité du code.

Pour gérer en toute sécurité les téléchargements de fichiers PHP, vous devez vérifier la source et taper, contr?ler le nom et le chemin du fichier, définir les restrictions du serveur et traiter les fichiers multimédias deux fois. 1. Vérifiez la source de téléchargement pour empêcher le CSRF via le jeton et détecter le type de mime réel via FINFO_FILE en utilisant le contr?le de liste blanche; 2. Renommez le fichier à une cha?ne aléatoire et déterminez l'extension pour la stocker dans un répertoire non Web en fonction du type de détection; 3. La configuration PHP limite la taille de téléchargement et le répertoire temporaire Nginx / Apache interdit l'accès au répertoire de téléchargement; 4. La bibliothèque GD résait les images pour effacer des données malveillantes potentielles.

Il existe trois méthodes courantes pour le code de commentaire PHP: 1. Utiliser // ou # pour bloquer une ligne de code, et il est recommandé d'utiliser //; 2. Utiliser /.../ pour envelopper des blocs de code avec plusieurs lignes, qui ne peuvent pas être imbriquées mais peuvent être croisées; 3. Compétences combinées Commentaires tels que l'utilisation / if () {} / pour contr?ler les blocs logiques, ou pour améliorer l'efficacité avec les touches de raccourci de l'éditeur, vous devez prêter attention aux symboles de fermeture et éviter les nidification lorsque vous les utilisez.

AgeneratorInphpisamemory-EfficientwaytoterateOrgedatasetsByyieldingValuesonEatatimeIntedofreturningThemallAtonce.1.GeneratorsUsEtheieldKeywordToproduceValuesondemand, ReducingMemoryUsage.2.TheyAreusefulForHandlingBigloops, ReadingLargeFiles, OR OR.

La clé pour rédiger des commentaires PHP est de clarifier l'objectif et les spécifications. Les commentaires devraient expliquer "pourquoi" plut?t que "ce qui a été fait", en évitant la redondance ou trop de simplicité. 1. Utilisez un format unifié, tel que DocBlock (/ * /) pour les descriptions de classe et de méthode afin d'améliorer la lisibilité et la compatibilité des outils; 2. Soulignez les raisons de la logique, telles que pourquoi les sauts JS doivent être sortis manuellement; 3. Ajoutez une description d'une vue d'ensemble avant le code complexe, décrivez le processus dans les étapes et aidez à comprendre l'idée globale; 4. Utilisez TODO et FIXME Rationalement pour marquer des éléments et des problèmes de taches pour faciliter le suivi et la collaboration ultérieurs. De bonnes annotations peuvent réduire les co?ts de communication et améliorer l'efficacité de la maintenance du code.

En PHP, vous pouvez utiliser des crochets ou des accolades bouclées pour obtenir des caractères d'index spécifiques à la cha?ne, mais les crochets sont recommandés; L'index commence à partir de 0 et l'accès à l'extérieur de la plage renvoie une valeur nulle et ne peut pas se voir attribuer une valeur; MB_substr est nécessaire pour gérer les caractères multi-octets. Par exemple: $ str = "Hello"; echo $ str [0]; sortie h; et les caractères chinois tels que MB_substr ($ str, 1,1) doivent obtenir le résultat correct; Dans les applications réelles, la longueur de la cha?ne doit être vérifiée avant le boucle, les cha?nes dynamiques doivent être vérifiées pour la validité et les projets multilingues recommandent d'utiliser des fonctions de sécurité multi-octets uniformément.

Toinstallphpquickly, usexAmpPonWindowsorHomebrewonMacos.1.onwindows, downloadAndInstallxAmppp, selectComponents, startapache et placefilesInhtdocs.2.

Toléarnphpeffective, startBySettingUpAlocalServerERironmentUsingToolsLILYXAMPPANDACODEDITERLIGHILLEVSCODE.1) INSTRUSITIONXAMPFORAPACHE, MYSQL, ANDPHP.2) USACODEDEDITORFORSYNTAXSUPPORT.3)
