先日に引き続き、マーケティングでWEBからデータを収集することをしているのですが
再度わからない点が出てきたため質問をさせていただきます。
今回行いたいことですが、
①http://page12.auctions.yahoo.co.jp/jp/auction/p170009654
のURLの末尾の p170009654 を c210666342 に変更し
②一度 http://page12.auctions.yahoo.co.jp/jp/auction/c210666342 の画面へ飛びます。
③すると http://page12.auctions.yahoo.co.jp/jp/auction/c210666342
が
http://page3.auctions.yahoo.co.jp/jp/auction/c210666342
に変わるので
その後
④URLを変数に保存して
前回に引き続きデータの収集をしたいと考えているのですが、②とその後の④が具体的にわかりません。
PHPで②、④のような事を実現する事はできるのでしょうか?
お手数をおかけしますが、わかるかたおりましたらご回答をお待ちしております。
fopen()は、リダイレクトを処理してくれるので、page12を開いてもpage3のHTMLを取得できます。
リダイレクト先のURLは、stream_get_meta_data()の中から'location: 'を探せば良いと思います。
<?php $URL = 'http://page12.auctions.yahoo.co.jp/jp/auction/c210666342'; $html = ''; $fp = fopen($URL, 'r') or die("fopen"); $meta_data = stream_get_meta_data($fp); foreach($meta_data['wrapper_data'] as $response) { /* リダイレクトされた? */ if (substr(strtolower($response), 0, 10) == 'location: ') { $URL = substr($response, 10); } } print "URL = ($URL)\n"; while (!feof($fp)) { $html .= fread($fp, 1024); } fclose($fp); ?>
③はリダイレクトによるものなのでレスポンスヘッダーにあるステータスコードを調べることで判断することができます。
④はリダイレクトの場合、レスポンスヘッダーにLocationとしてリダイレクト先のurlが示されることになっているのでこれを変数に保存すればいいでしょう。
レスポンスヘッダーを入手するにはfsockopenを使うことは可能でしょうが、細か過ぎるように思います。
pecl_httpをインストールできればhttp_get()したものをhttp_parse_headers()することでステータスコードとリダイレクと先のurlを入手できますが環境によってはpecl_httpのインストールが難しいかもしれません。
<?php $response = http_get("http://page12.auctions.yahoo.co.jp/jp/auction/c210666342", array(), $info); if ($response === FALSE) print_r($info); else { print_r($info); echo "----------------------\n"; print_r(http_parse_headers($response)); } ?>
cURLは自動で多くのことをやってしまうのですがredirect_countを調べることでリダイレクトされたかどうかを判断できますし、CURLOPT_FOLLOWLOCATIONを設定することでurlがリダイリクト先のurlになるので、このurlを最初に指定したものと同じかどうかでも判断できます。
<?php $ch = curl_init("http://page12.auctions.yahoo.co.jp/jp/auction/c210666342"); //curl_setopt($ch, CURLOPT_MAXREDIRS, 5); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE); curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1); // 実行します $response = curl_exec($ch); $info = curl_getinfo($ch); curl_close($ch); print_r($info); echo "---------------------------------------\n"; echo $response; ?>
ご回答ありがとうございます。
fopen()は、リダイレクトを処理してくれるので、page12を開いてもpage3のHTMLを取得できます。
リダイレクト先のURLは、stream_get_meta_data()の中から'location: 'を探せば良いと思います。
<?php $URL = 'http://page12.auctions.yahoo.co.jp/jp/auction/c210666342'; $html = ''; $fp = fopen($URL, 'r') or die("fopen"); $meta_data = stream_get_meta_data($fp); foreach($meta_data['wrapper_data'] as $response) { /* リダイレクトされた? */ if (substr(strtolower($response), 0, 10) == 'location: ') { $URL = substr($response, 10); } } print "URL = ($URL)\n"; while (!feof($fp)) { $html .= fread($fp, 1024); } fclose($fp); ?>
ご回答ありがとうございます。
ご回答ありがとうございます。