Edited at

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


概要

以下の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

以上です。