LoginSignup
13
19

More than 5 years have passed since last update.

Laravel/Goutteで映画タイトルをクローリングする

Last updated at Posted at 2018-03-29

映画好きの悩みとして「映画館をハシゴする時のスケジュール調整がアナログ」というものがあります。
例えば、「今日はリメンバー・ミーとシェイプ・オブ・ウォーターを見るぞ!」と鼻息を荒くしても、Google先生はそれぞれの映画がどこで何時に上映されるかは教えてくれますが、どういうルートでハシゴすればスムーズに移動できるかは教えてくれません。
ならば自分で作るしかない。ということでまずは映画の上映情報を網羅するために、クローリングを始めようと思います。

このページを参考にまずは自分のLaravelプロジェクトのディレクトリに移動し、laravel-goutteを入れます

$ cd ~/Sites/goutte-sample //自分のLaravelプロジェクト名のディレクトリに移動
$ composer require weidner/goutte

コマンドを打ってからしばらく待つ。成功したら「Package manifest generated successfully.」というメッセージが出てきます。

その後、Laravelプロジェクトのディレクトリ内にあるcomposer.jsonファイルに下記のように追記

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にも追記

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

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日時点で上映中の映画のタイトルを取得するコードを書きました。

routes/web.php
<?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');
});

結果は下記の通りになりました。無事に取得できているようです。
スクリーンショット 2018-03-30 8.36.50.png

今回はクローラーを動かした程度の記事ですが、今後は下記の対応が必要になります。
①ページを遷移して取得
②映画ごとの上映時間の取得
③取得したデータのDB保存

検索していても日本語でドンピシャな記事があまり無かったので、下記の記事を参照に進めて行こうと思います。
FriendsOfPHP/Goutte
Goutteにてもっと情報ほしければ下記を読めと記載あり
BrowserKit component
CssSelector ComponentDomCrawler Component
↑名前的にこれが一番参考になりそう
Guzzle Documentation

13
19
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
19