pandas、pyecharts绘制基金走势图-02

接口数据的处理:

  • 直接通过浏览器请求查看返回数据:
  1. 查询基金实时信息: http://fundgz.1234567.com.cn/js/{fundcode}.js
    在这里插入图片描述
    返回接口数据说明:
    代码:fundcode
    名称:name
    净值日期:jzrq
    单位净值:dwjz
    估算值:gsz
    估算增长率:gszzl
    估值时间:gztime
    我们需要的是“估算值”,使用requests请求接口后,直接返回对应的gszzl即可。
    def apiData(fundcode = 320007):
        logging.info(f'请求最新基金估值数据, 基金代码{fundcode}')
    
        headers ={"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36" }
    
        url = f'http://fundgz.1234567.com.cn/js/{fundcode}.js'
        res = requests.get(url, headers = headers)
        logging.debug(f'get fund data from api {url}')
    
        if res.status_code == 200 :
            data = res.json()['gszzl']
        else:
            data = res.text
        logging.debug(f'fund data {data}')
    
        return data
    
  2. 查询置顶时间段的基金信息: https://fundf10.eastmoney.com/F10DataApi.aspx?type={type}&code={fundcode}&page={i}&sdate={sdate}&edate={edate}&per={per}
    在这里插入图片描述
    因为接口返回数据不能直接解析为json格式,但是通过浏览器开发工具查看返回的数据结构时,发现content数据是一个table结构。因此我们可以直接使用pandas.read_html方法直接读取这个表格的数据。
    在这里插入图片描述
    接口返回的数据最后可以看到共有14页的数据,需要使用一个循环读取所有的数据。pandas.read_html方法只能读取页面的表格数据,不能获取翻页数据,所以在调用pandas.read_html方法前,需要先获取所有数据的页数。
    url = f'https://fundf10.eastmoney.com/F10DataApi.aspx?type={type}&code={fundcode}&sdate={sdate}&edate={edate}&per={per}'
    
    res = requests.get(url)
    res_index = res.text.rindex('"') + 2
    res = res.text.replace('};', '')
    res = res[res_index:]
    res = res.split(':')
    pages = int(res[-2].split(',')[0]) + 1
    
  • 将获得的接口数据进行保存:
    1. 保存多个基金的估值数据。直接使用pandas.to_csv将数据保存。
      # 创建一个名为 cls_name 的新数据类,字段为 fields 中定义的字段
      FundData = make_dataclass('FundData', [('datetime', str),('fundcode', int), ('name', str), ('gszzl', float)])
      # 实例化数据类
      FundDataList = []
      for fundcode in fundcodes :
         s = apiData(fundcode)
         # 填充数据类
         FundDataList.append(FundData(time_, fundcode, s['name'], s['gszzl']))
      
      # 将数据类保存的pandas.DataFrame
      data_DataFrame = pd.DataFrame(FundDataList)
      # 通过变量判断是否是第一次写数据,第一次写数据时带上表头
      if count == 0:
         # 使用loggging打印日志
         logging.debug('第一次写文件,保存列名')
         data_DataFrame.to_csv(f'funddatas{datetime.now().strftime("%Y%m%d")}.csv', mode='a+', index=False, header=True)
      else:
         logging.debug('不是第一次写文件,不保存列表')
         data_DataFrame.to_csv(f'funddatas{datetime.now().strftime("%Y%m%d")}.csv', mode='a+', index=False, header=False)
      
    2. 保存基金历史单位净值数据。因为直接使用了pandas.read_html方法获取数据,所以不需要再次对接口数据进行处理,直接可以把数据使用pandas.to_csv方法存储到csv文件。在csv数据存储操作中,因为有翻页,需要添加循环读取数据,同时还需要判断文件是否是第一读取。
      logging.info(f'数据写入{my_file}')
      for i in range(1, pages):
          url = f'https://fundf10.eastmoney.com/F10DataApi.aspx?type={type}&code={fundcode}&page={i}&sdate={sdate}&edate={edate}&per={per}'
          res = pd.read_html(url, encoding='utf-8')[0]
      
          if my_file.exists():
              # 判断文件/目录是否存在
              res.to_csv(my_abs_path, mode='a+', index=False, header=False)
          else:
              res.to_csv(my_abs_path, mode='a+', index=False)
      
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值