【Laravel11】Roach PHPでスクレイピングをする

# はじめに

こんにちは、エンジニアのkeitaMaxです。

今回はLaravel11とRoach PHPでスクレイピングしてみようと思います。

# Roach PHPとは

>Roach is a complete web scraping toolkit for PHP.
(引用:https://roach-php.dev/docs/introduction)

Roach PHPはスクレイピングをするためのPHPのライブラリです。

# インストール

以下のコマンドでインストールします。

```
composer require roach-php/laravel
```

# ファイル作成

スクレイピング用のファイルを以下のコマンドで作成します。

```
php artisan roach:spider LaravelDocsSpider
```

すると、`src/app/Spiders/`に`LaravelDocsSpider`ファイルが作成されます。

![スクリーンショット 2024-07-03 11.21.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3715123/ef19ab89-bc19-d198-c17b-7313ee12be44.png)


```php:LaravelDocsSpider.php
<?php

namespace App\Spiders;

use Generator;
use RoachPHP\Downloader\Middleware\RequestDeduplicationMiddleware;
use RoachPHP\Extensions\LoggerExtension;
use RoachPHP\Extensions\StatsCollectorExtension;
use RoachPHP\Http\Response;
use RoachPHP\Spider\BasicSpider;
use RoachPHP\Spider\ParseResult;

class LaravelDocsSpider extends BasicSpider
{
    public array $startUrls = [
        //
    ];

    public array $downloaderMiddleware = [
        RequestDeduplicationMiddleware::class,
    ];

    public array $spiderMiddleware = [
        //
    ];

    public array $itemProcessors = [
        //
    ];

    public array $extensions = [
        LoggerExtension::class,
        StatsCollectorExtension::class,
    ];

    public int $concurrency = 2;

    public int $requestDelay = 1;

    /**
     * @return Generator<ParseResult>
     */
    public function parse(Response $response): Generator
    {
        // todo...
    }
}

```

# スクレイピングの処理を作成

https://roach-php.dev/docs/spiders/

使用方法が上のURLに書いてあるので、これをもとに実装していこうと思います。

以下のように`LaravelDocsSpider.php`ファイルを修正しました。

```php:LaravelDocsSpider.php
<?php

namespace App\Spiders;

use RoachPHP\Http\Response;
use RoachPHP\Spider\BasicSpider;

class LaravelDocsSpider extends BasicSpider
{
    /**
     * @var string[]
     */
    public array $startUrls = [
        'https://roach-php.dev/docs/spiders'
    ];

    public function parse(Response $response): \Generator
    {
        $title = $response->filter('h1')->text();

        $subtitle = $response
            ->filter('main > div:nth-child(2) p:first-of-type')
            ->text();

        yield $this->item([
            'title' => $title,
            'subtitle' => $subtitle,
        ]);
        echo($title),("\n");
        echo($subtitle),("\n");
    }
}

```

# スクレイピングの実行

早速実行してみます。
以下のコマンドで実行します。

```
php artisan roach:run Laraveldocsspider
```

実行すると以下のように出力されます。

```
root@1460808f039b:/app# php artisan roach:run Laraveldocsspider
Spiders
Basic Concepts
root@1460808f039b:/app# 
```
title:Spiders
subtitle:Basic Concepts

と取れました。実際に`https://roach-php.dev/docs/spiders`をみて合っているか確認します。

titleは一番最初の'h1'タグをみています。ページのHTMLは以下のようになっていました。

![スクリーンショット 2024-07-03 13.15.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3715123/58d06192-a3fb-97dc-13a9-a4ae0797108e.png)

titleはあっていそうです。

次はsubtitleです。

subtitleは'main > div:nth-child(2) p:first-of-type'です。

![スクリーンショット 2024-07-03 14.10.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3715123/5416d965-8146-d5a5-a84d-fb315f457d4c.png)

subtitleもあっていそうです。

これでスクレイピングできました。

# おわりに

この記事での質問や、間違っている、もっといい方法があるといったご意見などありましたらご指摘していただけると幸いです。

最後まで読んでいただきありがとうございました！

# 参考

https://roach-php.dev/docs/laravel