Windows 7 ProでXAMPP環境でGoutte を使用したスクレイピングができる環境を構築します。Goutteではブラウザ機能の実現に次のようなクラスを利用しています。

  • Zend_Http_Client
  • DomCrawler
  • BrowserKit

これらの機能を組み合わせて、受け取ったCookieを次のリクエストで自動的に送信し、特定のリンクをクリックし、フォームに適切な値を詰めてPOSTしています。XAMPP環境で使用しているPHPのバージョンは5.4.31です。

Composerのインストール

Download ComposerのWindows InstallerからComposerをダウンロードし、ダウンロードされた「Composer-Setup.exe」を実行します。インストール途中に、php.exeの場所を確認するダイアログが表示されるので、C:\xampp\php\php.exeなどのように環境に合わせて指定します。

「C:\ProgramData\ComposerSetup\bin」のWindowsバッチファイル「composer.bat」をダブルクリックして実行するとPathが設定されます。コマンドプロンプトを開き、次のコマンドでインストールされているか確認します。

C:\>composer –version
You are running composer with xdebug enabled. This has a major impact on runtime performance. See https://getcomposer.org/xdebug
Composer version 1.1.1 2016-05-17 12:25:44

Windowsバッチファイル「composer.bat」を実行しないと、Pathが設定されないので、上記のコマンドを実行すると、実行ファイルが存在しないというエラーになります。

Goutteのインストール

FriendsOfPHP/Goutteから、Goutteの圧縮ファイルGoutte-master.zipをダウンロードし、解凍します。解凍したGoutteフォルダのcomposer.jsonのあるディレクトリに、ディレクトリ「crawler」を作成して、そこに移動して、次のようにComposerを利用してGoutteをインストールします。

F:\Goutte-master\crawler>composer require fabpot/goutte
You are running composer with xdebug enabled. This has a major impact on runtime performance. See https://getcomposer.org/xdebug
Using version ^2.0 for fabpot/goutte
./composer.json has been created
Loading composer repositories with package information
Updating dependencies (including require-dev)
  – Installing react/promise (v2.4.1)
    Downloading: 100%
  – Installing guzzlehttp/streams (3.0.0)
    Downloading: 100%
  – Installing guzzlehttp/ringphp (1.1.0)
    Downloading: 100%
  – Installing guzzlehttp/guzzle (5.3.0)
    Downloading: 100%
  – Installing symfony/polyfill-mbstring (v1.2.0)
    Downloading: 100%
  – Installing symfony/dom-crawler (v2.8.6)
    Downloading: 100%
  – Installing symfony/css-selector (v2.8.6)
    Downloading: 100%
  – Installing symfony/browser-kit (v2.8.6)
    Downloading: 100%
  – Installing fabpot/goutte (v2.0.4)
    Downloading: 100%
symfony/browser-kit suggests installing symfony/process ()
Writing lock file
Generating autoload files

ここで次のエラーメッセージが発生することがあります。この場合、composer.jsonのあるディレクトリに、ディレクトリ「crawler」を作成して、そこに移動して、上記のコマンドを実行してください。

Root package ‘fabpot/goutte’ cannot require itself in its composer.json
Did you accidentally name your root package after an external package?

Goutteの利用例

実際にGoutteを利用して、Yahooファイナンスから企業情報を取得してみます。

<?php
	require_once(realpath(__DIR__) . "./Goutte-master/crawler/vendor/autoload.php");
	use Goutte\Client;
	 
	$client = new Client();
	$crawler = $client->request('GET', 'http://stocks.finance.yahoo.co.jp/us/profile/AAPL');
	 
	$crawler->filter('.boardFinCom tr')->each(function($node) {
	    echo "<dt>" . $node->filter('th')->text() . "</dt><br>";
	    echo "<dd>" . $node->filter('td')->text() . "</dd><br>";
	});
?>

実行すると次の結果が取得できます。

概要

    アップルは米国のIT機器大手。メディアデバイス、PC、スマートフォン、タブレット端末などのデザイン・製造・販売に従事し、主要製品は「iPhone」や「iPad」。2016年に「iPhone SE」、大型タブレット「iPad Pro」の新機種を発売予定。ウエアラブル端末「Apple Watch」、デジタルコンテンツやアプリも販売する。本社はカリフォルニア州。
英文社名

    Apple Inc
本社所在地

    1 Infinite Loop Cupertino, CA 95014 USA
電話番号

    408 996-1010
設立年月日

    1977年1月
代表者名

    Mr. Timothy D. Cook
業種分類

    IT・通信 (IT & Communications)
市場名

    NASDAQ National Market System
従業員数

    110,000人
ウェブサイト

    www.apple.com

Goutte を使用してHTTPS経由でコンテンツの取得

<?php
	require_once(realpath(__DIR__) . "./Goutte-master/crawler/vendor/autoload.php");
	use Goutte\Client;
	 
	$client = new Client();
	$crawler = $client->request('GET', 'https://example.com'');
	 
	echo $crawler->html();
?>

上記のようなコードでHTTPS経由でコンテンツを取得しようとしたところ、以下のようなメッセージで GuzzleHttp\Exception\RequestException がスローされました。

( ! ) Fatal error: Uncaught exception ‘GuzzleHttp\Ring\Exception\RingException’ with message ‘cURL error 60: See http://curl.haxx.se/libcurl/c/libcurl-errors.html’ in F:\AnimalflyUpdate\htdocs\swcraping\Goutte-master\crawler\vendor\guzzlehttp\guzzle\src\Exception\RequestException.php on line 51

次のように、requestメソッド実行前に「$client->getClient()->setDefaultOption(‘verify’, false)」を挿入すると、HTTPSのアドレスでもスクレイピングが可能となります。

<?php
	require_once(realpath(__DIR__) . "./Goutte-master/crawler/vendor/autoload.php");
	use Goutte\Client;
	 
	$client = new Client();
	$client->getClient()->setDefaultOption('verify', false);
	$crawler = $client->request('GET', 'https://example.com'');
	 
	echo $crawler->html();
?>
「setDefaultOption(‘verify’, false)」により、サーバー証明書の検証を行わないようにオプションを設定します。

テキストリンクの文字列を指定してリンクの取得

Crawler の selectLink メソッドを使って、テキストリンクの文字列を指定して(もしくは画像リンクのalt属性の文字列を指定して)リンクを取得することが出来ます。 このメソッドはリンクのノードを含む Crawler オブジェクトを返します。 この Crawler オブジェクトの link() メソッドを呼ぶことで、 Link のオブジェクトを取得出来ます。

<?php
	require_once(realpath(__DIR__) . "./Goutte-master/crawler/vendor/autoload.php");
	use Goutte\Client;
	 
	$client = new Client();

	$crawler = $client->request('GET', 'https://tomosoft.jp/design/?p=6129');
	 
	//select a link
	$link = $crawler->selectLink('Atmel Studioで開発したAT90USB162のLED点灯プログラム作成')->link();
	//click to follow link
	$crawler = $client->click($link);
	echo $crawler->html();
?>

Link オブジェクトのメソッドを使って、リンクの情報を取得出来ます。

// リンクのURIを返す
$uri = $link->getUri();