戻る
2021-04-18
Laravel

LaravelのHttpクライアントとSymfonyのDomCrawler

今のGoutteはSymfonyのHttpBrowserでしかない。 https://github.com/FriendsOfPHP/Goutte

use Symfony\Component\BrowserKit\HttpBrowser;

class Client extends HttpBrowser
{
}

HttpBrowserはSymfonyのHttpClientとDomCrawlerの組み合わせ。
「LaravelのHttpクライアント(Guzzle)」とDomCrawlerでも同じことができる。

1. dom-crawlerをインストール

composer require symfony/dom-crawler

crawler() マクロを作る

AppServiceProviderで

namespace App\Providers;

use Illuminate\Http\Client\Response;
use Illuminate\Support\ServiceProvider;
use Symfony\Component\DomCrawler\Crawler;

class AppServiceProvider extends ServiceProvider
{
    public function boot()
    {
        Response::macro('crawler', function (): Crawler {
            return new Crawler($this->body());
        });
    }
}

Responseに対してマクロを追加。

使い方

簡易版

use Illuminate\Support\Facades\Http;

$crawler = Http::get($url)->crawler();

PHP7.4以上&エラー処理まで考えると。

$response = rescue(fn () => Http::get($url));

if (! $response || $response->failed()) {
    return;
}

$crawler = $response->crawler();

$crawler以降はGoutteと同じ。ここもrescue()使うとCrawlerの例外を無視できる。

$urls = rescue(fn () => $crawler->filter('a')->extract(['href']));
投稿者 Invokable
コメントを書くにはログインしてください。
登録 ログイン