33
Help us understand the problem. What are the problem?

More than 3 years have passed since last update.

posted at

updated at

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

概要

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

導入

インストール

$ 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つ・・・?
ここはまだ調査をしてみます。

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
Sign upLogin
33
Help us understand the problem. What are the problem?