私の写真家の友人は、インターネットから額縁の画像を見つけてダウンロードするように私を懇願しました。私は最終的に、それらの多くが無料で利用できるWebページに着地しましたが、問題がありました。すべての画像を一緒にダウンロードするためのリンクは存在しませんでした。
画像を個別にダウンロードするストレスを経験したくなかったので、このPHPクラスを書き、Webサイトで見つかったすべての画像を見つけ、ダウンロードし、zipしました。
キーテイクアウトクラスは、5つの私有地と__ Construct Magicメソッドを含む8つのパブリックメソッドで構成されています。
2。$ URL:WebページURLを保存します。
3。$ HTML:WebページのHTMLドキュメントコードを削減するために保存します。
4。$ filename:zipファイルの名前を保存します。
5。$ステータス:操作のステータスを保存します。つまり、それが成功または失敗であった場合。
クラスの構築を始めましょう。
上記の5つのプロパティを含むクラスのzipimagesを作成します。
URLを引数として受け入れる__construct Magicメソッドを作成します。
作成されたZIPアーカイブには、削り取られた画像を含むフォルダーがあります。以下のSetFolderメソッドはこれを構成します
デフォルトでは、フォルダー名は画像に設定されていますが、メソッドは、フォルダー名を引数として単に渡すだけで、フォルダーの名前を変更するオプションを提供します。
<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は、zipimagesに設定されたデフォルトの名前を使用してzipファイルの名前を変更するオプションを提供します。
この時点で、Symfony Crawlerコンポーネントをインスタンス化して画像を検索し、すべての画像をフォルダーにダウンロードして保存します。<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>
ダウンロードが完了したら、カスタムcreate_zip関数を使用して画像フォルダーをzipアーカイブに圧縮します。
<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>
最後に、ZIPファイルが作成された後に作成されたフォルダーを削除します。
<span>public function setFileName($name = "zipImages") { </span> <span>$this->fileName = $name; </span><span>}</span>
上記のすべてのメソッドを処理します。
<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>
githubから完全なクラスをダウンロードできます。
<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>
クラス依存関係
クラスが機能するには、domcrawlerコンポーネントとcreate_zip関数を含める必要があります。この関数のコードをこちらからダウンロードできます。<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>
次の要求ステートメントをComposer.jsonに追加するだけで、Composerを介してDomcrawlerコンポーネントをダウンロードしてインストールします。
<span>public function getStatus() { </span> <span>echo $this->status; </span><span>}</span>
$ crawler-> filter( 'img') - >それぞれ(function(crawler $ node){
echo $ node-> attr( 'src');
});
symfonyのdomcrawlerコンポーネントを使用できますかlaravel?
symfonyを使用するときにエラーと例外を処理するにはどうすればよいですかdomcrawlerコンポーネント? }); 残念ながら、SymfonyのDomcrawlerコンポーネントは、JavaScriptを実行しないため、Ajaxにロードされたコンテンツを直接スクレイすることはできません。ただし、GuzzleやGoutteなどのツールをDomcrawlerコンポーネントと組み合わせて使用して、HTTPリクエストを送信し、Ajax-Loadedコンテンツを処理できます。$ crawler-> filter( 'img') - >それぞれ(function(crawler $ node){
echo $ node-> attr( 'src'); SymfonyのDomcrawlerコンポーネントを使用してAjaxロードのコンテンツをスクレイプできますか?
以上がSymfony&#x27; s Domcrawlerでの画像削りの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。