Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

映画好きの悩みとして「映画館をハシゴする時のスケジュール調整がアナログ」というものがあります。
例えば、「今日はリメンバー・ミーとシェイプ・オブ・ウォーターを見るぞ!」と鼻息を荒くしても、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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away