LoginSignup
34

More than 5 years have passed since last update.

LaravelでGoutteを利用してWebスクレイピング

Last updated at Posted at 2018-11-20

概要

スクレイピングする機会があったので調査メモです。
インストールから、実際に情報を取得し表示するところまで。

導入

インストール

$ composer require weidner/goutte

設定

config/app.php
'providers' => [
    Weidner\Goutte\GoutteServiceProvider::class,
]

'aliases' => [
   'Goutte' => Weidner\Goutte\GoutteFacade::class,
]

実装

コマンドを作成

php artisan make:command Scraping

実行名を設定

App\Console\Command\Scraping
protected $signature = 'command:scraping';

取得処理

Amazonの商品一覧ページを取得してみます。

    /**
     * Execute the console command.
     *
     * @return mixed
     */
    public function handle()
    {
        $goutte = GoutteFacade::request('GET', 'https://www.amazon.co.jp/gp/s/ref=amb_link_1?ie=UTF8&field-enc-merchantbin=AN1VRQENFRJN5%7CA1RJCHJCQT9WV5&field-launch-date=30x-0x&node=2494234051&pf_rd_m=AN1VRQENFRJN5&pf_rd_s=merchandised-search-left-4&pf_rd_r=6CWTB56SQ1GK6RA30VVV&pf_rd_r=6CWTB56SQ1GK6RA30VVV&pf_rd_t=101&pf_rd_p=f72beb25-a5bc-4658-9aa6-7d92f73c2c8b&pf_rd_p=f72beb25-a5bc-4658-9aa6-7d92f73c2c8b&pf_rd_i=637394');
        $goutte->filter('ul#s-results-list-atf')->each(function ($ul) {
            $ul->filter('li')->each(function ($li) {
                dd($li);
            });
        });
    }

実行してみる

$ php artisan command:scraping

とりあえず取得はできたみたいです。
スクリーンショット 2018-11-20 14.48.44.png

商品の名前と値段とASINを取得してみる

先程のコードで商品ごとのリストアイテムタグは取得できているので、
各項目でどのように情報を取得するか確認しながら取ってみます。

商品の名前

スクリーンショット 2018-11-20 15.02.02.png

aタグのプロパティでタイトルが取れそうなので、以下の手順で取ります。

  • aタグのクラスをfilterで取得
  • aタグのプロパティをattrで取得

実装

$li->filter('.s-color-twister-title-link')->attr('title')

商品の価格

スクリーンショット 2018-11-20 15.10.06.png

こちらもクラスで取得してから、今度はテキストを取得します。

実装

$li->filter('.s-price')->text()

ASIN

アマゾンの商品識別コードです。
スクリーンショット 2018-11-20 15.12.10.png

こちらは最初に取得したliのプロパティとして存在しています。

実装

$li->attr('data-asin')

完成形

    /**
     * Execute the console command.
     *
     * @return mixed
     */
    public function handle()
    {
        $goutte = GoutteFacade::request('GET', 'https://www.amazon.co.jp/gp/s/ref=amb_link_1?ie=UTF8&field-enc-merchantbin=AN1VRQENFRJN5%7CA1RJCHJCQT9WV5&field-launch-date=30x-0x&node=2494234051&pf_rd_m=AN1VRQENFRJN5&pf_rd_s=merchandised-search-left-4&pf_rd_r=6CWTB56SQ1GK6RA30VVV&pf_rd_r=6CWTB56SQ1GK6RA30VVV&pf_rd_t=101&pf_rd_p=f72beb25-a5bc-4658-9aa6-7d92f73c2c8b&pf_rd_p=f72beb25-a5bc-4658-9aa6-7d92f73c2c8b&pf_rd_i=637394');
        $goutte->filter('ul#s-results-list-atf')->each(function ($ul) {
            $ul->filter('li')->each(function ($li) {
                echo "-------------\n";
                echo 'タイトル:' . $li->filter('.s-color-twister-title-link')->attr('title') . "\n";
                echo '参考価格:' . $li->filter('.s-price')->text() . "\n";
                echo 'ASIN:' . $li->attr('data-asin') . "\n";
                echo "-------------\n";
            });
        });
    }

実行結果

実行してみます!
スクリーンショット 2018-11-20 15.21.35.png

取れたは取れたんですが、なぜ4つ・・・?
ここはまだ調査をしてみます。

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
34