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を使ってライブラリをインストールします。
下記のコマンドを実行します。
1 |
$ composer require kub-at/php-simple-html-dom-parser |
他の環境に合わせるために「PHP Simple HTML DOM Parser」のバージョンを指定してインストールする場合は、下記の「:1.9」のように最後にバージョンを追加します。
1 |
$ 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で使うために呼び出す処理を記述します。
1 |
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などを利用することになります。
そのために、前項で追記した内容の次の行あたりに下記を追記します。
1 |
use Cake\Http\Client; |
そして、スクレイピングを行う処理のサンプルソースは以下のようになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
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を設定してサイトにアクセスする方法の記載がありませんでしたのでここで解説をしておきます。
1 2 3 4 5 6 7 |
// 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の関連記事
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にOGPをfetch、asignを利用してテンプレートごとに指定する方法を解説
その他の「CakePHP3」に関する記事一覧
GoogleAdwords
GoogleAdwords
この記事が参考になったと思いましたらソーシャルメディアで共有していただけると嬉しいです!
関連記事
-
CakePHP2の検索Plugin CakeDC/Searchで重複を省くgroup by(distinct)の実装方法
CakePHP2の検索プラグイン「CakeDC/Search」で、重複レコードを省くgroup by、distinctを使う方法についての解説。設定する場所はpaginatorの条件とするので、find()関数と同じ。
-
Windows環境の XAMPPを利用して CakePHPの開発する際の注意点
WindowsベースにXAMPPで環境を構築しCakePHP4を利用したWebシステムを構築する際は、大文字と小文字の違いを意識する必要がある。LinuxベースのWebサーバに移動させたときに不具合で動作しないこともある。
-
CakePHP 2.3 Model、Controllerの見たい変数の中身をログ出力
CakePHPの Modelや Controllerの変数の中身をログとして出力して見る方法を提供します。
-
CakePHP3でComposerでインストールできないプラグイン、外部ライブラリを vendorに入れて手動で読み込む方法
CakePHP3にComposerからインストールできないプラグインやライブラリなどを利用する方法、vendorにファイルを設置し、composer.jsonを更新し、それを呼び出す方法を詳細に解説。
-
CakePHP3で「SQLSTATE[23000]: Integrity constraint violation」「SQLSTATE[42S22]: Column not found」などのエラーが出たときの確認するポイント
CakePHP3の開発で発生する「SQLSTATE[23000]: Integrity constraint violation」「SQLSTATE[42S22]: Column not found」のエラーには特有の原因もあるため、その説明と対処方法の解説。
-
CakePHPのFlashエラーは出るが入力項目ごとのメッセージが出ないエラーの原因
Bakeして自動生成した入力フォーム処理を元に少し処理を追加したら、入力エラーがあってもエラーメッセージが表示されなくなった。原因はリダイレクトの処理にあった。
-
CakePHP3のCakeDC/UsersのUserHelperでログアウトやreCAPTCHAをカスタマイズ
CakeDC謹製Usersプラグインの紹介。UserHelperを利用し、ログアウトのリンクや権限があるときのみ表示されるリンク、プロフィールページへのリンク、reCAPTCHAの設置方法などを解説。
-
CakePHP4のクリエビルダーを使用してOR条件をAND条件でつなぐSQL文を作る方法
CakePHP4のクリエビルダーを使って複数のOR条件をANDでつなぐSQL文を作成する方法を解説。OR条件を記述したwhere句を2つつなげて記述する。
-
CakePHP 2.3 ID以外のカラムでアソシエーション(連携)をさせる場合の詳細ページの注意点
ID以外のカラムでアソシエーション(連携)させて詳細ページを表示させる際の考え方と注意点をサンプルソースを用いて解説しています。
-
CakePHP 2.3で確認画面付きのお問い合わせフォームの作り方
CakePHPで確認画面付きのお問い合わせフォーム、メールフォームの作り方をサンプルを提示しながら解説。