phpの質問で、

外部サイトから一部の情報を抜き出して自分のサイトに表示させたいのですが
全体を取得する方法はfile_get_contentsというところまではわかったのですが
一部取得して表示するというのがわかりません。教えてください。
具体的には
http://www.jra.go.jp/JRADB/access5.html
こちらのサイトの
「1レース」から「413票」までのテーブルです。

よろしくお願いします。

回答の条件
  • 1人5回まで
  • 13歳以上
  • 登録:2012/02/17 14:28:14
  • 終了:2012/02/18 10:59:37

ベストアンサー

id:shell631 No.1

shell631回答回数9ベストアンサー獲得回数32012/02/17 20:24:46

ポイント100pt

変数 $tableに目的のHTML文が入るようになっています。
JRAのトップページからアクセスしないと目的のページに行き着かないので、プログラムの実行に少し時間がかかります。

<?php
// JRAアクセス専用
function httpJRA($path, $cname) {
    $host = 'www.jra.go.jp';
    $cname = 'cname=' . urlencode($cname);
    $ln = strlen($cname);

    $request .= "POST {$path} HTTP/1.1\r\n";
    $request .= "Host: www.jra.go.jp\r\n";
    $request .= "User-Agent: Mozilla/5.0\r\n";
    $request .= "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n";
    $request .= "Accept-Language: ja,en-us;q=0.7,en;q=0.3\r\n";
    $request .= "Accept-Encoding: gzip, deflate\r\n";
    $request .= "Connection: keep-alive\r\n";
    $request .= "Referer: http://www.jra.go.jp/\r\n";
    $request .= "Cookie: style=null\r\n";
    $request .= "Content-Type: application/x-www-form-urlencoded\r\n";
    $request .= "Content-Length: {$ln}\r\n";
    $request .= "\r\n";
    $request .= "{$cname}\r\n";

    $fp = fsockopen($host, 80);
    if (!$fp)   return FALSE;
    fputs($fp, $request);

    $response = "";
    while (1) {
        $str = fgets($fp);
        if (feof($fp) && ($str == FALSE))   break;
        $response .= $str;
    };
    fclose($fp);

    return $response;
}

//トップページ解析
function topJRA() {
    $infp = fopen('http://www.jra.go.jp', 'r');
    if ($infp == FALSE)     return FALSE;
    $cname = '';
    while (! feof($infp)) {
        $str = trim(fgets($infp));
        $str = mb_convert_encoding($str, 'UTF-8', 'SJIS');
        if (preg_match("/doAction\(\'\/JRADB\/accessH\.html\',\'([0-9a-zA-Z\/]+)\'\)\">払戻金/iu", $str, $arr) > 0) {
            $cname = $arr[1];
        }
    }
    return $cname;
}

//払戻金ページ解析
function haraiJRA($cname) {
    $path = '/JRADB/accessH.html';
    $str = httpJRA($path, $cname);
    $str = mb_convert_encoding($str, 'UTF-8', 'SJIS');
    if ($str == FALSE)  return FALSE;
    if (preg_match("/doAction\(\'\/JRADB\/access5\.html\',\'([0-9a-zA-Z\/]+)\'\)/iums", $str, $arr) > 0) {
        $cname = $arr[1];
    }
    return $cname;
}

//WIN5ページ解析
function win5JRA($cname) {
    $path = '/JRADB/access5.html';
    $buf = httpJRA($path, $cname);
    $buf = mb_convert_encoding($buf, 'UTF-8', 'SJIS');
    if ($buf == FALSE)  return FALSE;
    $flag = FALSE;
    $str = strtok($buf, "\n");
    while ($str != FALSE) {
        if ($flag == FALSE) {
            if (preg_match("/bgcolor\=\"#D9D9B0\">\&nbsp;<\/th>/iu", $str) > 0) {
                $flag = TRUE;
                $res = "<tr>\n" . $str . "\n";
            }
        } else {
            if (preg_match("/bgcolor=\"#D9D9B0\">出走取消<br>競走除外<\/th>/iu", $str) > 0) {
                $flag = FALSE;
                break;
            } else {
                $res .= $str . "\n";
            }
        }
        $str = strtok("\n");
    }
    $ln = strlen($res);

    return substr($res, 0, $res - 5);
}

//メインプログラム
$cname = topJRA();
if ($cname == FALSE) {
    echo 'JRAのサイトに接続できません';
    exit(1);
}
$cname = haraiJRA($cname);
if ($cname == FALSE) {
    echo 'JRAのサイトに接続できません';
    exit(1);
}
$table = win5JRA($cname);
echo $table;    //表の内容
?>
  • id:oil999
    私は回答拒否されているので回答できませんが
    ご質問のページにアクセスすると

    エラー013
    パラメータエラー
    ご指定のページに接続できませんでした。
    ・ URLをもう一度お確かめください。

    となります。
    会員制のページではありませんか?
    ご確認ください。
  • id:vfr6822
    あ、ほんとだ。すみません。
    http://www.jra.go.jp/から左下にある「払戻金」→「2月12日」の箇所のWIN5というページなんですが・・・
    正式なURLを公開していないから難しいのでしょうか?

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

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

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

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません