
前回は、Homestead を使って Laravel の開発環境を構築しました。
【PHP】Laravel 開発環境の構築(Windows版)
今回は、インストールした Laravel と Goutte(Guzzle + DomCrawler)というライブラリを使って、Web サイトのスクレイピングを行うツールを作成したいと思います。
ここでは、とあるキーワードの Google の検索結果を取得するツールを作成します。
オブジェクト指向やカプセル化は無視して、とりあえずコントローラーだけを使って、簡単にデータを取得する方法を紹介します。
この記事は、PHP・Linux に関して多少知識のある方を対象にしています。
- PHP 7
 - Laravel 5.7
 
全体の流れ
- Goutte をインストール
 - Goutte の初期設定
 - コントローラーの作成
 - ルーティングの設定
 - Goutte を使った Google 検索結果の取得
 
Goutte をインストール
Goutte は、Composer を使ってインストールします。
なので、まずは「Git Bash」を起動し、SSH 接続してください。
以下のコマンドを実行してください。
# Laravel をインストールしたディレクトリ $ cd /home/vagrant/code/laravel/ $ composer require weidner/goutte
Goutte の初期設定
Laravel で Goutte を使えるようにするために、設定を行います。
と言っても、編集するファイルは、「config/app.php」のみ、以下の 2行を追記するだけです。
'providers' => [
    ・・・
    Weidner\Goutte\GoutteServiceProvider::class,
],
'aliases' => [
    ・・・
    'Goutte' => Weidner\Goutte\GoutteFacade::class,
],
コントローラーの作成
artisan コマンドを使って、コントローラーを作成します。
ここでは、例として「ScrapingController」を作成します。
$ php artisan make:controller ScrapingController
これで、「app\Http\Controllers」配下に「ScrapingController.php」というファイルが作成されます。
ルーティングの設定
「routes/web.php」を、以下のように修正してください。
// コメントアウト
/*
Route::get('/', function () {
    return view('welcome');
});
*/
// root ディレクトリにアクセスした場合、ScrapingController の index メソッドが実行される
Route::get('/','ScrapingController@index');
Goutte を使った Google 検索結果の取得
例として「カレンダー 人気」というキーワードで、Google 検索した結果のタイトルと URL を取得し、表示したいと思います。
「app\Http\Controllers\ScrapingController.php」
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
// Goutte ライブラリの読み込み
use Goutte\Client;
class ScrapingController extends Controller
{
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        // Google 検索 URL フォーマット
        $url_format = 'https://www.google.co.jp/search?q=%query%&num=%num%';
        // キーワード
        $keyword = 'カレンダー 人気';
        // キーワードのURLエンコード、SERPs の取得件数をセット
        $replace = [urlencode($keyword), 100];
        $search = ['%query%', '%num%'];
        
        // 実際にアクセスする URL
        $url = str_replace($search, $replace, $url_format);
        // Goutte ライブラリの事前準備
        $client = new Client();
        // Https 関連でエラーが発生する場合があるので、チェックしないように設定
        $guzzleClient = new \GuzzleHttp\Client(['verify' => false]);
        $client->setClient($guzzleClient);
        $result = [];
        // 検索結果の取得
        $crawler = $client->request('GET', $url);
        $crawler->filter('div.g')->each(function($node) use(&$result) {
            if (count($node->filter('a')) !== 0 && count($node->filter('h3')) !== 0) {
                $href = $node->filter('a')->attr('href');
                if (preg_match('/url\?/', $href)) {
                    $info = [];
                    $info['title'] = $node->filter('h3')->text();
                    preg_match('(https?://[-_.!~*\'()a-zA-Z0-9;/?:@=+$,%#]+)', $href, $match);
                    $info['url'] = urldecode($match[0]);
                    $result[] = $info;
                    
                }
            }
        }
        dd($result);
    }
}
これで、TOP100 のサイトとその URL が取得できます。
しかし、JavaScript を利用したサイトでは、このプログラムは使えません。
なので、次回は、JS を使っているサイトでも、取得できるプログラムを紹介します。
  
  
  
  
