我的go練手項目--使用go獲取東方財富網站基金凈值數據


代碼我放在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
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM