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

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

# 導入
## インストール
```bash
$ composer require weidner/goutte
```

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

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

# 実装
## コマンドを作成
```bash
php artisan make:command Scraping
```

## 実行名を設定
```php:App\Console\Command\Scraping
protected $signature = 'command:scraping';
```

## 取得処理
[Amazonの商品一覧ページ](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)を取得してみます。

```bash
    /**
     * 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);
            });
        });
    }
```

# 実行してみる
```bash
$ php artisan command:scraping
```

とりあえず取得はできたみたいです。
<img width="250" alt="スクリーンショット 2018-11-20 14.48.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/58712/baf44063-1237-026f-a8de-bbb03bc44ac6.png">

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

## 商品の名前
![スクリーンショット 2018-11-20 15.02.02.png](https://qiita-image-store.s3.amazonaws.com/0/58712/66c295dd-ea27-fcab-0835-04bad446b5fa.png)

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

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

### 実装
```php
$li->filter('.s-color-twister-title-link')->attr('title')
```

## 商品の価格
![スクリーンショット 2018-11-20 15.10.06.png](https://qiita-image-store.s3.amazonaws.com/0/58712/fed305b8-3408-a942-da1d-3ed2479b4724.png)

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

### 実装
```php
$li->filter('.s-price')->text()
```

## ASIN
アマゾンの商品識別コードです。
![スクリーンショット 2018-11-20 15.12.10.png](https://qiita-image-store.s3.amazonaws.com/0/58712/5c9f3dbd-9429-bae6-397c-db0313b6c3db.png)

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

### 実装
```php
$li->attr('data-asin')
```

## 完成形
```php
    /**
     * 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";
            });
        });
    }
```

## 実行結果
実行してみます！
<img width="500" alt="スクリーンショット 2018-11-20 15.21.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/58712/3d08f504-f7a7-a992-4db9-9ae4dc928b85.png">

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