これまで、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で行うことができるはずだ。