对于前几天的心血来潮的估值图说实在,心理是不怎么满意的,纯粹是Python练手而已,既然想学,就给自己今天开始上点小难度,拿取某球网站上的估值数据试试。
一脸认真打开某球网站的估值数据,抱着学习的态度,准备直接拷贝估值数据下来,结果发现拷贝快捷键被禁止了(一脸的姨母笑),而且鼠标无法选取。查看网页源码一看,竟然没有任何数据,冒汗!看来超出我以前做网站的知识了!一看网页源码都是后台的.JS代码,在网上一查,明白了,这种情况网页通常采用node.js或一种虚拟的DOM形式呢。管它呢,通过抓包浏览器的请求数据包分析看看,不查不知道,一查嚇了我一跳,原来网页在后台一直读取某一专门的网址,打开一看全是基金的JSON数据,哈哈哈~~~(头有点晕)至此,数据问题搞定!(后边有Python源码)

接着就是怎么把数据抓下来了,决定模仿浏览器的方式,让网站认为是网页浏览器客户端在访问,C#源码如下:(Python版本等我找到再放上来)
private void InitHttpClient()
{
_httpClient.DefaultRequestHeaders.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36");
_httpClient.Timeout = TimeSpan.FromSeconds(15);
}
然后就是做个任务把数据抓下来后解析并存入CSV文件数据库:
private async Task<List<IndexEvaModel>> FetchDataAsync()
{
var response = await _httpClient.GetAsync(ApiUrl);
response.EnsureSuccessStatusCode();
string json = await response.Content.ReadAsStringAsync();
dynamic jsonObj = JsonConvert.DeserializeObject(json);
var items = jsonObj.data.items;
var result = new List<IndexEvaModel>();
// 获取今年的年份,用于补全日期
int currentYear = DateTime.Now.Year;
foreach (var item in items)
{
// 【关键修改 1】获取 API 中的 date 字段并处理年份
string apiDate = item.date?.ToString() ?? "";
if (!string.IsNullOrEmpty(apiDate))
{
// 如果是 MM-dd 格式(长度为5),补全今年年份
if (apiDate.Length == 5 && apiDate.Contains("-"))
{
fullDate = $"{currentYear}-{apiDate}";
}
else
{
// 如果 API 未来返回了完整日期,直接使用
fullDate = apiDate;
}
}
else
{
// 兜底:如果 API 没返回日期,用今天
fullDate = DateTime.Now.ToString("yyyy-MM-dd");
}
var model = new IndexEvaModel
{
GuCode = item.index_code?.ToString() ?? "",
GuName = item.name?.ToString() ?? "",
CategoryName = _tTypeMap.TryGetValue(item.ttype?.ToString() ?? "", out int t) ? t : 0,
GuPe = item.pe != null ? Math.Round(Convert.ToDouble(item.pe), 4).ToString() : "",
PePercent = item.pe_percentile != null ? Math.Round(Convert.ToDouble(item.pe_percentile) * 100, 2) + "%" : "",
GuPb = item.pb != null ? Math.Round(Convert.ToDouble(item.pb), 4).ToString() : "",
PbPercent = item.pb_percentile != null ? Math.Round(Convert.ToDouble(item.pb_percentile) * 100, 2) + "%" : "",
Xilv = item.yeild != null ? Math.Round(Convert.ToDouble(item.yeild) * 100, 2) + "%" : "",
Roe = item.roe != null ? Math.Round(Convert.ToDouble(item.roe) * 100, 2) + "%" : "0",
Valuation = _evaTypeMap.TryGetValue(item.eva_type?.ToString() ?? "", out int v) ? v : -1,
PrePeg = item.peg != null ? Math.Round(Convert.ToDouble(item.peg), 4).ToString() : "",
// 【关键修改 2】使用处理后的完整日期
Vdate = fullDate
};
result.Add(model);
}
return result;
}
三下五除二搞定,存为csv文件。
接下来是Python重头戏了,开工,读取csv数据,利用Python的PLOT做分析数据估值对比,估值分布和总结图表与HTML估值分类报告。此处我就不在详述。有兴趣的可以参考下边分享的Python源码。见下边分析结果:
1.指数估值对比图




关注我,分享更多好东西,Python源码实现报告见下边内容:
https://www.xtuwz.com/forum.php?mod=viewthread&tid=3701&extra=page%3D1