При помощи 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 и ошибку.