24
27

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Goutte(グート)を使ったLaravel スクレイピング

Last updated at Posted at 2019-08-11

#概要
以下の4点についてまとめます。

  • Goutteの導入
  • Goutteの設定
  • データの取得方法
  • 取得データの表示

#Goutteの導入
作成中のLaravelフォルダに、cdコマンドで移動後、コンポーザーをダウンロード

コマンドライン
$ composer require weidner/goutte

#Goutteの設定
configフォルダのapp.phpファイルに
Weidner\Goutte\GoutteServiceProvider::class,
'Goutte' => Weidner\Goutte\GoutteFacade::class,を追加

config/app.php
'providers' => [
    //省略

        /*
         * Package Service Providers...
         */
           //ここに一行追加----------------------------------//
           Weidner\Goutte\GoutteServiceProvider::class, 

        /*
         * Application Service Providers...
         */
        App\Providers\AppServiceProvider::class,
        App\Providers\AuthServiceProvider::class,

    //省略
]

'aliases' => [
    //省略

        'Event' => Illuminate\Support\Facades\Event::class,
        'File' => Illuminate\Support\Facades\File::class,
        'Gate' => Illuminate\Support\Facades\Gate::class,

        //ここに一行追加-------------------------------------//
        'Goutte' => Weidner\Goutte\GoutteFacade::class,

        'Hash' => Illuminate\Support\Facades\Hash::class,
        'Lang' => Illuminate\Support\Facades\Lang::class,
        'Log' => Illuminate\Support\Facades\Log::class,

    //省略
]

#データの取得方法

スクレイピングしてきた情報を表示したいページのコントローラーに、以下の内容を記述

SampleController.php
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

//ここに一行追加-------------------------------------//
use Weidner\Goutte\GoutteFacade as GoutteFacade;

class SampleController extends Controller
{
    public function index()
    {
        // ここではアマゾンカメラランキングをスクレイピング
        $goutte = GoutteFacade::request('GET', 'https://www.amazon.co.jp/gp/bestsellers/electronics/3946818051?ref_=Oct_BSellerC_3946818051_SAll&pf_rd_p=7019a35e-d4ad-5da4-8fdd-f9f5c8ef9428&pf_rd_s=merchandised-search-10&pf_rd_t=101&pf_rd_i=3946818051&pf_rd_m=AN1VRQENFRJN5&pf_rd_r=61C7KYXHQFEAY80RGM67&pf_rd_r=61C7KYXHQFEAY80RGM67&pf_rd_p=7019a35e-d4ad-5da4-8fdd-f9f5c8ef9428');

        //画像を取得するための配列を準備
        $images = array();
        //テキストを取得するための配列を準備
        $texts = array();

        //画像のsrc部分を取得
        $goutte->filter('.a-dynamic-image')->each(function ($node) use (&$images) {
            $images[] = $node->attr('src');
        });

        //テキストを取得
        $goutte->filter('.p13n-sc-truncate')->each(function ($node) use (&$texts) {
            $texts[] = $node->text();
        });

        $params = [
            'images' => $images,
            'texts' => $texts,
        ];
        return view('index', $params);
    }
}

詳しく解説すると、

use Weidner\Goutte\GoutteFacade as GoutteFacade;

を追加し、

$goutte = GoutteFacade::request('GET', 'URL');

を記述する。URLの部分は、自分が情報を取得したいページのURLを記述する。
次に、

$sample = array();

を記述し、取得した情報を入れる配列を用意。**$sample(変数)**の部分は自分で決めて良い。
最後に、

$goutte->filter('.sample')->each(function ($node) use (&$sample) {
            $sample[] = $node->text();
        });

を記述し、情報を取得する。
**.sample(クラス名)**の部分は、自分が情報を取得したいページで、検証を行い、該当箇所のクラス名を取得してくる。

&$sampleと、$sampleの部分は、先ほど用意した配列の変数名を記述する。

#取得データの表示

あとは簡単です。Viewに表示の記述を追加して終了です。

sample.blade.php
@for($i = 0; $i < count($texts); $i++)
  <p>{{ $texts[$i] }}</p>
@endfor

以上です。

24
27
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
24
27

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?