PHPについて質問です。


先日に引き続き、マーケティングで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で②、④のような事を実現する事はできるのでしょうか?

お手数をおかけしますが、わかるかたおりましたらご回答をお待ちしております。

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2009/09/24 21:38:11
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:makeworld No.2

回答回数75ベストアンサー獲得回数23

ポイント100pt

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);

?>
id:aiomock

ご回答ありがとうございます。

2009/09/24 00:52:05

その他の回答1件)

id:tobeoscontinue No.1

回答回数220ベストアンサー獲得回数59

ポイント35pt

③はリダイレクトによるものなのでレスポンスヘッダーにあるステータスコードを調べることで判断することができます。

④はリダイレクトの場合、レスポンスヘッダーに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;
?>
id:aiomock

ご回答ありがとうございます。

2009/09/24 00:19:03
id:makeworld No.2

回答回数75ベストアンサー獲得回数23ここでベストアンサー

ポイント100pt

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);

?>
id:aiomock

ご回答ありがとうございます。

2009/09/24 00:52:05
  • id:aiomock
    環境のバージョンですが以下のようになります。

    phpMyAdmin - 2.11.9.5

    MySQL : 4.0.27

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません