2017-05-29 68 views
0

我一直在使用Yahoo Financial API从Yahoo下载历史股票数据。据该网站报道,截至5月中旬,旧API已停止使用。已经有很多帖子讨论了新呼叫的形式,例如:用于下载CSV文件的Yahoo API的PHP代码

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

除了获得碎块方法:

​​

但我必须误解是什么程序是因为我总是得到一个错误,说它“无法打开流:HTTP请求失败。HTTP/1.0 201 Unauthorized”。

以下是我的代码。任何和所有的援助是受欢迎的。我不得不承认,我是一位古老的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); 
} 
+1

的可能的复制[雅虎财经历史数据下载网址不工作(https://开头stackoverflow.com/questions/44044263/yahoo-finance-historical-data-downloader-url-is-not-working) –

回答

0

@Craig Cocca这是不完全重复的,因为你给的参考值给出Python中的解决方案,它对于我们这些谁使用PHP,但没有学习python并没有多大帮助。我很乐意看到解决方案与PHP。我已经检查了雅虎页面,并能够提取碎片,但无法解决如何将它放入流和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($日期);

0

我已经设法下载股价历史。目前我只是拿现在的价格数字,但我的下载方法收到过去一年的历史数据。 (即直到雅虎决定在数据上添加其他数据块)。 我的解决方案使用了我添加到我的/ includes文件夹中的“simple_html_dom.php”解析器。 下面是代码(从哈佛大学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 
    ]; 
}