これまで、PHPでのスクレイピングにはphp-phantomjsを使ってきたが、環境を別のサーバーに移転したところ動作しなくなってしまったので、代替のスクレイピング環境を構築した。
今回使ったライブラリ
今回使ったライブラリは以下の3つ。
- Guzzle(HTTPクライアント)
- PHP DOM Wrapper(DOM操作)
- Chrome PHP(ヘッドレスブラウザ)
まずは、これらをcomposerで一括インストールする。
composer require guzzlehttp/guzzle scotteh/php-dom-wrapper chrome-php/chrome
スクレイピングの基本例
ここでは上記ライブラリの最低限の使い方のみ紹介する。
// ライブラリの読み込み require_once __DIR__ . '/vendor/autoload.php'; // 名前空間 use DOMWrap\Document; use GuzzleHttp\Client; // スクレイピングのメイン処理 $client = new Client; $response = $client->request('POST', 'URL', [ // Basic認証がかかっている場合は必須 'auth' => ['USERNAME', 'PASSWORD'], // パラメータを渡す時は以下の形式で書く 'form_params' => [ 'param01' => 'val01', 'param02' => 'val02', ], ] ); $html = (string) $response->getBody(); $doc = new Document; $node = $doc->html($html); // 特定のテーブルの各行に対してループ処理をかける例 $dom = $node->find('.list_table > tr'); for($i=0; $i < count($tr); $i++) { $text = $node->find('.list_table > tr:nth-child('.$i.') > td:nth-child(1)')->text(); echo $text; }
上記はBasic認証のかかったページにパラメータをPOST送信してアクセスし、取得したDOMの中から、list_tableクラスのついたtableの各行に対し、ループ処理をかけた一例。
このコードを応用すれば、ある程度のスクレイピング処理をPHPで行うことができるはずだ。