PHP:クッキーが必要なサイトをスクレイピングする方法

例えばサイトの一部で「OK」ボタンを押さないと、見られないページがあったりします。
「この先進撃されたグロ画像があるけどよいですか」→「∠(゚Д゚)/イェーガァ!」みたいな。
意味がわからない人はスルーしてください。

ブラウザの処理としては、

(1)ユーザーが見たいと思うページのURLを叩くとアラート画面にリダイレクトする
(2)「OK」ボタンを押すとクッキーに値が入力されローカルに保存される
(3)ローカルのクッキーを参照したうえでユーザーが見たいページに遷移する
(4)ユーザーにページを見せる

というような処理を行なっています。

これを自動で行う場合、いわゆるスクレイピングしようとすると、当然クッキーがないので(1)のページではねられ、そのままアラート画面で止まってしまいます。
ログイン、ログアウト、セッションが関わってくるともっと複雑なのですが、今回はボタンを一つ押してクッキーを保存すればよいだけなのでチャレンジしてみました。

ちなみによそのブログを覗いてもなかなか上手くできず苦戦しました。
普通スクレイピングするときは単純に、

file_get_contents($url);

を使います。
このほうが簡単です。

でも今回の場合、先の(1)〜(4)の処理をそのままなぞらないといけません。
(2)の「この先に進みますか?」という問いかけに対する「OKボタン」のようなものがあると思うので、そのリンク先のURLを$cookieなどの変数に入れておきます。

<?php
//クッキー取得のためのURL
//ここにアクセスすればクッキーにフラグが立つというページ
$cookie='http://hogehoge.com/gate?target=r18&ck=1';

//最終的にアクセスしたいページ
//クッキーがないとアクセスできない
$url='http://hogehoge.com/glopage.php?id=xxxxxxxxxxxx';

//クッキー取得のためのアクセス
$ch=curl_init();//初期化
curl_setopt($ch,CURLOPT_URL,$cookie);//cookieを取りに行く
curl_setopt($ch,CURLOPT_HEADER,FALSE);//httpヘッダ情報は表示しない
curl_setopt($ch,CURLOPT_RETURNTRANSFER,TRUE);//データをそのまま出力
curl_setopt($ch,CURLOPT_COOKIEJAR,'cookie.txt');//$cookieから取得した情報を保存するファイル名
curl_setopt($ch,CURLOPT_FOLLOWLOCATION,TRUE);//Locationヘッダの内容をたどっていく
curl_exec($ch);
curl_close($ch);//いったん終了

//見たいページにアクセス
$ch=curl_init();
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_HEADER,FALSE);
curl_setopt($ch,CURLOPT_COOKIEFILE, 'cookie.txt');//cookie情報を読み取る
curl_setopt($ch,CURLOPT_RETURNTRANSFER,TRUE);
curl_setopt($ch,CURLOPT_FOLLOWLOCATION,TRUE);
$html=curl_exec($ch);
curl_close($ch);

mb_language('Japanese');
$html=mb_convert_encoding($html,'utf8','auto');//UTF-8に変換
print $html;
?>

これをそのままコピペすると、アラートページを中継せず、普通にアクセスした時のようにブラウザで見ることができるはずです。

注意すべき点は、cookie.txtを同じディレクトリに置いてアクセス権を変えておくこと。
自分以外も書き込めるようにしておかないと無反応になります。
ディレクトリを変えたければ「’cookie.txt’」部分を相対/絶対パスにすればOK。

クッキーをPOSTで取得しなければいけない場合の方法はこちらです。
 

コメントを残す

メールアドレスが公開されることはありません。

*

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください