繁体   English   中英

Yahoo API的PHP代码,用于下载CSV文件

[英]PHP code for Yahoo API for downloading CSV file

我一直在使用Yahoo Financial API从Yahoo下载历史股票数据。 如本网站所报道,截至5月中旬,旧API已停止使用。 有很多帖子以新电话的形式提出,例如:

https://query1.finance.yahoo.com/v7/finance/download/AAPL?period1=315561600&period2=1496087439&interval=1d&events=history&crumb=XXXXXXXXXXX

以及获得面包屑的方法:

Yahoo Finance URL不起作用

但是我一定会误解该过程是什么,因为我总是会收到一条错误消息,说它“无法打开流:HTTP请求失败。HTTP / 1.0 201未经授权”。

下面是我的代码。 我们欢迎任何帮助。 我必须承认我是一个老的Fortran程序员,我的编码反映了这一点。

好路

法案

$ticker = "AAPL";
$yahooURL="https://finance.yahoo.com/quote/" .$ticker ."/history";
$body=file_get_contents($yahooURL);
$headers=$http_response_header;
$icount = count($headers);
for($i = 0; $i < $icount; $i ++)
{
    $istart = -1;
    $istop = -1;
    $istart = strpos($headers[$i], "Set-Cookie: B=");
    $istop = strpos($headers[$i], "&b=");
    if($istart > -1 && $istop > -1)
    {
        $Cookie = substr ( $headers[$i] ,$istart+14,$istop - ($istart + 14));
    }
}

$istart = strpos($body,"CrumbStore") + 22;
$istop = strpos($body,'"', $istart);
$Crumb = substr ( $body ,$istart,$istop - $istart);

$iMonth = 1;
$iDay = 1;
$iYear = 1980;
$timestampStart = mktime(0,0,0,$iMonth,$iDay,$iYear);
$timestampEnd = time();

$url =  "https://query1.finance.yahoo.com/v7/finance/download/".$ticker."?period1=".$timestampStart."&period2=".$timestampEnd."&interval=1d&events=history&crumb=".$Cookie."";

while (!copy($url, $newfile) && $iLoop < 10)
{
    if($iLoop == 9) echo "Failed to download data." .$lf;
    $iLoop = $iLoop + 1;
    sleep(1);
}

@Craig Cocca这并不是完全重复的,因为您提供的参考在python中提供了解决方案,对于使用php但尚未学习python的我们这些人没有太大帮助。 我希望看到用php作为解决方案。 我已经检查了yahoo页面并能够提取碎屑,但无法弄清楚如何将其放入流和GET调用中。 我最近(失败)的尝试是:

        $headers = [
        "Accept" => "*/*",
        "Connection" => "Keep-Alive",
        "User-Agent" => sprintf("curl/%s", curl_version()["version"])       
    ];

    // open connection to Yahoo
    $context = stream_context_create([
        "http" => [
            "header" => (implode(array_map(function($value, $key) { return sprintf("%s: %s\r\n", $key, $value); }, $headers, array_keys($headers))))."Cookie: $Cookie",
            "method" => "GET"
        ]
    ]);
    $handle = @fopen("https://query1.finance.yahoo.com/v7/finance/download/{$symbol}?period1={$date_now}&period2={$date_now}&interval=1d&events=history&crumb={$Crumb}", "r", false, $context);
    if ($handle === false)
    {
        // trigger (big, orange) error
        trigger_error("Could not connect to Yahoo!", E_USER_ERROR);
        exit;
    } 

    // download first line of CSV file
    $data = fgetcsv($handle);

这两个日期是unix编码日期,即:$ date_now = strtotime($ date);

我现在设法下载了股价历史记录。 目前,我只获取当前价格数据,但是我的下载方法会收到过去一年的历史数据。 (即,直到Yahoo决定在数据上放置其他块)。 我的解决方案使用“ simple_html_dom.php”解析器,该解析器已添加到我的/ includes文件夹中。 这是代码(从哈佛CS50课程的原始版本修改而来,我建议像我这样的初学者使用):

function lookup($symbol)
{
// reject symbols that start with ^
   if (preg_match("/^\^/", $symbol))
   {
       return false;
   }
// reject symbols that contain commas
   if (preg_match("/,/", $symbol))
   {
       return false;
   }
   // body of price history search
$sym = $symbol;
   $yahooURL='https://finance.yahoo.com/quote/'.$sym.'/history?p='.$sym;

// get stock name
$data = file_get_contents($yahooURL);
    $title = preg_match('/<title[^>]*>(.*?)<\/title>/ims', $data, $matches) ? $matches[1] : null;

$title = preg_replace('/[[a-zA-Z0-9\. \| ]* \| /','',$title);
$title = preg_replace('/ Stock \- Yahoo Finance/','',$title);
$name = $title;

// get price data - use simple_html_dom.php (added to /include)
$body=file_get_html($yahooURL);
$tables = $body->find('table');
$dom = new DOMDocument();
$elements[] = null;
$dom->loadHtml($tables[1]); 
$x = new DOMXpath($dom);
$i = 0;
foreach($x->query('//td') as $td){
        $elements[$i] = $td -> textContent." ";
    $i++;
}
$open = floatval($elements[1]); 
$high = floatval($elements[2]);
$low = floatval($elements[3]);
$close = floatval($elements[5]);
$vol = str_replace( ',', '', $elements[6]);
$vol = floatval($vol);
$date = date('Y-m-d');
$datestamp = strtotime($date);
$date = date('Y-m-d',$datestamp);
   // return stock as an associative array
   return [
        "symbol" => $symbol,
        "name" => $name,
        "price" => $close,
        "open" => $open,
        "high" => $high,
        "low" => $low,
        "vol" => $vol,
        "date" => $date
   ];
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM