项目背景:
最近在研究基金,想找一些基金能和自己看中的股票能够匹配起来,发现工作量不小,需要去看每只股票的基金持仓情况,然后再去比较筛选,很花时间。于是想是否能利用Python来爬取股票的基金数据,然后自动进行比较和筛选,最后将所选股票的共同持有基金输出到Excel表格里。这就是项目背景,开发难度并不大,主要还是要找到正确的方式抓到想要的数据,下面简单介绍一下过程。
实现效果:
输入股票名称后,程序自动收集数据进行比较,并输出结果。
如下面共有19只基金都持有贵州茅台,中国平安,招商银行和宁德时代4只股票
一些更详细的数据输出到“基金筛选器.xlsx”这个表格中,比如列出每只股票在基金中占的净值比例,这个是我们选择基金的重要参考指标。
如下图:
另外每只股票的基金持仓情况也有单独的一张表来展示,这些就是网上爬取的原始数据:
项目主要代码解析:
通过requests获取网页内容
import requests,
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36"}
stockCode = name2code(stocks[i])
if stockCode == '':
print("未找到股票<", stocks[i], ">,请确认股票名称!")
for i in range(0, stockNum):
url = 'https://vip.stock.finance.sina.com.cn/corp/go.php/vCI_FundStockHolder/stockid/{}.phtml'.format(stockCode)
res = requests.get(url, headers=headers)
html = res.text
通过BeautifulSoup分析并提取网页内容,将需要的数据据录入到Excel文件中
from openpyxl import Workbook
from bs4 import BeautifulSoup as bs
wb = Workbook()
if i == 0:
ws = wb.active
else:
ws = wb.create_sheet("Sheet")
bf = bs(html, 'lxml')
table = bf.find('table', {'id': 'FundHoldSharesTable'})
for row in table.findAll('tr'):
for item in row.findAll('td'):
cNum += 1
ws.cell(rNum, cNum, item.text)
对提取出来的数据进行比较,找出共同基金,并写入Excel表格
for fund0 in fundList[0]:
#轮询后面每个股票的基金池
for x in range(1,stockNum):
found = False
for fundX in fundList[x]:
if fund0["name"] == fundX["name"]:
found = True
break #找到以后跳出本次轮询,继续一下组轮询
if not found:
break #如果上一组轮寻没有找到,则直接跳过后面所有的轮询
if found:
print("为您找到以下共同基金:")
print("-"*50)
ws.cell(r, 1, fund0["name"])
ws.cell(r, 2, int(fund0["code"]))
wb.save("基金筛选器.xlsx")
程序下载链接:
相关阅读: