代码我放在https://github.com/kingstarer/kingstarer/tree/master/go/getFundValuegit
这里简单介绍一下思路和关键代码github
浏览东财网站时,按f12,能够发现东财使用的是先后端分离技术:用户访问网页时,只下载基本的网页数据,经过ajax技术在网页加载完后使用js异步获取基金净值数据ajax
净值数据是json串,因此咱们只须要使用net/http提供的http客户端发起请求并使用encoding/json对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 }