2021-04-18
Laravel
LaravelのHttpクライアントとSymfonyのDomCrawler
3年前の記事です。
Laravelは古い情報は全く役に立たないので絶対に参考にしないでください。
コメントに新しい情報がないか確認してください。
今のGoutteはSymfonyのHttpBrowserでしかない。
Goutte, a simple PHP Web Scraper. Contribute to FriendsOfPHP/Goutte development by creating an account on GitHub.
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']));