ホームページ > バックエンド開発 > PHPチュートリアル > Symfony' s Domcrawlerでの画像削り

Symfony' s Domcrawlerでの画像削り

Jennifer Aniston
リリース: 2025-02-21 08:47:11
オリジナル
512 人が閲覧しました

Symfony' s Domcrawlerでの画像削り

私の写真家の友人は、インターネットから額縁の画像を見つけてダウンロードするように私を懇願しました。私は最終的に、それらの多くが無料で利用できるWebページに着地しましたが、問題がありました。すべての画像を一緒にダウンロードするためのリンクは存在しませんでした。

画像を個別にダウンロードするストレスを経験したくなかったので、このPHPクラスを書き、Webサイトで見つかったすべての画像を見つけ、ダウンロードし、zipしました。

キーテイクアウト

    PHPクラスでは、SymfonyのDomcrawlerコンポーネントを使用して、Webページから画像をスクレイプし、フォルダーにダウンロードして保存し、フォルダーのzipアーカイブを作成し、フォルダーを削除します。このクラスは、Webサイトから複数の画像をダウンロードするプロセスを自動化するように設計されています。
  • クラスには、5つの私有地と8つのパブリックメソッドが含まれています。プロパティは、フォルダー名、WebページURL、HTMLドキュメントコード、ZIPファイル名、操作ステータスなどの情報を保存します。メソッドには、フォルダーとファイル名を設定し、domcrawlerをインスタンス化し、画像をダウンロードして保存し、zipファイルを作成し、フォルダーを削除し、操作ステータスを取得する機能が含まれます。
  • クラスを使用するには、すべての必要なファイルをAutoloadまたは明示的に含める必要があります。 SetFolderおよびSetFileNameメソッドは、それぞれの引数を使用して呼び出され、プロセスメソッドが呼び出され、クラスを機能させる必要があります。 domcrawlerコンポーネントとcreate_zip関数を含める必要があります。
  • クラスの仕組み
  • 画像のURLを検索し、画像をフォルダーにダウンロードして保存し、フォルダーのzipアーカイブを作成し、最後にフォルダーを削除します。
クラスは、SymfonyのDomCrawlerコンポーネントを使用して、Webページにあるすべての画像リンクとZIPファイルを作成するカスタムZIP関数を検索します。 ZIP機能についてDavid Walshにクレジットします

クラスのコーディング

クラスは、5つの私有地と__ Construct Magicメソッドを含む8つのパブリックメソッドで構成されています。

以下は、クラスのプロパティとその役割のリストです。

1。$フォルダー:削られた画像を含むフォルダーの名前を保存します。

2。$ URL:WebページURLを保存します。

3。$ HTML:WebページのHTMLドキュメントコードを削減するために保存します。

4。$ filename:zipファイルの名前を保存します。 Symfony' s Domcrawlerでの画像削り 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コンポーネントをダウンロードしてインストールします。

$ php composer.pharインストールを実行してライブラリをダウンロードし、ベンダー/autoload.php autoloaderファイルを生成します。 クラスを使用して

SetFolderを呼び出し、SetFileNameメソッドを呼び出して、それぞれの引数を渡します。フォルダー名を変更する必要がある場合にのみ、SetFolderメソッドを呼び出します。 クラスを機能させるためにプロセスメソッドを呼び出してください。
<span>public function getStatus() {
</span>    <span>echo $this->status;
</span><span>}</span>
ログイン後にコピー

  • 要約
  • この記事では、ダウンロードした画像をZIPアーカイブに自動的に圧縮するシンプルなPHP画像スクレーパーを作成する方法を学びました。改善のための代替ソリューションまたは提案がある場合は、以下のコメントに残してください。すべてのフィードバックは大歓迎です!
  • SymfonyのDomcrawlerでの画像のスクレイピングに関するよくある質問(FAQ)
  • SymfonyのDomcrawlerコンポーネントをインストールするにはどうすればよいですか?簡単です。 PHPの依存関係管理ツールであるComposerを使用できます。プロジェクトディレクトリで次のコマンドを実行します。ComposerはSymfony/Dom-Crawlerを必要とします。これにより、domcrawlerコンポーネントが依存関係とともにダウンロードしてインストールされます。$ crawler = new crawler($ html);

    $ crawler-> filter( 'img') - >それぞれ(function(crawler $ node){
    echo $ node-> attr( 'src');
    });

    symfonyのdomcrawlerコンポーネントを使用できますかlaravel?

    はい、Laravelを使用したSymfonyのDomcrawlerコンポーネントを使用できます。 LaravelのHTTPテスト機能は、実際にはフードの下にDomcrawlerコンポーネントを使用しています。これは、同じ方法とテクニックを使用して、LaravelテストでHTMLコンテンツを横断および操作できることを意味します。

    SymfonyのDomcrawlerコンポーネントを使用して要素を選択するにはどうすればよいですか?フィルター、FilterXPath、SelectLinkなどの要素を選択します。これらの方法では、それぞれタグ名、Xpath式、またはリンクテキストに基づいて要素を選択できます。

    SymfonyのDomcrawlerコンポーネントを使用して要素のコンテンツを変更できますか? SymfonyのDomcrawlerコンポーネントを使用して、要素の内容を変更します。各メソッドにより、選択した各要素を反復し、その操作を実行できます。たとえば、次のような画像要素のSRC属性を変更できます。 attr( 'src'、 'new-image.jpg');

    });

    symfonyを使用するときにエラーと例外を処理するにはどうすればよいですかdomcrawlerコンポーネント?

    $ crawler-> filter( 'img') - >それぞれ(function(crawler $ node){

    echo $ node-> attr( 'src');

    });

    SymfonyのDomcrawlerコンポーネントを使用してAjaxロードのコンテンツをスクレイプできますか?

    残念ながら、SymfonyのDomcrawlerコンポーネントは、JavaScriptを実行しないため、Ajaxにロードされたコンテンツを直接スクレイすることはできません。ただし、GuzzleやGoutteなどのツールをDomcrawlerコンポーネントと組み合わせて使用​​して、HTTPリクエストを送信し、Ajax-Loadedコンテンツを処理できます。

以上がSymfony&#x27; s Domcrawlerでの画像削りの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート