Goutte使ってスクレイピングをするとき、例えば格闘技のサイトで、選手の名前を取得したいとき、こんなコードかくと思います。
$client = new Client();
$crawler = $client->request('GET', 'http://hogehoge.com/fighter/100');
$name = $crawler->filter('#fighter_name')->first()->text();
ただ、URLが存在しない場合、上記だと100番目の選手が存在しない場合、トップページとかに飛ばされると思います。
このとき、#fighter_nameな要素が存在しないと、データが取得できなくて例外が投げられてしまいます。
うーん、例外をキャッチしてもいいんですけど・・・。
どうしたか
色々調べたら、ClientがURLの履歴を管理していることが分かりました。
リダイレクトした場合、最新にrequest時のURLではなく、リダイレクト後のURLが挿入されます。
なので、こんな風にするとリダイレクトしたかどうかがわかると思います。
$targetUrl = 'http://hogehoge.com/fighter/100';
$client = new Client();
$crawler = $client->request('GET', $targetUrl);
$currentUrl = $client->getHistory()->current()->getUri();
if ($targetUrl !== $currentUrl) {
// リダイレクト
}
私の場合、色んなリダイレクトが発生するようなサイトのスクレイピングに挑戦したので、リダイレクト先を判断するために、最初はリダイレクト後に固有で存在する要素をチェックしてました。
が、面倒だったため、crawlerで要素を取得する前にリダイレクトしてないか、した場合はリダイレクト先はどこなのかを、必ずURLで確認するようにしました。