Saya tidak mahu melalui tekanan memuat turun imej secara individu, jadi saya menulis kelas PHP ini untuk mencari, memuat turun dan zip semua imej yang terdapat di laman web.
Takeaways Key
Kelas menggunakan komponen Domcrawler Symfony untuk mencari semua pautan imej yang terdapat di laman web dan fungsi zip tersuai yang membuat fail zip. Kredit kepada David Walsh untuk fungsi zip.
pengekodan kelas
di bawah adalah senarai sifat kelas dan peranan mereka.
2. $ Url: Menyimpan URL halaman web.
3. $ HTML: Menyimpan kod dokumen HTML laman web yang akan dikikis.
4. $ FileName: Menyimpan nama fail zip.
5. Status $: Menjimatkan status operasi. I.e jika kejayaan atau kegagalan.
mari kita mulakan membina kelas.
Buat zipimages kelas yang mengandungi lima sifat di atas.
Buat kaedah sihir __construct yang menerima URL sebagai hujah.
<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>
<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>
Secara lalai, nama folder ditetapkan ke imej tetapi kaedah menyediakan pilihan untuk menukar nama folder dengan hanya lulus nama folder sebagai hujahnya.
<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 menyediakan pilihan untuk menukar nama fail zip dengan nama lalai yang ditetapkan ke 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>
Pada ketika ini, kami memberi contoh komponen perayap Symfony untuk mencari imej, kemudian muat turun dan simpan semua imej ke dalam folder.
<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>
Selepas muat turun selesai, kami memampatkan folder imej ke arkib zip menggunakan fungsi create_zip tersuai kami.
<span>public function setFileName($name = "zipImages") { </span> <span>$this->fileName = $name; </span><span>}</span>
Akhir sekali, kami memadam folder yang dibuat selepas fail zip telah dibuat.
<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>
Dapatkan status operasi. I.e jika berjaya atau ralat berlaku.
<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>
Proses semua kaedah di atas.
<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>
anda boleh memuat turun kelas penuh dari github.
Muat turun dan pasang komponen Domcrawler melalui komposer hanya dengan menambahkan pernyataan berikut yang memerlukan ke fail komposer.json anda:
<span>public function getStatus() { </span> <span>echo $this->status; </span><span>}</span>
menggunakan kelas
<span>public function process() { </span> <span>$this->domCrawler(); </span> <span>$this->createZip(); </span> <span>$this->deleteCreatedFolder(); </span> <span>$this->getStatus(); </span><span>}</span>
Ringkasan
Soalan Lazim (Soalan Lazim) Mengenai Imej Mengikis dengan Symfony's Domcrawler
$ crawler = crawler baru ($ html);
$ crawler-> filter ('img')-> setiap (fungsi (crawler $ node) {
echo $ node-> attr ('src'); Ya, anda boleh menggunakan komponen Domcrawler Symfony dengan Laravel. Fungsi ujian HTTP Laravel sebenarnya menggunakan komponen Domcrawler di bawah tudung. Ini bermakna anda boleh menggunakan kaedah dan teknik yang sama untuk melintasi dan memanipulasi kandungan HTML dalam ujian laravel anda. Pilih Elemen, termasuk Filter, FilterXPath, dan SelectLink. Kaedah ini membolehkan anda memilih elemen berdasarkan nama tag mereka, ekspresi xpath, atau teks pautan. Ubah suai kandungan elemen menggunakan komponen Domcrawler Symfony. Kaedah setiap membolehkan anda melelehkan setiap elemen yang dipilih dan melaksanakan operasi di atasnya. Sebagai contoh, anda boleh menukar atribut src elemen imej seperti ini:
$ crawler-> filter ('img')-> setiap (fungsi (crawler $ node) {
$ crawler-> filter ('img')-> setiap (fungsi (crawler $ node) {
Atas ialah kandungan terperinci Imej mengikis dengan symfony ' s domcrawler. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!