映画好きの悩みとして「映画館をハシゴする時のスケジュール調整がアナログ」というものがあります。
例えば、「今日はリメンバー・ミーとシェイプ・オブ・ウォーターを見るぞ!」と鼻息を荒くしても、Google先生はそれぞれの映画がどこで何時に上映されるかは教えてくれますが、どういうルートでハシゴすればスムーズに移動できるかは教えてくれません。
ならば自分で作るしかない。ということでまずは映画の上映情報を網羅するために、クローリングを始めようと思います。
このページを参考にまずは自分のLaravelプロジェクトのディレクトリに移動し、laravel-goutteを入れます
$ cd ~/Sites/goutte-sample //自分のLaravelプロジェクト名のディレクトリに移動
$ composer require weidner/goutte
コマンドを打ってからしばらく待つ。成功したら「Package manifest generated successfully.」というメッセージが出てきます。
その後、Laravelプロジェクトのディレクトリ内にあるcomposer.jsonファイルに下記のように追記
{
"require": {
"php": ">=7.0.0",
"fideloper/proxy": "~3.3",
"laravel/framework": "5.5.*",
"laravel/tinker": "~1.0",
"weidner/goutte": "^1.0" // ここです
},
同様にconfig/app.phpにも追記
return [
'providers' => [
// ...
/*
* Package Service Providers...
*/
Weidner\Goutte\GoutteServiceProvider::class, // ここと
/*
* Application Service Providers...
*/
App\Providers\AppServiceProvider::class,
App\Providers\AuthServiceProvider::class,
App\Providers\EventServiceProvider::class,
App\Providers\RouteServiceProvider::class,
],
// ...
'aliases' => [
'App' => Illuminate\Support\Facades\App::class,
'Artisan' => Illuminate\Support\Facades\Artisan::class,
// ...
'Goutte' => Weidner\Goutte\GoutteFacade::class, // ここです
'Hash' => Illuminate\Support\Facades\Hash::class,
// ...
],
];
これで準備ができました。laravel-goutteのGithubページのreadmeには下記のサンプルがあります。
ファイルはroutes/web.php
Route::get('/', function() {
$crawler = Goutte::request('GET', 'https://duckduckgo.com/html/?q=Laravel');
$crawler->filter('.result__title .result__a')->each(function ($node) {
dump($node->text());
});
return view('welcome');
});
今回は映画の情報を取得したいので、アップリンク渋谷で2018年3月30日時点で上映中の映画のタイトルを取得するコードを書きました。
<?php
// アップリンクで現在上映されている映画を取得する
$crawler = Goutte::request('GET', 'http://www.uplink.co.jp/movie-show/nowshowing');
$crawler->filter('article.post h2 a')->each(function ($node) {
echo $node->text();
echo '<br/>';
});
return view('welcome');
});
結果は下記の通りになりました。無事に取得できているようです。
今回はクローラーを動かした程度の記事ですが、今後は下記の対応が必要になります。
①ページを遷移して取得
②映画ごとの上映時間の取得
③取得したデータのDB保存
検索していても日本語でドンピシャな記事があまり無かったので、下記の記事を参照に進めて行こうと思います。
FriendsOfPHP/Goutte
Goutteにてもっと情報ほしければ下記を読めと記載あり
BrowserKit component
CssSelector ComponentDomCrawler Component
↑名前的にこれが一番参考になりそう
Guzzle Documentation