天天基金爬虫——天天基金爬取基金信息统计持仓净值
一、获取网页
1、打开一个基金网页
我们先打开天天基金网,然后随便打开一个基金的页面。例如161725招商中证白酒指数。
我们发现天天基金的网址构成是http://fund.eastmoney.com/+基金编码+.html
椰树牌椰汁的即视感d(ŐдŐ๑)。
2、分析页面
我们右键点开检查,打开network,观察返回具体基金信息的文档是哪个。
好像就是这个以基金编码为名字的文件呀,那我们把它获取下来吧。
3、获取页面
- 要用到的库,request获取页面。
import requests
- 来一个经典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'
}
- 写一个函数获取页面
def getfund(code:str):
url='http://fund.eastmoney.com/'+code+'.html'
page=requests.get(url)
print(page.text)
- 测试一下看看页面内容
if __name__=='__main__':
getfund('161725')
这里我们发现返回值乱码了,所以我们应该重新把页面加载成utf-8的编码。
- 加载成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、查看需要的基本信息
先明确一下我们想要的信息有哪些,基本的话就净值和基金名字吧。
- 在网页检查中选中净值
我们观察到净值在dataNums下,边上还有变动幅度。 - 读出净值
我们发现净值在这边。
<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)
测试一下
没错是我们想要的。
- 同理获取基金名字和日期。
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、步骤
- 先写一个字典存下持仓的基金编码和份额。
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}
- 然后我们把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)
- 我们以此从字典中取出代码,获得净值后计算总市值,记得保留两位小数。
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)