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