今天给大家唠唠我搞的这个“盛世中国基金每日净值查询”的小实践,说起来挺简单的,但一步一个脚印,也踩了不少坑。
我就是想每天看看我买的华泰柏瑞盛世中国混合基金(460001)的净值,手动去天天基金网查,太麻烦了!我就寻思,能不能自己搞个小工具,每天自动抓取,省时省力。
第一步:确定数据来源
我先打开天天基金网,找到460001这只基金的页面,看了下,净值数据就在那儿明晃晃地摆着。除了天天基金,支付宝、基金公司官网也能查到,我选天天基金是因为感觉它界面比较清爽,容易抓取。
第二步:分析网页结构
打开浏览器的开发者工具(F12),看了下网页源码,发现净值数据是动态加载的。这也就是说,直接用requests库去请求网页,是拿不到数据的。怎么办?
- 方案一:用Selenium模拟浏览器操作,让浏览器把数据加载出来,然后再抓取。
- 方案二:分析网页的Ajax请求,找到返回净值数据的接口。
我果断选择了方案二。Selenium太笨重了,能用更轻量级的方案,干嘛用重的?
第三步:找到Ajax接口
在开发者工具的Network面板里,刷新网页,仔细观察每一个请求。我发现了一个可疑的请求,它的URL里包含基金代码(460001),而且返回的数据格式是JSON,里面包含单位净值、累计净值、估算净值等等。Bingo!就是它了!
第四步:编写爬虫代码
接下来就是撸代码了。我用Python的requests库发送HTTP请求,获取JSON数据,然后解析JSON,提取出我需要的净值数据。代码大概是这样的:
import requests
import json url = '找到的那个Ajax接口URL'
response = *(url)
data = *(*) # 提取净值数据,具体怎么提取要看JSON的结构
unit_net_value = data['data']['unitNetWorth']
total_net_value = data['data']['totalNetWorth']
valuation_net_value = data['data']['valuationNetWorth'] print(f'单位净值:{unit_net_value}')
print(f'累计净值:{total_net_value}')
print(f'估算净值:{valuation_net_value}')
第五步:解决反爬虫问题
一开始跑得很顺利,但没过多久,就发现抓不到数据了。一看,HTTP状态码是403,被服务器拒绝了。看来天天基金网也做了反爬虫措施。
怎么办?加请求头!我在请求头里加上User-Agent、Referer等信息,伪装成浏览器发起的请求。代码改成这样:
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
'Referer': '*/'
}
response = *(url, headers=headers)
加了请求头之后,又能正常抓取数据了。但是,为了防止被封IP,我还在代码里加入了随机延时,每次请求之间暂停几秒钟。这样可以降低爬虫的速度,让它看起来更像人类用户的行为。
第六步:定时运行
为了实现每天自动抓取,我用Python的schedule库,设置每天在指定的时间运行爬虫代码。代码大概是这样的:
import schedule
import time def job():
# 运行爬虫代码
print('开始抓取净值数据...')
# ... (爬虫代码)
print('抓取完成!') *().*("15:30").do(job) while True:
*_pending()
*(1)
第七步:存储数据
抓取到的净值数据,总得有个地方存放?我选择了MySQL数据库,把每天的净值数据保存到数据库里。这样,我就可以随时查询历史净值,做一些简单的分析。
第八步:美化输出
把数据存到数据库之后,我写了一个简单的脚本,从数据库里读取数据,然后用漂亮的格式输出到命令行。我还加了一些简单的统计功能,比如计算最近一周的收益率、最近一个月的收益率等等。
第九步:部署到服务器
为了让这个小工具能够24小时运行,我把它部署到了一台云服务器上。我用Linux的crontab定时任务,每天凌晨自动运行爬虫代码,抓取最新的净值数据。
总结
整个过程下来,虽然遇到了一些问题,但都一一解决了。我每天都可以看到最新的基金净值数据,不用再手动去查了,感觉真爽!这个小工具还有很多可以改进的地方,比如:
- 增加数据可视化功能,用图表展示净值走势。
- 增加邮件提醒功能,每天把净值数据发送到我的邮箱。
- 支持更多的基金代码,可以同时查询多只基金的净值。
这些都是我下一步的计划。以后有空了,再慢慢完善!
还没有评论,来说两句吧...