热门搜索

Python之小试牛刀(二)-抓取公开的指数基金估值(本人原创工具)

[复制链接]
admin 发表于 2026-4-27 16:03:26 | 显示全部楼层 |阅读模式
对于前两天的心血来潮的估值图说实在,心理是不怎么满意的,纯粹是Python练手而已,今天开始上点难度,拿取某球网站上的估值数据试试。
     仔细打开某球网站的估值数据,抱着学习的态度,准备直接拷贝估值数据下来,结果发现拷贝快捷键被禁止了(一脸的姨母笑),而且鼠标无法选取。查看网页源码一看,竟然没有任何数据,冒汗!看来超出我以前做网站的知识了!而且一看源码都是后台的.JS代码,在网上一查,这种情况通常采用node.js或一种虚拟的DOM形式。管它呢,通过抓包浏览器的数据请求数据包分析发现,网页在后台一直读取一专门的网址,打开一看,哈哈哈,数据全在这里。至此,数据问题搞定!(后边Python源码)
5c0e0207-651b-4f40-9efb-200daacc3c21.png        接着就是怎么把数据抓下来了,决定模仿浏览器的方式,让网站认为是网页客户端在访问,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.指数估值对比图
估值对比图.png

2.估值分布图 估值分布图.png
3.估值分析总结 zj.png
4.指数估值报告(按行业分了宽基,策略,行业等,点击可以排序) rp.png 点击关注公众号“程序员阿智”,动力十足,Python源码见下边内容:
通过网盘分享的文件:j6.zip
游客,如果您要查看本帖隐藏内容请回复


zj.png
评论0
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|铁血游戏公社

GMT+8, 2026-6-6 11:13 , Processed in 0.058286 second(s), 24 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.