CakePHP3でPHP Simple HTML DOM Parserを使ってスクレイピングする方法
2020/02/08
CakePHP3+PHP Simple HTML DOM Parserでスクレイピング
CakePHP3+PHP Simple HTML DOM Parserでスクレイピング解説記事の事前説明
この記事は、CakePHP3に PHP Simple HTML DOM Parserをインストールしてスクレイピングをする環境を作る解説をするという内容です。
PHPでスクレイピングというと「phpQuery」に関連する記事が大量に出てきますが、「phpQuery」ではなく「PHP Simple HTML DOM Parser」の方をオススメする理由を「PHPでスクレイピング。phpQueryとphp-simple-html-dom-parserの比較と設置方法」として記事にしましたので、興味があれば読んでください。
また、この記事では、PHP Simple HTML DOM Parserの基本的な設置方法も書いています。
また、PHP Simple HTML DOM Parserの設置方法、基本的な使い方については「PHPのスクレイピングライブラリ「PHP Simple HTML DOM Parser」の使い方」として記事にしていますのでこちらを参考にしてください。
この記事に書いてあるのは、CakePHP3で PHP Simple HTML DOM Parserを使えるようにするところまでの内容です。
スクレイピングをする前に、PHPから Webサイトにアクセスする方法としては「file_get_contents」より「cURL」の方をオススメしますが、その理由を「PHPのcURLでAPIやWebサイトへのアクセス方法。file_get_contentsとの比較」として記事にしていますのでこちらも参考にしてください。
ただ、CakePHP3の場合は、Http Clientというライブラリが用意されていますので、それを利用するといいでしょう。
CakePHP3に PHP Simple HTML DOM Parserを設置する方法
1.PHP Simple HTML DOM Parser のインストール
まず初めに「PHP Simple HTML DOM Parser」をインストールします。
CakePHP3では、composerを使ってライブラリをインストールします。
下記のコマンドを実行します。
$ composer require kub-at/php-simple-html-dom-parser
他の環境に合わせるために「PHP Simple HTML DOM Parser」のバージョンを指定してインストールする場合は、下記の「:1.9」のように最後にバージョンを追加します。
$ composer require kub-at/php-simple-html-dom-parser:1.9
詳しくは「CakePHP3でcomposerを利用してライブラリ・プラグインをインストールする方法」を参照してください。
2.PHP Simple HTML DOM Parserを読み込む
続いて、インストールした PHP Simple HTML DOM Parserを CakePHP3で使うために呼び出す処理を記述します。
use KubAT\PhpSimple\HtmlDomParser;
例えば、SampleController.phpで PHP Simple HTML DOM Parserを使うのであれば、SampleController.phpに記述します。
これで PHP Simple HTML DOM Parserは使えるようになります。
3.PHP Simple HTML DOM Parserでスクレイピングをするサンプルソース
前項までで PHP Simple HTML DOM Parserを使う準備はできましたので、この後では実際にスクレイピングをするサンプルソースを書いておきます。
その前に、スクレイピングをするためには Webサイトを読み込む必要がありますので、 Http Clientなどを利用することになります。
そのために、前項で追記した内容の次の行あたりに下記を追記します。
use Cake\Http\Client;
そして、スクレイピングを行う処理のサンプルソースは以下のようになります。
public function index(){
// UserAgent
define("USER_AGENT_TEXT", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36");
// スクレイピング対象サイトの URL
$url = "https://www.yahoo.co.jp/";
// UAがないとエラーになるサイトの場合は、UAを設定する
$option = ['headers' => ['User-Agent' => USER_AGENT_TEXT]];
$http = new Client($option);
// URLにアクセスし HTMLを取得
$htmlSource = $http->get($url)->getStringBody();
// HTMLファイルから DOMオブジェクトを作成
$html = HtmlDomParser::str_get_html($htmlSource);
// スクレイピング(「a」タグを取得)
echo implode("<br>", $html->find("a"));
}
ヤフーのサイト「https://www.yahoo.co.jp/」から、「a」タグを取得し、それを画面に表示する、というソースになっています。
それぞれの行にコメントを書いているので処理内容は分かるかと思います。
最初にも書きましたが、PHP Simple HTML DOM Parserの具体的な使い方に関しては「PHPのスクレイピングライブラリ「PHP Simple HTML DOM Parser」の使い方」を参照してください。
http client()に User Agentを指定する方法
PHPから Webサイトにアクセスするときは、cURLを使うことをオススメします、と下記の記事でも書きました。
PHPのcURLでAPIやWebサイトへのアクセス方法。file_get_contentsとの比較
ですが、CakePHP3には http client() という便利なライブラリが用意されていますのでこれを利用すると便利です。
Cookbook Http Client
https://book.cakephp.org/3/ja/core-libraries/httpclient.html
http、httpsを区別なくアクセスすることができたり、POSTでリクエストボディを送信できたり、Basic認証や OAuth2認証なども処理してくれます。
Http Clientの基本的な使い方に関しては、上記の Cookbookに書いてありますので参照してもらえるといいのですが、User Agentを設定してサイトにアクセスする方法の記載がありませんでしたのでここで解説をしておきます。
// UAがないとエラーになるサイトの場合は、UAを設定する $option = ['headers' => ['User-Agent' => USER_AGENT_TEXT]]; $http = new Client($option); // URLにアクセスし HTMLを取得 $htmlSource = $http->get($url)->getStringBody();
User Agentを指定するには、オプションとして「headers」に指定をします。
簡単な設定で User Agentを指定してアクセスをすることができるようになります。
また、HTMLの本体を取得する場合は「->getStringBody()」を記述します。
また、定数「USER_AGENT_TEXT」はプログラム内のどこかで指定をしておいてください。
CakePHP3の関連記事
CakePHPのpostlinkで生成した削除リンクをクリックしても処理が実行されない対処法CakePHP4のCSS、JavaScript、画像のブラウザへのキャッシュをコントロールする
CakePHP3でレコードを保存(追加、更新、Insert、Update)する複数の方法を紹介
CakePHP3でモデルなしフォームからCSVをアップロードしレコードを更新する方法解説
CakePHP3でPHP Simple HTML DOM Parserを使ってスクレイピングする方法
CakePHP3のInsert On Duplicate Key Update(upsert)構文を解説・バルク処理も
CakePHP3の1対多での連携を中間テーブルを使った多対多の連携に変更するときの手順
CakePHP3でデフォルトのソート条件を設定してユーザの選択肢たソート条件を有効にする方法
CakePHP3で Ajaxを使う方法の解説。3.6以降対応。Successとthenの両方を解説。
CakePHP3でパンくずの指定は HTMLヘルパーを使って指定する方法を解説
その他の「CakePHP3」に関する記事一覧
この記事が参考になったと思いましたらソーシャルメディアで共有していただけると嬉しいです!
関連記事
-
-
CakePHP4の規約外のカラムをキーにアソシエーション(テーブル連結)する方法
CakePHPで規定外のカラム名のキーを指定してアソシエーション(テーブル連結)をする方法を解説。アソシエーション名によってはミスが発生しやすい点もあるので注意も必要。
-
-
CakePHP3にOGPをfetch、asignを利用してテンプレートごとに指定する方法を解説
CakePHP3でOGPを設定する方法を解説。fetch、assignを使用しレイアウトファイルに編集した変数にテンプレートファイルから値を指定する。これを利用してOGPを編集する。
-
-
Windows上のXAMPP環境のCakePHPのコマンド実行時に環境変数を指定する方法
CakePHP4のコマンド(シェル)に対して、環境変数を指定して実行する方法を解説。LinuxとWindows上のXAMPPとでは記述方法が異なるため、Windowsのsetコマンドについても詳細解説。
-
-
CakePHP3のプラグイン「CakeDC/Users」を日本語化・翻訳ファイルもダウンロード可
CakePHP3のユーザ管理、ログイン認証プラグインである「CakeDC/Users」のメッセージを日本語にする手順の解説とともに、日本語の翻訳ファイルを提供。ファイルを設置すれば日本語になる!
-
-
CakePHP5でヘルパーから他のヘルパーを読み込む方法・CakePHP4からの変更点
CakePHP5のヘルパーで他のヘルパーを読み込む方法を解説。公式の日本語CookbookはCakePHP4のソースのままで間違っているため注意が必要。CakePHP4からの移行の際も同じ点に注意が必要。
-
-
CakePHP4のController内でViewテンプレート、レイアウトの変更設定を記述する方法
CakePHP4でテンプレートやレイアウトファイルをデフォルトから変更する場合は「render()」を使用するが、記述場所はできるだけコントローラー内の最後の方に書く方がいい。
-
-
CakePHP 2.3 コマンドラインからPHPのシェル実行の方法解説
CakePHP 2.3でコマンドラインから CakePHPで記述した処理を実行する方法を解説します。
-
-
CakePHP4、CakePHP5系の認証処理でログインの有無の確認、ユーザ情報の取得の方法
CakePHP4系、5系のログイン認証の可否のチェック、および、ログインユーザの情報を取得する方法のまとめ。複数の方法があるが手続きが微妙に異なるためまとめてみた。
-
-
CakePHP 2.3 Search Pluginで検索処理 その5入力項目に複数項目入力した場合の AND検索、OR検索
CakePHPの検索プラグイン Search Pluginの検索処理の中で複数項目を入力した場合の AND検索、OR検索についての解説です。
-
-
CakePHP3のcontroller内でテンプレート、レイアウトを変更する際の指定方法
CakePHP3でテンプレートファイルやレイアウトファイルをデフォルトのものから別のものに変更したい場合の指定方法を解説。