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