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