Heim >Backend-Entwicklung >PHP-Tutorial >Bildkratzer mit dem Domcrawler von Symfony;

Bildkratzer mit dem Domcrawler von Symfony;

Jennifer Aniston
Jennifer AnistonOriginal
2025-02-21 08:47:11516Durchsuche

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.

Key Takeaways

  • Die PHP -Klasse verwendet die Domcrawler -Komponente von Symfony, um Bilder von einer Webseite zu kratzen, herunterzuladen und in einen Ordner zu speichern, ein ZIP -Archiv des Ordners zu erstellen und dann den Ordner zu löschen. Diese Klasse wurde entwickelt, um das Herunterladen mehrerer Bilder von einer Website zu automatisieren.
  • Die Klasse enthält fünf private Eigenschaften und acht öffentliche Methoden. Die Eigenschaften speichern Informationen wie Ordnername, Webseiten -URL, HTML -Dokumentcode, ZIP -Dateiname und Betriebsstatus. Die Methoden enthalten Funktionen zum Festlegen des Ordners und des Dateinamens, zum Sofortieren des Domcrawlers, zum Herunterladen und Speichern von Bildern, erstellen Sie eine ZIP -Datei, löschen Sie den Ordner und erhalten Sie den Betriebsstatus.
  • Um die Klasse zu verwenden, müssen alle erforderlichen Dateien entweder über Autoload oder explizit enthalten sein. Die Setfolder- und SetFileName -Methoden sollten mit ihren jeweiligen Argumenten aufgerufen werden, und die Prozessmethode wird dann aufgerufen, um die Klasse in die Arbeit zu bringen. Die Domcrawler -Komponente und die Funktion create_zip müssen für die Funktion der Klasse enthalten sein.

Wie die Klasse funktioniert

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.

codieren die Klasse

Die Klasse besteht aus fünf privaten Eigenschaften und acht öffentlichen Methoden, einschließlich der __construct Magic -Methode.

Bildkratzer mit dem Domcrawler von Symfony;

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.

Klassenabhängigkeit

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.

Verwenden der Klasse

  • Stellen Sie sicher, dass alle erforderlichen Dateien über autolad oder explizit enthalten sind.
  • rufen Sie die Methode Setfolder und SetFileName auf und geben Sie ihre jeweiligen Argumente ein. Rufen Sie nur die SetFolder -Methode auf, wenn Sie den Ordnernamen ändern müssen.
  • rufen Sie die Prozessmethode auf, um die Klasse für die Arbeit zu setzen.
<span>public function process() {
</span>    <span>$this->domCrawler();
</span>    <span>$this->createZip();
</span>    <span>$this->deleteCreatedFolder();
</span>    <span>$this->getStatus();
</span><span>}</span>

Bildkratzer mit dem Domcrawler von Symfony;

Zusammenfassung

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!

häufig gestellte Fragen (FAQs) zum Abkratzen von Symfonys Domcrawler

Was ist die Domcrawler -Komponente von Symfony? Es bietet eine API, die einfach zu bedienen und zu verstehen ist, was es zu einer beliebten Wahl für Web -Scraping -Aufgaben macht. Die Domcrawler -Komponente kann verwendet werden, um bestimmte Elemente auf einer Seite auszuwählen, Daten aus ihnen zu extrahieren und ihren Inhalt sogar zu ändern.

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.

Wie verwende ich die Domcrawler -Komponente von Symfony, um Bilder zu kratzen? Anschließend können Sie die Filtermethode verwenden, um die Bildelemente auszuwählen und ihre SRC -Attribute zu extrahieren. Hier ist ein grundlegendes Beispiel:

$ 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:

$ crawler-> filter ('img')-> jeweils (Funktion (Crawler $ node) {

$ node-> attr ('src', 'new-image.jpg');

}); Domcrawler-Komponente?

Wenn die Domcrawler-Komponente von Symfony verwendet wird, können Fehler und Ausnahmen mit Try-Catch-Blöcken behandelt werden. Wenn die Filtermethode beispielsweise keine übereinstimmenden Elemente findet, wird eine InvalidArgumentException ausgelöst. Sie können diese Ausnahme anpassen und angemessen umgehen. Dies erfordert jedoch zusätzliche Schritte, z. B. das Senden einer Postanforderung mit den Anmeldeinformationen und Speichern des Sitzungs -Cookies. Werte unter Verwendung der ATT -Methode der Domcrawler -Komponente von Symfony. Um das SRC-Attribut eines Bildelements beispielsweise zu extrahieren $ node-> attr ('src');

});

Kann ich die Domcrawler-Komponente von Symfony verwenden, um Ajax-beladene Inhalte zu kratzen? Sie können jedoch Tools wie Guzzle und Goutte in Kombination mit der Domcrawler-Komponente verwenden, um HTTP-Anforderungen zu senden und AJAX-beladene Inhalte zu verarbeiten.

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn