Yahoo Financeからの株価自動取得ツールを更新

January 28, 2015 – 9:27 am

Web公開情報から株価を自動取得しFlotでチャート化」で紹介しておいたYahoo Finance からの株価自動取得ツールが、Yahoo Financeのデータ表示(画面)仕様が変わったため動作しなくなっていた。この仕様変更、1月7日の午前中に行われた。

 この仕様変更に対応するため、株価自動取得ツールに含まれるソースのうち変更した関数getStockPrices()(php ファイルfinance.php上に収録)をアップしておいた。

finance.php

<?php
function getStockPrices($stockcodes) {
//
    $nr = sizeof($stockcodes);
    $str_codes = "";
    for ( $k=0; $k<$nr; $k++ ) {
        // echo $stockcodes[$k] . "\n";
        $str_codes = $str_codes . urlencode($stockcodes[$k]);
        if ( $k < $nr-1 ) $str_codes = $str_codes . "+";
    }
    $url ="http://info.finance.yahoo.co.jp/search/?query=" . $str_codes . "&ei=UTF-8&view=l1";
    echo $url;
//
    $ch  = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    $feed = curl_exec($ch);
    echo $feed;
    curl_close($ch);
//
    $stock_value = array();

    // 株価コード
    // $n = preg_match_all("/code=([^<]+)\" data-/",$feed, $cell, PREG_PATTERN_ORDER);
    $n = preg_match_all("/highlight\">\[([^<]+)\]<\/span>/",$feed, $cell, PREG_PATTERN_ORDER);
    echo "nn = " . $n . "\n";
    if ( $n == $nr ) for( $i= 0; $i<$n; $i++ ) $stock_value[0][] = $cell[1][$i];
    else return -1;

    // 日付/時間 出来高
    // $n = preg_match_all("/<td nowrap>\n([^<]+)<\/td>/s", $feed, $cell, PREG_PATTERN_ORDER);
    $n = preg_match_all("/<dd class=\"time\">([^<]+)<\/dd>/s", $feed, $cell, PREG_PATTERN_ORDER);
    if ( $n == $nr ) {
       for($i= 0;$i<$n;$i++) {
                             $stock_value[1][] = $cell[1][$i];
                             // $stock_value[2][] = $cell[1][$i+1];
       }
    }
    else return -1;
    // 株価
    // $n = preg_match_all("/<td><strong>([^<]+)<\/strong><\/td>/s", $feed, $cell, PREG_PATTERN_ORDER);
    $n = preg_match_all("/<dt class=\"price yjXXL\">([^<]+)<\/dt>/s", $feed, $cell, PREG_PATTERN_ORDER);
    if ( $n == $nr ) for( $i= 0; $i<$n; $i++ ) $stock_value[3][] = $cell[1][$i];
    else return -1;    // 銘柄
    // $n = preg_match_all("/<strong class=\"ico.*\">([^<]+)<\/strong>/",$feed, $cell, PREG_PATTERN_ORDER);
    $n = preg_match_all("/<span class=\"name highlight\">([^<]+)<\/span>/",$feed, $cell, PREG_PATTERN_ORDER);
    if ( $n == $nr ) for( $i= 0; $i<$n; $i++ ) $stock_value[4][] = $cell[1][$i];
    else return -1;
//
    return $stock_value;
}

?>

変更に係る注意点:1月7日のYahoo Financeの変更により、一度に処理できる銘柄数が15銘柄になっている。これに対応するため、データベース上に登録していた銘柄を一部削除している。


Post a Comment