Heim >Backend-Entwicklung >PHP-Tutorial >Bildkratzer mit dem Domcrawler von Symfony;
Ein meiner Fotografenfreund von mir hat mich gebeten, Bilder von Bildrahmen aus dem Internet zu finden und herunterzuladen. Ich landete schließlich auf einer Webseite, auf der eine Reihe von ihnen kostenlos zur Verfügung stand, aber es gab ein Problem: Ein Link zum Herunterladen aller Bilder war nicht vorhanden.
Ich wollte nicht den Stress durchgehen, die Bilder einzeln herunterzuladen. Deshalb habe ich diese PHP -Klasse geschrieben, um alle auf der Website gefundenen Bilder zu finden, herunterzuladen und zu reißeln.
Es sucht eine URL nach Bildern, Downloads und speichert die Bilder in einen Ordner, erstellt ein ZIP -Archiv des Ordners und löscht schließlich den Ordner.
Die Klasse verwendet die Domcrawler -Komponente von Symfony, um nach allen auf der Webseite gefundenen Bildlinks und einer benutzerdefinierten ZIP -Funktion zu suchen, die die ZIP -Datei erstellt. Kredit an David Walsh für die Postleitzahl.
Die Klasse besteht aus fünf privaten Eigenschaften und acht öffentlichen Methoden, einschließlich der __construct Magic -Methode.
unten finden Sie die Liste der Klasseneigenschaften und ihrer Rollen.
1. Ordner $: Speichert den Namen des Ordners, der die abgekratzten Bilder enthält.
2. $ URL: Speichert die Webseite URL.
3..
4. $ Dateiname: Speichert den Namen der ZIP -Datei.
5. $ Status: Speichert den Status des Betriebs. D.h., wenn es ein Erfolg oder Misserfolg war.
Beginnen wir mit dem Aufbau der Klasse.
Erstellen Sie die Klassenzipimagen, die die oben genannten fünf Eigenschaften enthalten.
<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>
Erstellen Sie eine __construct magische Methode, die eine URL als Argument akzeptiert.
Die Methode ist ziemlich selbsterklärend.
<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>
Das erstellte ZIP -Archiv verfügt über einen Ordner, der die abgekratzten Bilder enthält. Die nachstehende SetFolder -Methode konfiguriert dies.
standardmäßig wird der Ordnername auf Bilder gesetzt, aber die Methode bietet eine Option, um den Namen des Ordners zu ändern, indem einfach der Ordnername als Argument übergeben wird.
<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 bietet eine Option, um den Namen der ZIP -Datei mit einem Standardnamen auf Zipimages zu ändern:
<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>
Zu diesem Zeitpunkt instanziieren wir die Symfony -Crawler -Komponente, um nach Bildern zu suchen, und laden Sie alle Bilder in den Ordner herunter und speichern Sie sie.
<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>
Nachdem der Download abgeschlossen ist, komprimieren wir den Bildordner mit unserer Funktion Custom Create_zip in ein ZIP -Archiv.
<span>public function setFileName($name = "zipImages") { </span> <span>$this->fileName = $name; </span><span>}</span>
Schließlich löschen wir den erstellten Ordner, nachdem die ZIP -Datei erstellt wurde.
<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>
Erhalten Sie den Status der Operation. D.h., wenn es erfolgreich war oder ein Fehler aufgetreten ist.
<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>
alle oben genannten Methoden verarbeiten.
<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>
Sie können die vollständige Klasse von Github herunterladen.
Damit die Klasse funktioniert, müssen die Domcrawler -Komponente und die Funktion create_zip enthalten sein. Sie können den Code für diese Funktion hier herunterladen.
Laden und installieren Sie die Domcrawler -Komponente über den Komponisten einfach, indem Sie einfach die folgende Erforderungsanweisung zu Ihrer Composer.json -Datei hinzufügen:
<span>public function getStatus() { </span> <span>echo $this->status; </span><span>}</span>
$ PHP Composer.phar installieren, um die Bibliothek herunterzuladen und die Datei Anbieter/autoload.php Autoloader zu generieren.
<span>public function process() { </span> <span>$this->domCrawler(); </span> <span>$this->createZip(); </span> <span>$this->deleteCreatedFolder(); </span> <span>$this->getStatus(); </span><span>}</span>
In diesem Artikel haben wir gelernt, wie man einen einfachen PHP -Bildschaber erstellt, der automatisch heruntergeladene Bilder in ein ZIP -Archiv komprimiert. Wenn Sie alternative Lösungen oder Verbesserungsvorschläge haben, lassen Sie sie bitte in den Kommentaren unten, alle Feedback sind willkommen!
Wie installiere ich die Domcrawler -Komponente von Symfony? einfach. Sie können Composer verwenden, ein Abhängigkeitsmanagement -Tool für PHP. Führen Sie den folgenden Befehl in Ihrem Projektverzeichnis aus: Komponist benötigt Symfony/Dom-Crawler. Dadurch wird die Domcrawler -Komponente zusammen mit ihren Abhängigkeiten heruntergeladen und installiert.
$ crawler = new crawler ($ html);
$ crawler-> filter ('img')-> jeweils (Funktion (crawler $ node) {
echo $ node-> attr ('src');
}); Laravel?
Ja, Sie können die Domcrawler -Komponente von Symfony mit Laravel verwenden. Die HTTP -Testfunktionalität von Laravel verwendet tatsächlich die Domcrawler -Komponente unter der Haube. Dies bedeutet Wählen Sie Elemente, einschließlich Filter, FilterxPath und auswählen. Mit diesen Methoden können Sie Elemente basierend auf ihrem Tag -Namen, XPath -Ausdruck oder Linktext auswählen. Ändern Sie den Inhalt der Elemente mithilfe der Domcrawler -Komponente von Symfony. Mit jeder Methode können Sie jedes ausgewählte Element iterieren und Operationen darauf ausführen. Zum Beispiel können Sie das SRC-Attribut eines Bildelements wie folgt ändern:
}); Domcrawler-Komponente?
Das obige ist der detaillierte Inhalt vonBildkratzer mit dem Domcrawler von Symfony;. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!