Golang: Получение stock price с Yahoo Finance

При помощи https://github.com/antchfx/htmlquery мы можем легко получать и парсить данные с веб страницы Yahoo Finance. Нас интересует именно stock price. Для этого в начале находим на странице нужный нам блок:

<div class="D(ib) Mend(20px)" data-reactid="31">
 <span class="Trsdu(0.3s) Fw(b) Fz(36px) Mb(-4px) D(ib)" data-reactid="32">63.50</span>
 <span class="Trsdu(0.3s) Fw(500) Pstart(10px) Fz(24px) C($positiveColor)" data-reactid="33">+2.15 (+3.50%)</span>
 <div id="quote-market-notice" class="C($tertiaryColor) D(b) Fz(12px) Fw(n) Mstart(0)--mobpsm Mt(6px)--mobpsm" data-reactid="34">
   <span data-reactid="35">As of  1:25PM CET. Market open.</span>
 </div>
</div>

Окей, нужный блок найден. Из этого блока нас больше всего интересует ticker price — 63.50:

<span class="Trsdu(0.3s) Fw(b) Fz(36px) Mb(-4px) D(ib)" data-reactid="32">63.50</span>

Прописываем Xpath:

pricePath := "//*[@class=\"Trsdu(0.3s) Fw(b) Fz(36px) Mb(-4px) D(ib)\"]"

Итого для получения данных с Yahoo Finance нам нужно:

  1. Получить страницу.
  2. Найти и подготовить правильный XPath для получения данных.
  3. Сделать парсинг, получить нужную html ноду и проверить на возможные ошибки (часто исходная страница может меняться).

Напишем такую функцию:

package yahoo

import (
 "github.com/pkg/errors"
 "strconv"

 "github.com/antchfx/htmlquery"
)

func GrabPrice(ticker string) (float64, error) {
  baseURL := "https://finance.yahoo.com/quote/"
  pricePath := "//*[@class=\"Trsdu(0.3s) Fw(b) Fz(36px) Mb(-4px) D(ib)\"]"
  doc, err := htmlquery.LoadURL(baseURL + ticker)
  if err != nil {
    return 0, err
  }
  node := htmlquery.FindOne(doc, pricePath)
  if node == nil {
    return 0, errors.New("node not found")
  }
  // from the Node get inner text
  price := htmlquery.InnerText(node)
  return strconv.ParseFloat(price, 64)
}

Итого наша функция будет принимать на вход ticker и возвращать float64 и ошибку.

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *