При помощи 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 нам нужно:
- Получить страницу.
- Найти и подготовить правильный XPath для получения данных.
- Сделать парсинг, получить нужную 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 и ошибку.