Подтвердить что ты не робот

Yahoo Finance URL не работает

Я использовал следующий URL для получения исторических данных из yahoo finance уже довольно давно, но вчера он не работал.

https://ichart.finance.yahoo.com/table.csv?s=SPY

При просмотре на этом сайте говорится:

Вернется...

Благодарим вас за терпение.

Наши инженеры быстро работают над решением проблемы.

Однако, поскольку эта проблема все еще существует со вчерашнего дня, я начинаю думать, что они прекратили эту услугу?

Мой поиск SO только указал мне на этот раздел, который был связан с https, хотя...

Кто-нибудь еще испытывает эту проблему? Как я могу решить эту проблему? Предлагают ли они другой доступ к своим историческим данным?

4b9b3361

Ответ 1

Похоже, что они начали добавлять необходимый файл 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 из ответа HTML на ваш первоначальный запрос GET. В пределах этого ответа вы можете выполнить поиск по регулярному выражению для: "CrumbStore":\{"crumb":"(?<crumb>[^"]+)"\} и извлечь группу, сопоставленную крошкой.

Похоже, что если у вас есть это значение crumb, хотя вы можете использовать его с тем же cookie для любого символа/тикера в следующем году, что означает, что вам не нужно слишком часто делать 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

Ответ 2

Мне удалось разработать класс .NET для получения действительного токена (cookie и crumb) из Yahoo Finance

Для полной библиотеки API в получении исторических данных из нового Yahoo Finance вы можете посетить YahooFinanceAPI в Github

Вот класс, чтобы захватить куки и крошку

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;

        }

    }
}

Обновлено 1 июн 17
кредиты @Ed0906
изменить шаблон регулярного выражения крошки на Regex("CrumbStore\":{\"crumb\":\"(?<crumb>.+?)\"}"

Ответ 4

URL-адрес для загрузки исторических данных теперь выглядит примерно так:

https://query1.finance.yahoo.com/v7/finance/download/SPY?period1=1492449771&period2=1495041771&interval=1d&events=history&crumb=9GaimFhz.WU

Обратите внимание, что указанный выше URL-адрес не будет работать для вас или кого-либо еще. Вы получите что-то вроде этого:

{
    "finance": {
        "error": {
            "code": "Unauthorized",
            "description": "Invalid cookie"
        }
    }
}

Кажется, что Yahoo теперь использует некоторое хеширование, чтобы люди не могли получить доступ к данным, как вы. URL-адрес зависит от каждого сеанса, поэтому очень вероятно, что вы больше не сможете это делать с фиксированным URL-адресом.

Вам нужно будет немного сломать, чтобы получить правильный URL-адрес с главной страницы, например:

https://finance.yahoo.com/quote/SPY/history?p=SPY

Ответ 5

Для любителей python я обновил yahooFinance.py в библиотеке tradingWithPython.

Существует также пример блокнот, основанный на советах Ed0906, демонстрирующий, как получить данные шаг за шагом. Посмотрите на

Ответ 6

Я в одной лодке. Добираться медленно. Ссылка на страницу с историческими ценами по-прежнему работает. Поэтому я добавил расширение куки экспорта в firefox, зарегистрировался в yahoo, сбросил файлы cookie. Использовал значение crumb из интерактивного сеанса, и мне удалось получить значения. Здесь часть теста perl script, который работал.

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

Потребуется некоторое время, чтобы автоматизировать то, что я делаю. Надеюсь, yahoo упростит или даст некоторые рекомендации по этому вопросу, если они действительно намерены использовать его для пользователей.

Ответ 7

Для любителей джава.

Вы можете получить доступ к своим файлам cookie из URLConnection таким образом.

 //  "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
           ...
        }
 }

теперь вы можете искать крошку на сайте yahoo:

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();

Ответ 8

Полностью работающий пример 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));

Ответ 9

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/

Ответ 10

Я являюсь автором этой службы

Основная информация здесь

Суточные цены

Вы должны быть знакомы с 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 полного доступа, отправьте мне DM на твиттер. Вы получите ключ API для добавления в URL.

Мы создаем PayPal-аккаунт для платной подписки без ставок.

Список доступных тикеров

https://github.com/robomotic/valueviz/blob/master/scoop_tickers.csv

Я также работаю над предоставлением фундаментальных данных и данных компании из EDGAR. Приветствия.

Ответ 11

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

Ответ 12

Я нашел еще один сайт yahoo, который не требует куки файлов, но генерирует вывод 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 time), которые могут использоваться вместо "интервала".

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");

Ответ 13

Я использовал php script с помощью функции fopen() для доступа к финансовым данным, вот фрагменты, которые я изменил, чтобы вернуть его на работу:

Создание временных меток для даты начала и окончания даты:

$timestampStart = mktime(0,0,0,$startMonth,$startDay,$startYear);
$timestampEnd = mktime(0,0,0,$endMonth,$endDay,$endYear);

Force 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. Следуйте подход Ed0906 о том, как получить $crumb и $cookie.

Ответ 14

Для этих пользователей Excel/VBA я использовал приведенные выше предложения для разработки метода VBA для извлечения исторических цен с обновленного веб-сайта Yahoo. Ниже перечислены фрагменты key code, и я также предоставил свою тестовую рабочую книгу.

Сначала запрос, чтобы получить значения Crumb и Cookie, прежде чем пытаться извлечь данные из Yahoo по ценам.

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

Ответ 15

Есть исправление, которое я нашел, чтобы работать хорошо. Пожалуйста, см. Мой пост:

Yahoo API API/URL не работает: исправление Python для 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')

Также обратите внимание, что порядок последних двух столбцов данных - это "Adj Close" и "Volume", поэтому для моей цели у меня есть reset столбцы:

cols = ['Date', 'Open', 'High', 'Low', 'Close', 'Volume', 'Adj Close']
data = data.reindex(columns=cols)

Ответ 16

Я был на одной лодке. Мне удалось получить CSV, загруженный с Yahoo, с помощью frankencode vb.net, который я сделал из бит и частей Google, SOF и некоторых царапин на голове.

Тем не менее, я обнаружил Intrinio (посмотреть его), зарегистрировался, и моя бесплатная учетная запись получает 500 исторических данных api в день, с гораздо большим количеством данных и гораздо более точными, чем Yahoo. Я переписал свой код для API Intrinio, и я счастлив как моллюск.

Кстати, я не работаю или не имею никакого отношения к Intrinio, но они сохранили мой прикладом большое время...

Ответ 17

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' ]

Полный запрос URL для тикера AAPL и модулей assetProfile, defaultKeyStatistics и заработка История будет выглядеть так:

https://query1.yahoo.com/v10/finance/quoteSummary/AAPL?modules=assetProfile%2CdefaultKeyStatistics%2CearningsHistory

%2C является только шестнадцатеричным представлением a , и должен быть вставлен между каждым запрошенным модулем. Если вы хотите больше узнать о детализации кодировки, посмотрите fooobar.com/questions/25621/...

Вы можете запросить любую комбинацию перечисленных мной модулей. Но не будьте d *! ^. Запрос всех полей составляет чуть меньше 300 КБ, поэтому, если вы загрузите все NYSE и NASDAQ, это будет около 2 ГБ, что, конечно же, достаточно велико, чтобы Yahoo заметила. Это действительно удобная "апи", и я бы не хотел, чтобы они закрыли ее. Пожалуйста, найдите время, чтобы выяснить, какие данные вам действительно нужны, и только запрос для этого набора данных. ~~ возьмите то, что вам нужно, и оставьте остальные.. ~~ (The Band)

Вариант пути контракта:

/v7/finance/options/AAPL

Этот вызов даст вам JSON для текущего месяца истечения срока действия. Для получения будущих выходов вам нужно добавить запрос на дату:

?date= Значение даты будет целым числом, которое представляет дату истечения срока контракта как отметка времени UNIX (что сообщение stackoverflow объясняет методы для преобразования временных меток unix в читаемые даты в Python).

Запрос цены:

/v8/finance/chart/AAPL?symbol=AAPL&period1=0&period2=9999999999&interval=3mo

Этот путь предоставит вам все доступные данные о ценах для тикера AAPL, сгруппированные с интервалом в 3 месяца.

Вы можете получить interval=1m около 4-5 дней. Вы можете получить interval=5m за последние 80 (иш) дней. Я предполагаю, что внутренне их обрезание основано на торговых днях, поэтому мой наивный подход к созданию прошлых значений для period1 немного размыт, потому что я не учитывал праздники и такие (но это может быть более упрощенное предположение. вы можете пойти с разными интервалами, немного запутанным и непоследовательным). Если вы создали запрос, который действителен, но interval не поддерживается, yahoo вернет interval=3mo. Поэтому просто переместите значение period1 вперед во времени, пока не получите поддерживаемый интервал.

Добавить цены до и после рынка

&includePrePost=true

Добавить дивиденды и расщепления

&events=div%2Csplit

Пример запроса для всех данных о ценах для AAPL с тикером в течение 1-дневного интервала, включая действие до и после рынка, а также дивиденды и расщепления:

https://query1.finance.yahoo.com/v8/finance/chart/AAPL?symbol=AAPL&period1=0&period2=9999999999&interval=1d&includePrePost=true&events=div%2Csplit

Значение 9999999999 для period2= имеет значение только в том смысле, что оно больше или равно текущей временной отметке unix.

Будьте почтительны и, возможно, бросьте YAHOO кости, нажимая на некоторые добавления время от времени. Сообщите им, что вы цените услугу. Они могли бы легко собрать всю эту информацию, поэтому было бы почти невозможно обнаружить, но они не сделали этого и не случайно.

Я написал персональную библиотеку, которая использует случайную вращение пользователя-агента и направляет запросы посредством вращения анонимных прокси-серверов, чтобы сохранить исходный IP-адрес запросов частным, чтобы избежать "черного списка". Он также подает запросы на разумную ставку, чтобы не быть несправедливым к серверам yahoo. Если есть интерес, я готов открыть его на github (он фактически является частью распределенной вычислительной библиотеки, я написал, что масштабирует экземпляры EC2 на amazon для обработки данных, поэтому мне пришлось бы потратить время, чтобы разделить его).

Ответ 18

Для пользователей 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 = request.get(url, cookies = {'B': cookie}) данные в response.text

формат данных полностью отличается, но, по крайней мере, его работоспособность на данный момент

Ответ 19

Можно получить текущие и исторические данные из google finance api. Работает очень хорошо для меня.

Ответ 20

На самом деле вам не нужно делать 2 запроса на получение данных Yahoo. Я использую эту ссылку https://ca.finance.yahoo.com/quote/AAAP/history?period1=1474000669&period2=1505536669&interval=1d&filter=history&frequency=1d

Вы можете захватить файл cookie из этого, но вместо этого он включает в себя данные для вас исторической цитаты в формате Json. После того, как я загружу страницу, я избавлюсь от данных Json. Сохраняет запрос URL.

Ответ 21

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

Ответ 22

Альтернативный подход к тем, которые были упомянуты до сих пор (Yahoo, Google и Intrinio), заключается в том, чтобы бесплатно получить исторические данные от Alpha Vantage. Их веб-сервис обеспечивает внутридневные, ежедневные скорректированные цены акций и более 50 технических индикаторов. Они даже доставляют прямо в Excel - также бесплатно - через Deriscope. (Я автор последнего.)