我的go練手專案--使用go獲取東方財富網站基金淨值資料
阿新 • • 發佈:2020-07-26
程式碼我放在https://github.com/kingstarer/kingstarer/tree/master/go/getFundValue
這裡簡單介紹一下思路和關鍵程式碼
瀏覽東財網站時,按f12,可以發現東財使用的是前後端分離技術:使用者訪問網頁時,只下載基本的網頁資料,通過ajax技術在網頁載入完後使用js非同步獲取基金淨值資料
淨值資料是json串,所以我們只需要使用net/http提供的http客戶端發起請求並使用encoding/json對json做解析即可
稍微需要注意的是,東方限制了瀏覽器型別,並且有防盜鏈機制,所以記得設定好http請求頭的資訊。
(各位如果也想從東財抓資料,請注意程式訪問頻率,免得給人家伺服器造成太大壓力,別上演“公地悲劇”)
//用來儲存從東方財富獲取的基金資料 var FundInfoObject JsonFundList func GetFundValue(fundCode, startDate, endDate string) (err error) { if len(startDate) != 8 || len(endDate) != 8 { return errors.New(fmt.Sprintf("開始結束日期必須是yyyymmdd格式")) } //拼裝請求網址 realStartDate := fmt.Sprintf("%s-%s-%s", startDate[0 : 4], startDate[4 : 6], startDate[6 : 8]) realEndDate := fmt.Sprintf("%s-%s-%s", endDate[0 : 4], endDate[4 : 6], endDate[6 : 8]) realUrl := fmt.Sprintf(FundConfig.URL, fundCode, realStartDate, realEndDate) //準備傳送請求 client := &http.Client{} reqest, err := http.NewRequest("GET", realUrl, nil) if err != nil { return err } //必須設定好http頭 不然返回會失敗 reqest.Header.Add("Referer", "http://fundf10.eastmoney.com/") reqest.Header.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36") //獲取出返回的報文 fmt.Println("開始獲取資料:", realUrl) resp, err := client.Do(reqest) defer resp.Body.Close() body, err := ioutil.ReadAll(resp.Body) if err != nil { fmt.Println(err) } strBody, bodyLen := string(body), len(body) //取出返回報文裡面的Json nJsonStartPos := strings.Index(strBody, FundConfig.JsonStartKey) + len(FundConfig.JsonStartKey) nJsonEndPos := strings.LastIndex(strBody, FundConfig.JsonEndKey) if nJsonStartPos >= bodyLen || nJsonEndPos <= 0 || nJsonStartPos >= nJsonEndPos { return errors.New(fmt.Sprintf("返回報文中擷取Json失敗 起始位置%d %d", nJsonStartPos, nJsonEndPos)) } //解析json err = parseFundJson(body[nJsonStartPos : nJsonEndPos]) if err != nil { return err } return nil }