各平台推荐的基金买了有大半年了也没见赚到钱,于是不想用平台推荐,自己把基金数居下过来去分析去筛选。
一、基金列表
http://fund.eastmoney.com/js/fundcode_search.js
返回的直接是js数组格式,如:
var r = [
["000001", "HXCZHH","华夏成长混合","混合型","HUAXIACHENGZHANGHUNHE" ],
["000002", "HXCZHH", "华夏成长混合(后端)","混合型","HUAXIACHENGZHANGHUNHE"]
...
["980003","TPYLGYGDCYZ","太平洋六个月滚动持有债","债券型-长债","TAIPINGYANGLIUGEYUEGUNDONGCHIYOUZHAI"]];
变量r后面的值可以看做是一个json数据,可以去掉var r =
后最后的;
直接json序列化就可以获取数据了。
resp, err := http.Get(http://fund.eastmoney.com/js/fundcode_search.js)
if err != nil {
return
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
return
}
// 删除 .BOM 标识文本是 UTF-8 编码的
body = bytes.TrimPrefix(body, []byte("\xef\xbb\xbf"))
data := string(body)
// 删除 var r = 和 ;
data = strings.Replace(data, "var r = ", "", 1)
data = strings.Replace(data, ";", "", 1)
// 序列化成二维字符串数组
var array [][]string
err = json.Unmarshal([]byte(data), &array)
if err != nil {
return
}
二、基金详情
http://fund.eastmoney.com/pingzhongdata/000001.js
这里的000001换成需要下载的基金代码就行了。不过这个数据会稍微复杂一丢丢,如:
解析思路为,先用;
分割不同的js变量,再对每个js变量用=
号分割,会得到变量名和变量值。直接判断变量名是否包含对应变量是什么了,后面的变量值根据前面变量名直接赋值或序列化成json
id := "000001" // 基金代码
resp, err := http.Get(fmt.Sprintf("http://fund.eastmoney.com/pingzhongdata/%s.js", id))
if err != nil {
return
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
return
}
// 删除 .BOM 标识文本是 UTF-8 编码的
body = bytes.TrimPrefix(body, []byte("\xef\xbb\xbf"))
data := string(body)
ds := strings.Split(data, ";")
for _, d := range ds {
kv := strings.Split(d, "=")
if len(kv) != 2 {
continue
}
k := kv[0]
v := strings.TrimSpace(kv[1])
if strings.Contains(k, "stockCodes") {
//基金持仓股票代码
var StockCodes []string
err = json.Unmarshal([]byte(v), &StockCodes)
if err != nil {
continue
}
} else if strings.Contains(k, "syl_1n") {
// 近一年收益率
if len(v) <= 2 {
continue
}
var Syl1n := v[1 : len(v)-2]
} else if strings.Contains(k, "Data_netWorthTrend") {
type DataNWT struct {
Date int64 `json:"x"` // 日期(毫秒时间戳)
Value float32 `json:"y"` // 净值
EquityReturn float32 `json:"equityReturn"` // 净值回报
UnitMoney string `json:"unitMoney"` // 每份派送金
}
// 单位净值走势
var arr [] DataNWT
err = json.Unmarshal([]byte(v), &arr )
if err != nil {
continue
}
}
三、实时涨跌
https://fundgz.1234567.com.cn/js/000001.js
这个直接返回jsonp数据了
jsonpgz(
{
"dwjz":"1.1970",
"fundcode":"000001",
"gsz":"1.2031",
"gszzl":"0.51",
"gztime":"2021-12-22 15:00",
"jzrq":"2021-12-21",
"name":"华夏成长混合"
}
);