Yahoo Finance URL无效

dsit 发布于 2019-10-13 最后更新 2019-10-13 16:03 326 浏览

我一直在使用以下URL从雅虎财经获取历史数据很长一段时间,但从昨天起停止工作。 https://ichart.finance.yahoo.com/table.csv?s=SPY 当浏览这个网站时,它说:

Will be right back... Thank you for your patience. Our engineers are working quickly to resolve the issue.
但是,自从昨天以来这个问题仍然存在,我开始认为他们已经停止了这项服务? 我的SO搜索仅指向this topic,与https相关,但... 有没有人遇到过这个问题? 我该如何解决这个问题?他们是否提供了不同的访问他们的历史数据?
已邀请:

onon

赞同来自:

我设法找到一个.NET类来从Yahoo Finance获得有效的令牌(cookie和crumb) 有关从新的Yahoo Finance获取历史数据的完整API库,您可以访问Github中的YahooFinanceAPI 这是抓住cookie和面包屑的类 Token.cs

using System;
using System.Diagnostics;
using System.Net;
using System.IO;
using System.Text.RegularExpressions;
namespace YahooFinanceAPI
{
    /// <summary>
    /// Class for fetching token (cookie and crumb) from Yahoo Finance
    /// Copyright Dennis Lee
    /// 19 May 2017
    /// 
    /// </summary>
    public class Token
    {
        public static string Cookie { get; set; }
        public static string Crumb { get; set; }
private static Regex regex_crumb;
        /// <summary>
        /// Refresh cookie and crumb value Yahoo Fianance
        /// </summary>
        /// <param name="symbol">Stock ticker symbol</param>
        /// <returns></returns>
        public static bool Refresh(string symbol = "SPY")
        {
try
            {
                Token.Cookie = "";
                Token.Crumb = "";
string url_scrape = "https://finance.yahoo.com/quote/{0}?p={0}";
                //url_scrape = "https://finance.yahoo.com/quote/{0}/history"
string url = string.Format(url_scrape, symbol);
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url);
request.CookieContainer = new CookieContainer();
                request.Method = "GET";
using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
                {
string cookie = response.GetResponseHeader("Set-Cookie").Split(';')[0];
string html = "";
using (Stream stream = response.GetResponseStream())
                    {
                        html = new StreamReader(stream).ReadToEnd();
                    }
if (html.Length < 5000)
                        return false;
                    string crumb = getCrumb(html);
                    html = "";
if (crumb != null)
                    {
                        Token.Cookie = cookie;
                        Token.Crumb = crumb;
                        Debug.Print("Crumb: '{0}', Cookie: '{1}'", crumb, cookie);
                        return true;
                    }
}
}
            catch (Exception ex)
            {
                Debug.Print(ex.Message);
            }
return false;
}
/// <summary>
        /// Get crumb value from HTML
        /// </summary>
        /// <param name="html">HTML code</param>
        /// <returns></returns>
        private static string getCrumb(string html)
        {
string crumb = null;
try
            {
                //initialize on first time use
                if (regex_crumb == null)
                    regex_crumb = new Regex("CrumbStore\":{\"crumb\":\"(?<crumb>.+?)\"}", 
                RegexOptions.CultureInvariant | RegexOptions.Compiled, TimeSpan.FromSeconds(5));
MatchCollection matches = regex_crumb.Matches(html);
if (matches.Count > 0)
                {
                    crumb = matches[0].Groups["crumb"].Value;
                }
                else
                {
                    Debug.Print("Regex no match");
                }
//prevent regex memory leak
                matches = null;
}
            catch (Exception ex)
            {
                Debug.Print(ex.Message);
            }
GC.Collect();
            return crumb;
}
}
}
更新于6月17日
归功于@ Ed0906
将crumb正则表达式模式修改为Regex("CrumbStore\":{\"crumb\":\"(?<crumb>.+?)\"}"

ab_non

赞同来自:

对于java爱好者。 您可以通过这种方式从URLConnection访问您的cookie。

 //  "https://finance.yahoo.com/quote/SPY";
 URLConnection con = url.openConnection();
 ...  
 for (Map.Entry<String, List<String>> entry : con.getHeaderFields().entrySet()) {
        if (entry.getKey() == null 
            || !entry.getKey().equals("Set-Cookie"))
            continue;
        for (String s : entry.getValue()) {
           // store your cookie
           ...
        }
 }
现在你可以搜索雅虎网站中的面包屑:
String crumb = null;
InputStream inStream = con.getInputStream();
InputStreamReader irdr = new InputStreamReader(inStream);
BufferedReader rsv = new BufferedReader(irdr);
Pattern crumbPattern = Pattern.compile(".*\"CrumbStore\":\\{\"crumb\":\"([^\"]+)\"\\}.*");
String line = null;
while (crumb == null && (line = rsv.readLine()) != null) {
    Matcher matcher = crumbPattern.matcher(line);
    if (matcher.matches()) 
        crumb = matcher.group(1);
}
rsv.close();
最后,设置cookie
String quoteUrl = "https://query1.finance.yahoo.com/v7/finance/download/IBM?period1=1493425217&period2=1496017217&interval=1d&events=history&crumb="
                           + crumb
...
List<String> cookies = cookieStore.get(key);
if (cookies != null) {
    for (String c: cookies) 
        con.setRequestProperty("Cookie", c);
}
...
con.connect();

jdolor

赞同来自:

到目前为止提到的那种方法(雅虎,谷歌和Intrinio)的另一种方法是免费获取Alpha Vantage的历史数据。他们的网络服务提供日内,每日,调整后的股票价格和50多项技术指标。他们甚至可以通过Deriscope直接提供给Excel - 也是免费的。 (我是后者的作者。)

yet

赞同来自:

完全正常工作的PHP示例,基于此帖和相关来源:

function readYahoo($symbol, $tsStart, $tsEnd) {
  preg_match('"CrumbStore\":{\"crumb\":\"(?<crumb>.+?)\"}"',
    file_get_contents('https://uk.finance.yahoo.com/quote/' . $symbol),
    $crumb);  // can contain \uXXXX chars
  if (!isset($crumb['crumb'])) return 'Crumb not found.';
  $crumb = json_decode('"' . $crumb['crumb'] . '"');  // \uXXXX to UTF-8
  foreach ($http_response_header as $header) {
    if (0 !== stripos($header, 'Set-Cookie: ')) continue;
    $cookie = substr($header, 14, strpos($header, ';') - 14);  // after 'B='
  }  // cookie looks like "fkjfom9cj65jo&b=3&s=sg"
  if (!isset($cookie)) return 'Cookie not found.';
  $fp = fopen('https://query1.finance.yahoo.com/v7/finance/download/' . $symbol
    . '?period1=' . $tsStart . '&period2=' . $tsEnd . '&interval=1d'
    . '&events=history&crumb=' . $crumb, 'rb', FALSE,
    stream_context_create(array('http' => array('method' => 'GET',
      'header' => 'Cookie: B=' . $cookie))));
  if (FALSE === $fp) return 'Can not open data.';
  $buffer = '';
  while (!feof($fp)) $buffer .= implode(',', fgetcsv($fp, 5000)) . PHP_EOL;
  fclose($fp);
  return $buffer;
}
用法:
$csv = readYahoo('AAPL', mktime(0, 0, 0, 6, 2, 2017), mktime(0, 0, 0, 6, 3, 2017));

gqui

赞同来自:

Yahoo已进入Reactjs前端,这意味着如果您分析从客户端到后端的请求标头,您可以获得用于填充客户端存储的实际JSON。 这些调用之间似乎负载平衡: query1.finance.yahoo.com& query2.finance.yahoo.com 在上面列出的任一主机名中都有以下路径,您可以查询财务报表,内部活动,SEC文件,分析师估算。(模块名称非常自我解释,我将在下面列出) 基本数据路径:(将您的股票代码替换为AAPL) /v10/finance/quoteSummary/AAPL?modules= ?modules=查询的选项如下: modules = [ 'assetProfile', 'incomeStatementHistory', 'incomeStatementHistoryQuarterly', 'balanceSheetHistory', 'balanceSheetHistoryQuarterly', 'cashFlowStatementHistory', 'cashFlowStatementHistoryQuarterly', 'defaultKeyStatistics', 'financialData', 'calendarEvents', 'secFilings', 'recommendationTrend', 'upgradeDowngradeHistory', 'institutionOwnership', 'fundOwnership', 'majorDirectHolders', 'majorHoldersBreakdown', 'insiderTransactions', 'insiderHolders', 'netSharePurchaseActivity', 'earnings', 'earningsHistory', 'earningsTrend', 'industryTrend', 'indexTrend', 'sectorTrend' ] 查询自动收录器AAPL以及模块assetProfile,defaultKeyStatistics和earningsHistory的完整URL将如下所示: https://query1.yahoo.com/v10/finance/quoteSummary/AAPL?modules=assetProfile%2CdefaultKeyStatistics%2CearningsHistory %2C只是,的十六进制表示形式,需要在您请求的每个模块之间插入。如果您想了解有关编码细节的更多信息,请查看此stackoverflow post 您可以查询我所列出的您喜欢的模块的任意组合。但不要成为d *!^。所有字段的查询都不到300kb,所以如果你下载了所有的纽约证券交易所和纳斯达克它将大约2GB,肯定足以让雅虎注意到。这是一个非常方便的'api',我讨厌看到它们关闭它。请花时间找出您真正需要的数据,并仅查询该数据集。 ~~拿你需要的东西离开休息.. ~~(乐队) 期权合约路径: /v7/finance/options/AAPL 该调用将为您提供当前到期月份的JSON。要检索将来的到期日,您需要添加日期查询: ?date=日期值将是一个整数,表示合同到期日期为UNIX timestamp(这是解释在Python中将unix时间戳转换为可读日期格式的方法的stackoverflow帖子)。 价格要求路径: /v8/finance/chart/AAPL?symbol=AAPL&period1=0&period2=9999999999&interval=3mo 该路径将为您提供以3个月为间隔分组的股票代码AAPL的所有可用价格数据。 您可以在过去的4-5天内获得interval=1m。您可以在过去的80(ish)天内获得interval=5m。我在内部假设他们的截止是基于交易日,所以我为period1创建过去价值的天真方法有点模糊,因为我没有考虑假期等(但这可能是一个过于简化的假设。你可以回到多远不同的间隔时间有点令人困惑和不一致)。如果您创建的请求有效但不支持interval,则yahoo将返回interval=3mo。因此,只需及时向前移动period1值,直到获得支持的间隔。 添加pre&发布市场价格 &includePrePost=true 增加股息和&拆分 &events=div%2Csplit 对于1天间隔的股票行情AAPL的所有价格数据的示例请求,包括市场前和行动后行动以及股息和拆分将是: https://query1.finance.yahoo.com/v8/finance/chart/AAPL?symbol=AAPL&period1=0&period2=9999999999&interval=1d&includePrePost=true&events=div%2Csplit period2=9999999999值仅具有重要意义,因为它是一个大于或等于今天的unix时间戳的值。 尊重并且可能偶尔点击一些添加物,将YAHOO扔到骨头上。让他们知道你欣赏这项服务。他们本可以很容易地隐瞒所有这些信息,所以几乎不可能发现但是他们没有,这不是偶然的。 我编写了一个使用随机用户代理轮换的个人库,并通过轮换匿名代理来路由请求,以保持请求的原始IP为私有,以避免列入黑名单。它还以合理的速率限制请求,以免对雅虎服务器不公平。如果有兴趣,我愿意在github上开源它(它实际上是我编写的分布式计算库的一部分,它在亚马逊上扩展EC2实例用于数据处理。所以我必须花时间把它拆开)。

xid

赞同来自:

我在同一条船上。慢慢到达那里。历史价格页面上的下载链接仍然有效。所以我将导出cookie扩展添加到firefox,登录到yahoo,转储cookie。使用交互式会话中的crumb值,我能够检索值。这是一个有效的测试perl脚本的一部分。

use Time::Local;
# create unix time variables for start and end date values: 1/1/2014 thru 12/31/2017
$p1= timelocal(0,0,0,1,0,114);
$p2= timelocal(0,0,0,31,11,117);
$symbol = 'AAPL';
# create variable for string to be executed as a system command
# cookies.txt exported from firefox
# crumb variable retrieved from yahoo download data link
$task = "wget --load-cookies cookies.txt --no-check-certificate -T 30 -O          $symbol.csv \"https://query1.finance.yahoo.com/v7/finance/download/$symbol?period1=$p1&period2=$p2&interval=1d&events=history&crumb=7WhHVu5N4e3\" ";
#show what we're executing
print $task;
# execute system command using backticks
`$task`;
#output is AAPL.csv
我需要一段时间来自动完成我的工作。希望雅虎能够简化或提供一些指导,如果他们真的打算让人们使用它。

ased

赞同来自:

VBA 下面是一些VBA函数,它们下载并解压缩cookie / crumb对并在Collection中返回这些函数,然后使用这些函数下载特定代码的csv文件内容。 包含项目应该引用添加的“Microsoft XML,v6.0”库(其他版本可能也可以,对代码进行一些小的更改)。

Sub Test()
    Dim X As Collection
Set X = FindCookieAndCrumb()
Debug.Print X!cookie
    Debug.Print X!crumb
Debug.Print YahooRequest("AAPL", DateValue("31 Dec 2016"), DateValue("30 May 2017"), X)
End Sub
Function FindCookieAndCrumb() As Collection
    ' Tools - Reference : Microsoft XML, v6.0
    Dim http    As MSXML2.XMLHTTP60
    Dim cookie  As String
    Dim crumb   As String
   Dim url     As String
    Dim Pos1    As Long
    Dim X       As String
Set FindCookieAndCrumb = New Collection
Set http = New MSXML2.ServerXMLHTTP60
url = "https://finance.yahoo.com/quote/MSFT/history"
http.Open "GET", url, False
    ' http.setProxy 2, "https=127.0.0.1:8888", ""
    ' http.setRequestHeader "Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8"
    ' http.setRequestHeader "Accept-Encoding", "gzip, deflate, sdch, br"
    ' http.setRequestHeader "Accept-Language", "en-ZA,en-GB;q=0.8,en-US;q=0.6,en;q=0.4"
    http.setRequestHeader "User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36"
    http.send
X = http.responseText
Pos1 = InStr(X, "CrumbStore")
X = Mid(X, Pos1, 44)
X = Mid(X, 23, 44)
Pos1 = InStr(X, """")
X = Left(X, Pos1 - 1)
FindCookieAndCrumb.Add X, "Crumb"
'======================================
X = http.getResponseHeader("set-cookie")
Pos1 = InStr(X, ";")
X = Left(X, Pos1 - 1)
FindCookieAndCrumb.Add X, "Cookie"
End Function
Function YahooRequest(ShareCode As String, StartDate As Date, EndDate As Date, CookieAndCrumb As Collection) As String
    ' Tools - Reference : Microsoft XML, v6.0
    Dim http            As MSXML2.XMLHTTP60
    Dim cookie          As String
    Dim crumb           As String
    Dim url             As String
    Dim UnixStartDate   As Long
    Dim UnixEndDate     As Long
    Dim BaseDate        As Date
Set http = New MSXML2.ServerXMLHTTP60
cookie = CookieAndCrumb!cookie
    crumb = CookieAndCrumb!crumb
BaseDate = DateValue("1 Jan 1970")
If StartDate = 0 Then StartDate = BaseDate
UnixStartDate = (StartDate - BaseDate) * 86400
    UnixEndDate = (EndDate - BaseDate) * 86400
url = "https://query1.finance.yahoo.com/v7/finance/download/" & ShareCode & "?period1=" & UnixStartDate & "&period2=" & UnixEndDate & "&interval=1d&events=history&crumb=" & crumb
http.Open "GET", url, False
    http.setRequestHeader "Cookie", cookie
    http.send
YahooRequest = http.responseText
End Function

isit

赞同来自:

在这个论坛中:https://forums.yahoo.net/t5/Yahoo-Finance-help/Is-Yahoo-Finance-API-broken/td-p/250503/page/3 尼克松说:

Hi All - This feature was discontinued by the Finance team and they will not be reintroducing that functionality.

xipsam

赞同来自:

我找到了另一个不需要cookie的雅虎网站,但生成了jason输出:https://query1.finance.yahoo.com/v7/finance/chart/YHOO?range=2y&interval=1d&indicators=quote&includeTimestamps=true 从这里指出:https://www.stock-data-solutions.com/kb/how-to-load-historical-prices-from-yahoo-finance-to-excel.htm 事实证明,它们似乎支持'perod1'和'period2'(在unix时间内)参数,可以用来代替'interval'。

String quoteSite = "https://query1.finance.yahoo.com/v7/finance/chart/"
                   + symbolName + "?"
                   + "period1=" + period1
                   + "&period2=" + period2
                   + "&interval=1d&indicators=quote&includeTimestamps=true";
以下为我解析杰森:
JSONObject topObj = new JSONObject(inp);
Object error = topObj.getJSONObject("chart").get("error");
if (!error.toString().equals("null")) {
    System.err.prinltn(error.toString());
    return null;
}
JSONArray results = topObj.getJSONObject("chart").getJSONArray("result");
if (results == null || results.length() != 1) {
    return null;
}
JSONObject result = results.getJSONObject(0);
JSONArray timestamps = result.getJSONArray("timestamp");
JSONObject indicators = result.getJSONObject("indicators");
JSONArray quotes = indicators.getJSONArray("quote");
if (quotes == null || quotes.length() != 1) {
    return null;
}
JSONObject quote = quotes.getJSONObject(0);
JSONArray adjcloses = indicators.getJSONArray("adjclose");
if (adjcloses == null || adjcloses.length() != 1) {
   return null;
}
JSONArray adjclose = adjcloses.getJSONObject(0).getJSONArray("adjclose");
JSONArray open = quote.getJSONArray("open");
JSONArray close = quote.getJSONArray("close");
JSONArray high = quote.getJSONArray("high");
JSONArray low = quote.getJSONArray("low");
JSONArray volume = quote.getJSONArray("volume");

uculpa

赞同来自:

对于那里的python爱好者,我已经更新了tradingWithPython库中的yahooFinance.py。 还有一个示例notebook基于Ed0906的提示,演示了如何逐步获取数据。看到它

yut

赞同来自:

我是这个service的作者 基本信息here 每日价格 您需要熟悉RESTFUL服务。 https://quantprice.herokuapp.com/api/v1.1/scoop/day?tickers=MSFT&date=2017-06-09 历史价格 您必须提供日期范围: https://quantprice.herokuapp.com/api/v1.1/scoop/period?tickers=MSFT&begin=2012-02-19&end=2012-02-20 如果您不提供开始或结束,它将使用最早或当前日期: https://quantprice.herokuapp.com/api/v1.1/scoop/period?tickers=MSFT&begin=2012-02-19 多个代码 你可以用逗号分隔代码: https://quantprice.herokuapp.com/api/v1.1/scoop/period?tickers=IBM,MSFT&begin=2012-02-19 速率限制 所有请求的速率限制为每小时10个请求。如果你想注册一个完整的访问API,请在twitter上发送给我DM。您将收到一个API密钥以添加到URL。 我们正在为没有费率的付费订阅设置PayPal帐户。 可用的代码清单 https://github.com/robomotic/valueviz/blob/master/scoop_tickers.csv 我也在努力提供EDGAR的基础数据和公司数据。 干杯。

het

赞同来自:

我在同一条船上。我设法从雅虎下载了一些vb.net frankencode我从谷歌,SOF和一些令人头疼的东西。 然而,我发现了Intrinio(查看),注册了,我的免费帐户每天为我提供500个历史数据api调用,拥有更多数据并且比雅虎准确得多。我重写了我的Intrinio API代码,我很高兴作为一个蛤蜊​​。 顺便说一句,我不工作或与Intrinio有任何关系,但他们节省了我的屁股大时间......

wrerum

赞同来自:

可以从google finance api获取当前和历史数据。对我来说非常好。

eet

赞同来自:

对于那些Excel / VBA用户,我使用上面的建议来开发VBA方法,以从更新的Yahoo网站中提取历史价格。下面列出了关键代码片段,我还提供了测试工作簿。 首先是在尝试从Yahoo提取数据之前获取Crumb和Cookie值的请求。

Dim strUrl                      As String: strUrl = "https://finance.yahoo.com/lookup?s=%7B0%7D"    'Symbol lookup used to set the values
Dim objRequest                  As WinHTTP.WinHttpRequest
Set objRequest = New WinHttp.WinHttpRequest
With objRequest
    .Open "GET", strUrl, True
    .setRequestHeader "Content-Type", "application/x-www-form-urlencoded; charset=UTF-8"
    .send
    .waitForResponse
    strCrumb = strExtractCrumb(.responseText)
    strCookie = Split(.getResponseHeader("Set-Cookie"), ";")(0)
End With
请参阅以下Yahoo Historical Price Extract链接到我的网站获取示例文件,以及我用于从Yahoo网站提取历史安全价格的方法的更多详细信息

lsunt

赞同来自:

看起来他们已经开始添加必需的cookie,但您可以相当容易地检索它,例如:

GET https://uk.finance.yahoo.com/quote/AAPL/history
回复表单中的标题:
set-cookie:B=xxxxxxxx&b=3&s=qf; expires=Fri, 18-May-2018 00:00:00 GMT; path=/; domain=.yahoo.com
您应该能够阅读此内容并将其附加到您的.csv请求中:
GET https://query1.finance.yahoo.com/v7/finance/download/AAPL?period1=1492524105&period2=1495116105&interval=1d&events=history&crumb=tO1hNZoUQeQ
cookie: B=xxxxxxxx&b=3&s=qf;
请注意crumb查询参数,这似乎以某种方式对应于您的cookie。您最好的选择是scrape这可以从您对初始GET请求的HTML响应中获得。在该响应中,您可以执行正则表达式搜索:"CrumbStore":\{"crumb":"(?<crumb>[^"]+)"\}并提取碎屑匹配组。 虽然您可以在下一年的任何符号/代码上使用相同的cookie,但看起来您有crumb值,这意味着您不必太频繁地执行scrape
要获取当前报价,只需加载: https://query1.finance.yahoo.com/v8/finance/chart/AAPL?interval=2m 附:
  • AAPL替换为您的股票代码
  • [1m, 2m, 5m, 15m, 30m, 60m, 90m, 1h, 1d, 5d, 1wk, 1mo, 3mo]的间隔时间
  • 可选的period1查询参数,包含您的纪元范围开始日期,例如period1=1510340760
  • 可选的period2查询参数,包含您的纪元范围结束日期,例如period2=1510663712

menim

赞同来自:

的Javascript 找到cookie;
match = document.cookie.match(new RegExp('B=([^;]+)'));
alert (match[1]);
找到面包屑;
i=document.body.innerHTML.search("CrumbStore")
if (i>=0) alert (document.body.innerHTML.substr(i+22,11))
寻找移动设备的面包屑;
i=document.body.innerHTML.search('USER={\"crumb\":'); 
if (i>=0) alert(document.body.innerHTML.substr(i+15,11));
并且最好先等待页面(例如https://finance.yahoo.com/quote/goog)加载,你可以 检查一下;
document.readyState

ut_sed

赞同来自:

您实际上不需要做2个请求来获取Yahoo数据。我使用此链接https://ca.finance.yahoo.com/quote/AAAP/history?period1=1474000669&period2=1505536669&interval=1d&filter=history&frequency=1d 您可以从中获取cookie,但它包含JSON格式的历史报价数据。在我下载页面后,我将Json数据从中删除了。保存网址请求。

aut_ea

赞同来自:

我使用一个PHP脚本使用fopen()来访问财务数据,这里是我修改后的片段,让它恢复工作: 创建开始日期和结束日期的时间戳:

$timestampStart = mktime(0,0,0,$startMonth,$startDay,$startYear);
$timestampEnd = mktime(0,0,0,$endMonth,$endDay,$endYear);
强制fopen()以硬编码值发送所需的cookie:
$cookie="YourCookieTakenFromYahoo";
$opts = array(
    'http'=>array(
        'method'=>"GET",
        'header'=>"Accept-language: en\r\n" .
            "Cookie: B=".$cookie."\r\n"
    )
);
$context = stream_context_create($opts);    
使用fopen()获取csv文件:
$ticker="TickerSymbol";
$crumb="CrumbValueThatMatchesYourCookieFromYahoo";
$handle = fopen("https://query1.finance.yahoo.com/v7/finance/download/".$ticker."?period1=".$timestampStart."&period2=".$timestampEnd."&interval=1d&events=history&crumb=".$crumb."", "r", false, $context);
现在你可以在这个while循环中做你所做的所有魔术:
while (!feof($handle) ) {
    $line_of_text = fgetcsv($handle, 5000);
}
确保在上面的代码段中为$ticker$crumb$cookie设置自己的值。 关于如何检索$crumb$cookie,请关注Ed0906's approach

mqui

赞同来自:

下载历史数据的URL现在是这样的: https://query1.finance.yahoo.com/v7/finance/download/SPY?period1=1492449771&period2=1495041771&interval=1d&events=history&crumb=9GaimFhz.WU 请注意,上述网址不适合您或其他任何人。你会得到这样的东西:

{
    "finance": {
        "error": {
            "code": "Unauthorized",
            "description": "Invalid cookie"
        }
    }
}
雅虎现在似乎正在使用一些哈希来阻止人们像你一样访问数据。网址因每个会话而异,因此您很可能不再使用固定网址执行此操作。 您需要进行一些报废才能从主页面获取正确的URL,例如: https://finance.yahoo.com/quote/SPY/history?p=SPY

lsunt

赞同来自:

我发现有一个修复工作正常。请看我的帖子: Yahoo Finance API / URL not working: Python fix for Pandas DataReader我按照https://pypi.python.org/pypi/fix-yahoo-finance中的步骤执行:$ pip install fix_yahoo_finance --upgrade --no-cache-dir(还要升级pandas_datareader以确定)并测试好了:

from pandas_datareader import data as pdr
import fix_yahoo_finance
data = pdr.get_data_yahoo('BHP.AX', start='2017-04-23', end='2017-05-24')
另请注意,最后2个数据列的顺序是“Adj Close”和“Volume”,所以出于我的目的,我已将列重置为原始顺序:
cols = ['Date', 'Open', 'High', 'Low', 'Close', 'Volume', 'Adj Close']
data = data.reindex(columns=cols)

quo_et

赞同来自:

的Python 我使用此代码获取cookie(从fix-yahoo-finance复制):
def get_yahoo_crumb_cookie():
    """Get Yahoo crumb cookie value."""
    res = requests.get('https://finance.yahoo.com/quote/SPY/history')
    yahoo_cookie = res.cookies['B']
    yahoo_crumb = None
    pattern = re.compile('.*"CrumbStore":\{"crumb":"(?P<crumb>[^"]+)"\}')
    for line in res.text.splitlines():
        m = pattern.match(line)
        if m is not None:
            yahoo_crumb = m.groupdict()['crumb']
    return yahoo_cookie, yahoo_crumb
然后这段代码得到回应:
cookie, crumb = get_yahoo_crumb_cookie()
params = {
    'symbol': stock.symbol,
    'period1': 0,
    'period2': int(time.time()),
    'interval': '1d',
    'crumb': crumb,
}
url_price = 'https://query1.finance.yahoo.com/v7/finance/download/{symbol}'
response = requests.get(url_price, params=params, cookies={'B': cookie})
这看起来很不错http://blog.bradlucas.com/posts/2017-06-03-yahoo-finance-quote-download-python/

oad

赞同来自:

对于Python 3用户,更改为 URL = 'https://query1.finance.yahoo.com/v7/finance/download/AAAP?period1=1494605670&period2=1495815270&interval=1d&events=history&crumb=IJ.ilcJlkrZ' 从 URL = 'https://chartapi.finance.yahoo.com/instrument/1.0/AAAP/chartdata;type=quote;range=10d/csv/' 和 response = request.urlopen(url) 至 response = requests.get(url,cookies = {'B':cookie}) response.text中的数据 数据格式完全不同,但至少它现在正常工作