python获取基金数据,爬取基金数据

  python获取基金数据,爬取基金数据

  本文主要介绍python爬虫对资金变动信息的获取。基于上一篇文章的内容介绍,本文重点介绍Python的相关信息,有需要的可以参考。

  00-1010 1前言2抓取变动信息2.1获取基金的变动信息2.2抓取基金阶段的信息3展示最终结果。

  

目录

  上一篇文章中,Python爬虫获取基金列表,Python爬虫获取基金基本信息。我们已经介绍了如何获得基金名单和基金的基本信息。在本文中,我们继续前面的内容来获取基金变化的信息。这次获取信息的方式将是页面数据解析和api接口调用相结合。

  

1 前言

  我们通过观察基金基本信息页面,我们可以发现有关基金变动信息的页面可以包含以下4个部分:

  接下来说一下我们捕捉数据的思路。在第一张图中,我们已经得到了基金的基本信息、变动信息和阶段涨幅,但阶段涨幅已经在第二张图中显示,所以在这张图中,我们只需要得到基金的实时涨跌和前一天的净值。

  

2 抓取变动信息

  #关于基金的变动信息,先简单联系一下。其他基金的获得方式与此类似。

  #只需将访问地址更改为另一个基金代码。

  http://fund.eastmoney.com/005585.html

  这里,收购变化分为两部分。一部分是基金变动的实时获取,过一段时间会发现净值预估会有变化。通过监控浏览器的访问请求记录,我抓到了这样一个api访问,瞬间就乐了。

  //http://fundgz.1234567.com.cn/js/005585.js

  {

  基金代码 : 005585 :

  名称 : 银河风格娱乐组合,

  jzrq: 2021-11-16 ,

  dwjz: 1.6718 ,

  gsz: 1.6732 ,

  gszzl: 0.08 ,

  广州时间 : 2021-11-17 15:00

  }

  根据json返回的内容可以知道代码和基金名称,但是jzrq,dwjz,gsz,gszzl,gztime是什么意思?我仔细研究了很久,结合页面显示的内容和dfcf对汉语拼音声母编码的习惯,我猜测这些字段的意思大致是净值日期、单位净值、预计价值、预计增长率、预计时间。我有点沾沾自喜,我已经破解了它的含义。

  第二部分是获取基金的单位净值。通过分析发现该数据包含在dl class=dataItem02 的html元素中。我们通过bs4解析返回的页面信息来获取元素解析dom树。

  综上所述,我们通过api接口调用获取基金的实时变动信息,通过解析返回的html和dom树获取基金的单位净值信息。下面是第一部分捕获信息的代码。

  #抓取基金实时变动信息

  resp=requests . get( http://fund gz . 1234567.com.cn/js/{ }。js 。格式(代码))

  #去掉js的呢子,方便数据的json转换

  data=resp . text . replace( jsonpgz(, )。替换();, )

  body=json.loads(d

  ata)

  # 输出获取到的结果数据

  print("{} {} 估算值 {} 估算涨跌 {} 估算时间 {}".format(body["fundcode"], body["name"], body["gsz"], body["gszzl"], body["gztime"]))

  # 请求获取基金页面的信息

  response = requests.get("http://fund.eastmoney.com/{}.html".format(code))

  # 打印原始的请求返回报文编码方式

  # print(response.apparent_encoding)

  # 设置请求的返回内容编码方式,避免出现控制台乱码的情况

  response.encoding = "UTF-8"

  resp_body = response.text

  # 进行数据的转换和解析

  soup = BeautifulSoup(resp_body, lxml)

  # 因为确定了只有一个元素,因此可以使用 find 发放来获取数据,这个就是查找 dl标签,class=dataItem02 的元素

  dl_con = soup.find("dl", class_="dataItem02")

  # 获取基金净值的更新时间

  value_date = dl_con.find("p").get_text()

  # 只提取基金数据的时间即可

  value_date = value_date.replace("单位净值", "").replace("(", "").replace(")", "")

  # 净值数据和涨跌百分比数据是在dd标签下的两个p标签中

  value_con = dl_con.find("dd", class_="dataNums")

  data_list = value_con.find_all("span")

  val_data = data_list[0].get_text()

  per_data = data_list[1].get_text()

  print("基金净值日期 {} 净值数据 {} 涨跌百分比 {}".format(value_date, val_data, per_data))

  最终,我们通过以上的操作,就可以获取到基金的变动信息。

  

  

2.2 基金阶段信息的抓取

  基金的阶段信息抓取也是采用 bs4 解析页面数据的方式进行操作,这里分为三个图,第一个图展示的是阶段的涨跌信息,第二个和第三个是季度和年度的涨跌信息,因为最后我们要进行格式化的存储,对于第一个图我们可以进行结构化行模式存储,可以做到每天的变化展示,但是二和三我们要采用列模式的存储,作为一种统计数据进行查询。因为两种方式的解析方式不同,一图中的表头字段在数据库中是作为字段存在的,所以我们不需要关心,二和三需要获取表格的表头进行存储,统计的事件也是我们存储的数据。再有就是我们不仅要得到基金的基本信息,还要获取到沪深300的相关信息,以后方便在做筛选时作为一个强度指标进行基准判断,所以沪深300的数据也需要进行抓取,这一部分的操作难度不大,主要是在于分析获取的数据方式以及后续进行存储思路。

  

  

  

  我这里是直接获取页面所有的table 元素,然后进行循环输出结果,然后获取需要抓取的数据在那个下标。

  这里我就直接贴一下代码进行说明:

  

# 打印表格

  def print_table(head, body):

   tb = PrettyTable() # 生成表格对象

   tb.field_names = head # 定义表头

   tb.add_row(body)

   print(tb)

  # 查询季度 年度数据

  def query_year_quarter(data_list, num):

   stage_list = data_list.find_all("tr")[0].find_all("th")

   head_list = []

   for nd in stage_list:

   val = nd.get_text().strip()

   val = val.replace("季度", "").replace("年度", "").replace("年", "-")

   if val:

   # print(nd.get_text())

   head_list.append(val)

   body_list = []

   stage_list = data_list.find_all("tr")[num].find_all("td")

   for nd in stage_list:

   val = nd.get_text()

   if "阶段涨幅" in val or "沪深300" in val:

   continue

   body_list.append(val.replace("%", ""))

   # 打印表格

   print_table(head_list, body_list)

  # 获取基金基本信息这里只是贴了部分代码,需要把获取净值部分的信息进行组合才能够运行

  def query_fund_basic(code="005585", hsFlag=False):

   # 阶段涨幅表头

   stage_head_list = ["stage_week", "stage_month", "stage_month3", "stage_month6", "stage_year", "stage_year1","stage_year2", "stage_year3", ]

   stage_list = body_list[11].find_all("tr")

   # 获取第2个是基金情况 获取第4个是hs300情况

   num = 1

   if hsFlag:

   num = 3

   tmp_list = []

   for nd in stage_list[num].find_all("td"):

   val = nd.get_text()

   if "阶段涨幅" in val or "沪深300" in val:

   continue

   tmp_list.append(val.replace("%", ""))

   # 打印阶段幅度表格

   print("\t------阶段涨跌------")

   print_table(stage_head_list, tmp_list)

   print("\t------季度涨跌------")

   query_year_quarter(body_list[12], num)

   print("\t------年度涨跌------")

   query_year_quarter(body_list[13], num)

  

  

3 最终结果展现

  由于篇幅有限,本次代码就不在文内进行展示,后续我会把内容维护在github上进行提供。

  

  

  

  到此这篇关于Python爬虫获取基金变动信息的文章就介绍到这了,更多相关Python获取信息内容请搜索盛行IT软件开发工作室以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT软件开发工作室!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: