7
2

はじめに

こんにちは、エンジニアの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

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...
    }
}

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

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

以下のようにLaravelDocsSpider.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

titleはあっていそうです。

次はsubtitleです。

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

スクリーンショット 2024-07-03 14.10.35.png

subtitleもあっていそうです。

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

おわりに

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

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

参考

7
2
0

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
7
2