【初心者でもカンタン】Laravelでスクレイピングをしてデータを保存する方法

「インターネット上で必要なデータだけ集めたいなぁ…」と思ったことはありませんか?

情報収集データ解析が得意な言語と言えば「Python」ですが、実はLaravelもWebスクレイピングができます。

しかも、スクレイピング用のライブラリを使えば、初心者でもWeb上からデータを集めることが可能です。

また、Laravelなら簡単にデータベースと連携できるため、データを保存した上でさまざまな形で活用できます。

ただし、Webスクレイピングはルールを守らないとトラブルになる可能性があるため、注意点もしっかり確認しておきましょう。

この記事では、Laravelでスクレイピングをする方法と注意点について解説しています。初心者でも簡単にできるシンプルな方法なので、ぜひ参考にしてください。

Laravelでスクレイピングをする方法

まずは、Laravelでスクレイピングをする方法について解説します。Laravelの「Goutte」というライブラリを使えば、誰でも簡単にスクレイピングができます。

はじめに、LaravelでGoutteを使う手順をまとめておきます。(Mac・MAMPを使っています)

  1. MAMP/htdocsにLaravelをインストールする
  2. LaravelフォルダーにGoutteをインストールする
  3. config/app.phpを編集する

必要な準備は以上です。なお、Laravelの概要は⬇︎の記事で解説しているので、興味のある方はぜひ参考にしてください。

➡︎【機能をカンタンに追加できる】Laravelのメリットや始め方を解説

Goutteを使う準備をする

では、Goutteを使う準備について、もう少し詳しく説明していきます。準備の内容と、実際に入力するコードは下記の通りです。

①ターミナルを起動してMAMPのhtdocsへ移動する

cd /Applications/MAMP/htdocs

②Composerを使ってLaravelをインストールする

composer create-project laravel/laravel プロジェクト名(好きな名前を付けてください)

③Laravelのフォルダーへ移動する

cd プロジェクト名

④Goutteをインストールする

composer require weidner/goutte

⑤テキストエディターでLaravelファイルの『config/app.php』を開き、下記の通りに追記する

return [

    // ...

    'providers' => [

        // ...

        /*
         * Package Service Providers...
         */
        Weidner\Goutte\GoutteServiceProvider::class, ←追記①

        /*
         * Application Service Providers...
         */
        App\Providers\AppServiceProvider::class,
        App\Providers\AuthServiceProvider::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,

        // ...
    ],

];

これで準備完了です。念のため、『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');
});

GitHub dweidner/laravel-goutteより引用

上記のコードを書いたあとに、MAMPを起動してLaravelのトップページを表示してください。

すると、DuckDuckGo(検索エンジン)で「Laravel」と検索した結果のaタグが上から順に並び、その下にLaravelのトップページが表示されるはずです。

Goutteのコード内容について

前述したサンプルコードを書き換えると、他のWebサイトをスクレイピングすることも可能です。では、サンプルコードの内容を簡単にご紹介します。

①スクレイピングするサイトのURLを渡す

$crawler = Goutte::request('GET', 'URL');

②指定したURLのタグやセレクターで絞り込み、スクレイピングする
(文字で抜き出す場合はtext()を使う)

$crawler->filter('HTMLタグ・CSSセレクターで指定')->text();

③繰り返す場合はeach()を使う

$crawler->filter('セレクターなど')->each(function(変数) {
変数->text();
});

ちなみに、HTMLタグやセレクターを調べるには、Google Chromeの「デベロッパーツール」を使います。調べたいページで右クリックを押し、「検証」を選択してください。

次に、デベロッパーツールの左上にあるアイコンをクリックして、調べたい部分を指定すればHTMLタグやセレクター名がわかります。

なお、Goutteについて詳しく知りたい方は下記を参照してください。

以上が、LaravelでWebスクレイピングをする基本の操作となります。ただ、取得した情報を活用するために、とりあえず保存したいですよね?

スクレイピングで取得した情報を保存するには、Laravelとデータベースを接続します。

Laravelを使ってデータベースに接続する方法

Laravelを使えば、簡単にデータベースへ情報を保存できます。では、はじめにデータベースと接続する手順についてまとめておきます。

Laravelとデータベースを接続する手順
  1. phpMyAdminでデータベースを作る
  2. MAMPのドキュメントルートを設定する
  3. .envファイルをMAMPに合わせて編集する
  4. ターミナルでマイグレーションファイルを作る
  5. マイグレーションファイルを編集する
  6. マイグレーションを実行する

少し長いですが、順番に進めていけば初心者でも簡単に接続できます。では、もう少し詳しく見ていきましょう。

データベースを作り接続する方法

まずはMAMPを起動させ、トップページからphpMyAdminを開きます。

続いて、データベースを作成します。このとき、文字コードは絵文字に対応している「utf8mb4」にしておきましょう。(utf8mb4_general_ciが多いようです)

データベースは作るだけで、中身は空のままでOKです。続いて、MAMPのドキュメントルートを設定します。MAMPの設定(Preferences…)を開き、Laravelのpublicフォルダーを選択します。

次に、テキストエディターでLaravelの『.env』を開いて、MAMPに合わせて下記の通りに編集します。

データベースと接続するために入力する内容
.envファイル内の編集する場所


次に、ターミナルを開いてLaravelフォルダーへ移動し、マイグレーションファイルを作るためのコマンドを入力します。

php artisan make:migration create_テーブル名_table

作成されたマイグレーションファイルをテキストエディターで開き、下記の部分を必要に応じて編集します。例えば、名前・メールアドレス・パスワード・タイトル・URLなど、保存しておきたいデータに合わせて追加しましょう。

public function up()
{
    Schema::create('テーブル名', function (Blueprint $table) {
        $table->id();                     ←IDを保存するテーブル

        $table→データ型('名前'); ←追加するテーブル

        $table->timestamps();    ←作成日・更新日を保存するテーブル
    });
}

なお、Laravelではログイン機能を簡単に作成できるように、最初からマイグレーションファイルがいくつか用意されています。そのままマイグレーションをすると、テーブルが増えて紛らわしいので、必要なければ消しておきましょう。

マイグレーションファイルを編集したら、ターミナルからマイグレーションを実行します。ちなみに、あとからデータベースのテーブルを変更することも可能です。

php artisan migrate

これで、データベースの中にテーブルが作られたはずです。もしエラーが出た場合は、記述ミスがないか順番に確認してみてください。

それでも先へ進めないときは、Laravelをデータベースに接続する方法を解説している⬇︎の動画を参考にしてください。わかりやすいのでおすすめです。

なお、Laravelのマイグレーションについて詳しく知りたい方は、公式サイト「Laravel 8.x マイグレーション」で詳細を確認できます。

スクレイピングで取得した情報をデータベースに保存する

Laravelを使ってデータベースに接続できれば、スクレイピングで取得したデータを保存することができます。

スクレイピングの際に記述するコードは、実際に動いている場面を動画で見る方がわかりやすいため、YouTubeのおすすめ動画をご紹介します。

この動画では、スクレイピングした情報をデータベースに保存し、CSVファイルに書き出すまでを解説されています。

実際にコードを書きながら進めてくれるので、初心者でも理解しやすいです。なお、開発環境はDockerを使っていますが、MAMPでも同じように動かすことができました。

スクレイピングしたデータの活用方法は?

ここからは、スクレイピングの活用方法について解説します。Laravelでスクレイピングができるようになり、最初に思いついたのは「Googleの検索順位チェック」です。

ただ、残念ながら前述した使い方では、Google検索の順位チェックツールを作ることができません。解決方法は記事の後半でご紹介します)

なぜなら、Google検索はJavaScriptで結果を表示しているらしく、GoutteでURLを入力してもセレクターを指定できないからです。データがあるかどうかを確認すると、「セレクターがない」と表示されます。

if($crawler->filter('セレクターを指定')->count() != 0){
//要素がある場合の処理を書く
}

ちなみに、Goutteを使うときは「指定した要素がない」とエラーになります。そのため、上記の要素があるか確認するコードを活用して、エラーを回避してください。

スクレイピングを活用する例を紹介

続いて、個人でスクレイピングしたデータを活用する方法について解説します。まずは、活用方法のを簡単にまとめておきます。

  • 検索や絞り込みができないデータを集めて加工する
  • CSVに書き出しスプレッドシートなどにまとめる
  • Googleマップでオリジナルの地図を作成する

では、順番に見ていきましょう。

自分が使いやすいようにデータを加工する

企業の場合は、スクレイピングしたデータをマーケティングなどで活用できます。しかし、個人の場合はスクレイピングしたデータを活用する場面が少ないです。

なぜなら、ECサイトやポータルサイトには最初から検索機能が付いているからです。そのため、わざわざ自分でデータを取得して加工する必要はありません。

つまり、「検索・絞り込み」ができないデータをたくさん取得したいときに、スクレイピングが役に立ちます。例えば、公共機関店舗のデータなどをまとめたい場合です。

Laravelを使えば、自分が必要な部分のデータのみ抜き出し、並べ替えて表示することも可能です。

スプレッドシートやGoogleマップと連携する

Laravelを使うと、データをCSVファイルに書き出すことができます。CSVファイルは、対応しているサービスが多いため、データを活用できる幅が広がります。

例えば、スプレッドシートにCSVファイルをインポートして、一覧表を作成した上で編集できます。さらに、他の方と共有するのも簡単です。

他にも、住所を記録したCSVファイルをGoogleマップにインポートすることで、自分専用の地図を作ることも可能です。もちろん、Googleマップも他の方と共有できます。

とはいえ、Web上から勝手にデータを抜き出し、自由に使って良いわけではありません。

スクレイピングの注意点について

ここからは、スクレイピングの注意点について解説していきます。とても便利なスクレイピングですが、注意点が主に2つあります。

  • 著作権の侵害
  • 業務妨害

そこで、上記のトラブルを避ける方法を確認しておきましょう。

著作権を侵害しない

まず、著作権を侵害しないために、下記の2点を守ってください。

  • 私的利用のため
  • 情報を解析するため

著作権法で、上記に該当する場合はデータのコピーが認められています。詳しく知りたい方は、下記のe-GOV法令検索「著作権法」から、下記の項目を確認してください。

  • 私的利用について:第30条
  • 情報解析について:第47条の5

業務妨害をしない

スクレイピングは、短時間で大量のアクセスをしてデータを取得できます。すると、アクセスされた側のサーバーに大きな負荷がかかってしまいます。

もし、大量のアクセスが原因でサーバーをダウンさせてしまうと、損害賠償刑事事件に発展する可能性があります。そこで、スクレイピングをする前に、確認しておくページがあります。

WebサイトのトップページのURLに「/robots.txt」を加えると、クローラー(Webを巡回するプログラム)に関するルールが書かれたページにアクセスできます。スクレイピングをする前に、Webサイトのルールを確認しておきましょう。

では、robots.txtの内容について、表で簡単にまとめておきます。

項目内容
User-Agentクローラーを指定する(全てのクローラー=*)
Disallowクロールを禁止するページ
Allowクロールを許可するページ
Crawl-delayアクセスする間隔(秒)
コメントアウト

もし、Crawl-delayの記載がなくても、1秒以上の間隔をあけてアクセスすることが一般的なようです。

Goutteでスクレイピングできないサイトはどうする?

最後に、「Googleの検索結果」など、JavaScriptでデータを表示しているサイトの対処方法について解説します。

この場合、JavaScriptはブラウザで動いているため、GoutteでURLを指定してもデータを取得できません。そこで、ブラウザを操作してデータを表示させたあとに、セレクターで指定して取得するという流れになります。

実は、Laravelにはブラウザを操作する機能も搭載されています。詳しく知りたい方は、公式サイト「Laravel Dusk」で確認してください。

Laravelのテスト機能を使ってブラウザを操作し、Googleの検索結果を取得することは可能です。なお、Googleの検索結果を取得する方法は、⬇︎の記事で詳しく解説しているので、ぜひ参考にしてください。

LaravelでWebスクレイピングをすると、データの保存や表示も簡単に行えます。とても便利な機能なので、ぜひ活用してみてください。

タイトルとURLをコピーしました