はじめに
こんにちは、エンジニアの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
ファイルが作成されます。
<?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
ファイルを修正しました。
<?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は以下のようになっていました。
titleはあっていそうです。
次はsubtitleです。
subtitleは'main > div:nth-child(2) p:first-of-type'です。
subtitleもあっていそうです。
これでスクレイピングできました。
おわりに
この記事での質問や、間違っている、もっといい方法があるといったご意見などありましたらご指摘していただけると幸いです。
最後まで読んでいただきありがとうございました!
参考