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

时间:2017-05-29 20:17:42

标签: php csv yahoo-finance

我一直在使用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 not working

但我一定是误解了程序是什么,因为我总是得到一个错误,说它“无法打开流: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);
}

2 个答案:

答案 0 :(得分: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($ date);

答案 1 :(得分:0)

我现在设法下载股价历史记录。目前我只采用当前的价格数字,但我的下载方法收到了过去一年的历史数据。 (即雅虎决定在数据上加上其他一些块)。 我的解决方案使用&#34; simple_html_dom.php&#34;我已添加到my / includes文件夹的解析器。 这是代码(修改自哈佛CS50课程的原始版本,我推荐给像我这样的初学者):

private object gate = new object();
public void Squaring(int x)
{
    // Creates a random pause to check for thread
    int pauseFor = rnd.Next(1, 10);
    Thread.Sleep(pauseFor);

    lock (gate)
    {
        accum += x * x;
    }
}