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

