#はじめに
個人開発で学習の為、とあるWebサイトをスクレイピングする場面があったのですが
年齢認証のあるクッションページを突破する事が出来ず、躓いてしまったので忘備録として記事を書きます。
- フレームワークはLaravel5系を使用
- スクレイピングのライブラリはweidner/goutteを使用(参考サイト https://qiita.com/naoki0531/items/d8f95195028be4c18910)
- ターミナルでコマンドを入力するとスクレイピングの処理が走るという仕組みです。
#取得処理
プレステージのAV女優一覧ページを取得しようとしてみます。
$targetUrl = 'https://www.mgstage.com/?form=prestige_18kin&utm_medium=official&utm_source=prestige&utm_campaign=prestige_18kin&agef=1';
$crawler = $client->request('GET', $targetUrl);
$link = $crawler->selectLink('女優一覧へ')->link();
$clicked = $client->click($link);
上記説明すると、下記箇所でまず下記画像のページを取得しています。
$crawler = $client->request('GET', $targetUrl);
①女優一覧へというリンクを自動的に取得。
$link = $crawler->selectLink('女優一覧へ')->link();
② ①で取得したリンクをクリックしてくれる
$clicked = $client->click($link);
#取得結果を確認してみる
何故か上記画像の年齢認証ページへ自動的に遷移されてしまう。。
色々調べるとMGS女優一覧ページからリクエストを取得する処理の前後にクッキーをセットする処理が必要とのこと。
参考記事
上記参考記事を踏まえてもう一度スクレイピングの処理を下記のように修正しました。
$cookies = ['XXX', 'XXXXXXXXXXXXXXXXXXXXXXXXXXX'];
$client = new \Goutte\Client();
$client->getCookieJar()->updateFromSetCookie($cookies);
$targetUrl = 'https://www.mgstage.com/?form=prestige_18kin&utm_medium=official&utm_source=prestige&utm_campaign=prestige_18kin&agef=1';
$crawler = $client->request('GET', $targetUrl);
$link = $crawler->selectLink('女優一覧へ')->link();
$clicked = $client->click($link);
dd($clicked)
追加箇所としては下記です。
$cookies = ['XXX', 'XXXXXXXXXXXXXXXXXXXXXXXXXXX']; // ①
$client->getCookieJar()->updateFromSetCookie($cookies); // ②
①$cookiesでクッキーを配列で定義する
各サイトごとのクッキーの確認方法は下記記事を参考にしました
クッキーの確認方法
②の処理で$cookiesで定義したクッキーを、MGSのAV女優一覧ページを取得する際にセットしてます。
#再度取得結果を確認してみる
下記のようにAV女優の一覧ページを取得できるようになりました。
ページにさえアクセス出来れば、各女優名や画像等を一行ずつ取得することは簡単だと思います。
#おわりに
今回忘備録としてメモ代わりに記事を書いたので、年齢認証ページを突破する際に何故クッキーを定義する必要があるのか等、理解が甘い部分があるのでその辺りは今後の課題とさせて頂きます。※また理解出来た箇所は追記していきます。
またもっとスマートに取得できる方法等あれば、コメント等で教えて頂けますとありがたいです。
最後に大切な部分ですが、他サイトのデータをスクレイピングをする際は、著作権が絡んでいること、サーバーに負荷をかけないようページの取得処理の前後にスリープ処理を施す必要があることを忘れないようにしていきます。