|
对于前两天的心血来潮的估值图说实在,心理是不怎么满意的,纯粹是Python练手而已,今天开始上点难度,拿取某球网站上的估值数据试试。 仔细打开某球网站的估值数据,抱着学习的态度,准备直接拷贝估值数据下来,结果发现拷贝快捷键被禁止了(一脸的姨母笑),而且鼠标无法选取。查看网页源码一看,竟然没有任何数据,冒汗!看来超出我以前做网站的知识了!而且一看源码都是后台的.JS代码,在网上一查,这种情况通常采用node.js或一种虚拟的DOM形式。管它呢,通过抓包浏览器的数据请求数据包分析发现,网页在后台一直读取一专门的网址,打开一看,哈哈哈,数据全在这里。至此,数据问题搞定!(后边Python源码)
接着就是怎么把数据抓下来了,决定模仿浏览器的方式,让网站认为是网页客户端在访问,C[color=#576B95 !important][url=]#源码如下[/url]:
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);
}
然后就是做个任务把数据抓下来后解析并存入SQLite数据库:
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数据,分析数据估值,出估值数据图表与HTML报告。我就不在详述。有兴趣的可以参考下边分享的Python源码。建下边分析结果:
1.指数估值对比图
2.估值分布图
3.估值分析总结
4.指数估值报告(按行业分了宽基,策略,行业等,点击可以排序)
点击关注公众号“程序员阿智”,动力十足,Python源码见下边内容:
通过网盘分享的文件:j6.zip
|