スポンサーリンク
calculator confirm

【Laravel】PHPでスクレイピングツールを作る(Goutte版)

情報収集 - ビジネス

前回は、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 接続してください。

Git Bash 起動

以下のコマンドを実行してください。

# 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 を使っているサイトでも、取得できるプログラムを紹介します。


コメント