一、获取网页

1、打开一个基金网页

我们先打开天天基金网,然后随便打开一个基金的页面。例如161725招商中证白酒指数。

链接:
http://fund.eastmoney.com/161725.html.

我们发现天天基金的网址构成是http://fund.eastmoney.com/+基金编码+.html

椰树牌椰汁的即视感d(ŐдŐ๑)。

2、分析页面

我们右键点开检查,打开network,观察返回具体基金信息的文档是哪个。

好像就是这个以基金编码为名字的文件呀,那我们把它获取下来吧。

3、获取页面

  1. 要用到的库,request获取页面。
import requests
  1. 来一个经典request headers
header={
   
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.104 Safari/537.36'
}
  1. 写一个函数获取页面
def getfund(code:str):
    url='http://fund.eastmoney.com/'+code+'.html'
    page=requests.get(url)
    
    print(page.text)
  1. 测试一下看看页面内容
if __name__=='__main__':
    getfund('161725')


这里我们发现返回值乱码了,所以我们应该重新把页面加载成utf-8的编码。

  1. 加载成utf-8
def getfund(code:str):
    url='http://fund.eastmoney.com/'+code+'.html'
    page=requests.get(url)
    
    html=str(page.content,'utf-8')
    #把content中的内容重新编码成utf-8
    
    print(html)

测试一下,发现这回中文正常不乱码了。

这个title很灵性呀๑乛v乛๑。

二、解析数据

1、查看需要的基本信息

先明确一下我们想要的信息有哪些,基本的话就净值和基金名字吧。

  1. 在网页检查中选中净值

    我们观察到净值在dataNums下,边上还有变动幅度。
  2. 读出净值
    我们发现净值在这边。
<span class="ui-font-large ui-color-red ui-num">1.5613</span>

现在我们要先把之前获取的页面变成方便查找的形式,这里用到BeautifulSoup。
然后我们用find()按相应信息找出净值

import requests
from bs4 import BeautifulSoup

header={
   
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.104 Safari/537.36'
}

def getfund(code:str):
    url='http://fund.eastmoney.com/'+code+'.html'
    page=requests.get(url)
    
    html=str(page.content,'utf-8')
    #把content中的内容重新编码成utf-8
    
    soup=BeautifulSoup(html,'lxml')
   	value=soup.find_all('dd',{
   'class':'dataNums'})[1].find('span').getText()
    print(value)

测试一下

没错是我们想要的。

  1. 同理获取基金名字和日期。
def getfund(code:str):
    url='http://fund.eastmoney.com/'+code+'.html'
    page=requests.get(url)
    
    html=str(page.content,'utf-8')
    #把content中的内容重新编码成utf-8
    
    soup=BeautifulSoup(html,'lxml')
    value=soup.find_all('dd',{
   'class':'dataNums'})[1].find('span').getText()
    print(value)
    
    name=soup.find('a',{
   'href':url,'target':"_self"}).getText()
    print(name)
    
    date=soup.find('dl',{
   'class':"dataItem02"}).find('p').getText()
    print(date[6:-1])

测试一下

好,没问题。

三、统计求和

1、步骤

  1. 先写一个字典存下持仓的基金编码和份额。
    tips:这里只是举个例子,不代表任何投资建议,如有雷同纯属巧合
funds={
   
    '004432':2673.06,
    '001156':739.65,
    '009265':893.87,
    '160222':2888.71,
    '009821':1000.00,
    '008903':2215.10,
    '161725':2513.26,
    '001475':1781.60,
    '161028':2571.06,
    '270002':2772.19,
    '008168':9905.49}
  1. 然后我们把getfund()函数返回值设置成净值吧。
def getfund(code:str):
    url='http://fund.eastmoney.com/'+code+'.html'
    page=requests.get(url)
    
    html=str(page.content,'utf-8')
    #把content中的内容重新编码成utf-8
    
    soup=BeautifulSoup(html,'lxml')
    
    value=soup.find_all('dd',{
   'class':'dataNums'})[1].find('span').getText()
    name=soup.find('a',{
   'href':url,'target':"_self"}).getText()
    date=soup.find('dl',{
   'class':"dataItem02"}).find('p').getText()[6:-1]
    
    print("基金编号:",code,'\n基金名:',name,"\n日期:",date,"净值:",value)
    return float(value)
  1. 我们以此从字典中取出代码,获得净值后计算总市值,记得保留两位小数。
if __name__=='__main__':
    total=0
    for code in funds:
        share=funds[code]
        price=share*getfund(code)
        total+=price
        
        print('份额:',share,'市值:','%.2f'%price)
        
    print('总计:','%.2f'%total)

运行一下看看

基本实现了预期。

2、完整代码

#by concyclics
import requests
from bs4 import BeautifulSoup

header={
   
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.104 Safari/537.36'
}

funds={
   
    '004432':2673.06,
    '001156':739.65,
    '009265':893.87,
    '160222':2888.71,
    '009821':1000.00,
    '008903':2215.10,
    '161725':2513.26,
    '001475':1781.60,
    '161028':2571.06,
    '270002':2772.19,
    '008168':9905.49}

def getfund(code:str):
    url='http://fund.eastmoney.com/'+code+'.html'
    page=requests.get(url)
    
    html=str(page.content,'utf-8')
    #把content中的内容重新编码成utf-8
    
    soup=BeautifulSoup(html,'lxml')
    
    value=soup.find_all('dd',{
   'class':'dataNums'})[1].find('span').getText()
    name=soup.find('a',{
   'href':url,'target':"_self"}).getText()
    date=soup.find('dl',{
   'class':"dataItem02"}).find('p').getText()[6:-1]
    
    print("基金编号:",code,'\n基金名:',name,"\n日期:",date,"净值:",value)
    return float(value)


if __name__=='__main__':
    total=0
    for code in funds:
        share=funds[code]
        price=share*getfund(code)
        total+=price
        
        print('份额:',share,'市值:','%.2f'%price)
        
    print('总计:','%.2f'%total)
    

四、喜欢的话请点个关注吧!不要忘了长按点赞一键三连哦!