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
この記事が参考になったと思いましたらソーシャルメディアで共有していただけると嬉しいです!
関連記事
-
CakePHP3でcomposerを利用してライブラリ・プラグインをインストールする方法
CakePHP3でcomposerを使ってパッケージ(ライブラリ、プラグイン)をインストールする方法の解説。PHPを使うのはCakePHP3が初めてというような方への使い方から解説。
-
cakephp3 カスタムバリデーションを簡易的に実装する方法
CakePHP3の独自のバリデーションをテーブルクラス内に簡単に記述する方法を解説。他のテーブルクラスでは使えないが、記述する量は少なく実装できるため、他で使わない処理を書くのには便利。
-
CakePHP3でユーザ定義の定数、変数を設定し、読み込む方法解説
CakePHP3で定数や共通で使う変数をまとめて設定し、プログラム内で読み込む方法を、bootstrap.phpに直接記述する方法と定数ファイルを分ける方法の3つの方法で解説。
-
CakePHP3で静的ページの作成は webrootか pagesを使う。トップページを参考に解説
CakePHP3で静的なページを設置する場合の方法(webrootとpagesとを活用する方法)を解説。pagesの解説はデフォルトのトップページがどう表示されているかを参考に解説。ルーティングの機能も。
-
CakePHP4のController内でViewテンプレート、レイアウトの変更設定を記述する方法
CakePHP4でテンプレートやレイアウトファイルをデフォルトから変更する場合は「render()」を使用するが、記述場所はできるだけコントローラー内の最後の方に書く方がいい。
-
CakePHP3でDocumentRootやtmp、webroot、logsなどのフォルダへのパスの定数
CakePHP3で特定フォルダのパスの定数を解説。root、DocumentRoot、app、config、webroot、tests、tmp、cache、vendor、コア、コアの srcが設定済み。realpath()関数を使うと柔軟なパス指定が可能。
-
CakePHP3チュートリアルで日付と時刻のDateTimeでエラーが出たときの対処方法
CakePHP3のブックマークチュートリアルには記載ミスもあり、そのまま動かない個所もある。CakePHP3では namespaceを使うようになったので、classを呼び出すときに¥を追加する必要が!
-
CakePHP4で「app_local.php」「.env」を利用して環境ごとの定数を振り分ける方法
CakePHP4で.env、app_local.phpに定数を定義してそれを呼び出す方法の解説。Gitでは管理せず本番環境と開発環境とで異なる定数を定義するためそれを利用する方法。
-
CakePHP3で他のテーブルのマスタテーブルからセレクトボックス(プルダウンリスト)を作る
他のテーブルのマスタのレコードからプルダウンリストを作成し、選択できるようにするサンプルプログラムと解説。ORMの設定によりデータベースの値を取得し、配列を作成し optionsに与える。
-
Windows上のXAMPP環境のCakePHPのコマンド実行時に環境変数を指定する方法
CakePHP4のコマンド(シェル)に対して、環境変数を指定して実行する方法を解説。LinuxとWindows上のXAMPPとでは記述方法が異なるため、Windowsのsetコマンドについても詳細解説。