我的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
}
~~积土成山,风雨兴焉;积水成渊,蛟龙生焉;~~~
分类:
go
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· 使用C#创建一个MCP客户端
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· Windows编程----内核对象竟然如此简单?