我一直在使用Yahoo Financial API从Yahoo下载历史股票数据。正如本网站报道的那样,截至5月中旬,旧的API已经停产。有许多帖子涉及新呼叫的形式,例如:
以及获得面包屑的方法:
但我一定是误解了程序是什么,因为我总是得到一个错误,说它“无法打开流: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);
}
答案 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;
}
}