どうもきよです!
久しぶりの投稿となりましたが、
今回はLaravelでのスクレイピングの方法についてメモしていこうと思います。
使い方、導入方法はシンプルなのでぜひ用法用量を守ってご利用ください!
・今回のバージョン
laravel 6.5
PHP 7.4
・導入方法
– コンソールから下記実行
composer require kub-at/php-simple-html-dom-parser
・使用方法
– ファイルでuseする
use KubAT\PhpSimple\HtmlDomParser;
インスタンス作成
– プログラム上などでHTMLを作成した場合など
$str = '<html><head></head><body><h1>hoge</h1></body></html>'; $dom = HtmlDomParser::str_get_html($str);
– 外部サイトや自サーバーファイルを参照する場合はこっち
$url = 'http://hogehoge';// 自サーバー内のファイルならPathでもOK $dom = HtmlDomParser::file_get_html($url);
※このインスタンスで操作を行う
※内部的にはfile_get_contentsしてる
※デフォルトで600KBまで
Classを検索
$classes = $dom->find('.hogehoge'); foreach ($classes as $class) { .... }
※配列でnodeが帰ってくる
※Classの場合は「.」を先頭につける
IDで検索
$ids = $dom->find('#hogehoge'); foreach ($ids as $id) { .... }
※配列でnodeが帰ってくる
※IDの場合は「#」を先頭につける
タグ名で検索
$tags = $dom->find('div'); foreach ($tags as $tag) { .... }
※配列でnodeが帰ってくる
nodeの状態を確認する
$ids = $dom->find('#hogehoge'); foreach ($ids as $id) { var_dump($id->dump());exit; }
※#hogehoge配下のnodeの状態をデバッグできる
参照先を親nodeに移す
$ids = $dom->find('#hogehoge'); foreach ($ids as $id) { $parent = $id->parent(); }
子node全てを取得する
$ids = $dom->find('#hogehoge'); foreach ($ids as $id) { $children = $id->children(); foreach ($children as $child) { } }
※配列でnodeが帰ってくる
特定の子nodeを取得する
$ids = $dom->find('#hogehoge'); foreach ($ids as $id) { $index = 2; $child = $id->children($index); }
※index = 2の子nodeを取得できる
最初の子nodeを取得する
$ids = $dom->find('#hogehoge'); foreach ($ids as $id) { $child = $id->first_child(); }
※子が存在する場合は、最初の子nodeを返す
※子が存在しない場合はnull
最後の子nodeを取得する
$ids = $dom->find('#hogehoge'); foreach ($ids as $id) { $child = $id->last_child(); }
※子が存在する場合は、最後の子nodeを返す
※子が存在しない場合はnull
同じ階層の次のnodeを取得する
$classes = $dom->find('.hogehoge'); foreach ($classes as $class) { $next = $id->next_sibling(); }
※次のnodeが存在する場合は、次のnodeを返す
※次のnodeが存在しない場合はnull
同じ階層の前のnodeを取得する
$classes = $dom->find('.hogehoge'); foreach ($classes as $class) { $prev = $id->prev_sibling(); }
※前のnodeが存在する場合は、前のnodeを返す
※前のnodeが存在しない場合はnull
カレントnode以下のClassを取得する
$ids = $dom->find('#hogehoge'); foreach ($ids as $id) { $classes = $id->find('.hogehoge'); foreach ($classes as $class) { $class->text(); } }
node内のテキストを取得する
$ids = $dom->find('#hogehoge'); foreach ($ids as $id) { $text = $id->text(); }
※スペースが含まれることがあるので注意
とりあえず、この辺にしておきます。
その他にも、取得したhtmlをカスタマイズすることも可能ですし、
そのカスタマイズしたhtmlを保存することも可能なので、
必要であれば調べてみてください!
ライブラリのソースもシンプルで読みやすいので、
暇でしたらぜひ!
以上、よろしくお願いいたします。