昨天在看基金相关的视频,老师讲挑选基金的技巧时,举例通过天天基金网站搜索基金代码,然后通过阶段涨幅模块的四分位排名来检验基金的好坏程度,http://fund.eastmoney.com/580003.html?spm=search。
因为本人买了各种基金多达20多种,想着这样一个一个找有点发怵,就正好赶上周六周天,在家没啥事就写了个程序遍历基金输出四分位排名到excel里,方便统一查看比较。
以后想着也可以加入各个参数,分别比较基金的好坏。
以下代码有些重复,有时间会继续优化成函数形式。
主要分两个部分,一个是读取时间范围,写入到excel的标题,一个是循环读取各个基金对应的四分位,写入excel的各个列
# coding=utf-8
import requests
from bs4 import BeautifulSoup
import re
import xlwt
import xlrd
from xlutils.copy import copy
fund_codes=["161024","161725",'002697','006408','005919','003397','004812','001704','006751',"32002",'004190','001268','001632',"519674",'004347','001618',"320007",'007301','001938','006682',"260108","166002"]
row=0
# 一、取时间范围字段,作为表格的标题
#1、获取网页内容
base_url = 'http://fund.eastmoney.com/161024.html?spm=search'
response = requests.get(url=base_url)
response.encoding = response.apparent_encoding
soup = BeautifulSoup(response.text, 'lxml').decode('utf-8') # 网页返回的内容
#2、根据正则表达式找出想要的字段,并格式化为列表形式
pattern2 = re.compile(
'<div.*?fund_item IncreaseAmount popTab.*?IncreaseAmount">.*?<div.*?bd">.*?<li.*?increaseAmount_stage">.*?<div>(.*?)</div>.*?<div>(.*?)</div>.*?<div>(.*?)</div>.*?<div>(.*?)</div>.*?<div>(.*?)</div>.*?<div>(.*?)</div>.*?<div>(.*?)</div>.*?<div>(.*?)</div>',
re.S)
times = re.findall(pattern2, soup)
print(times)
#将数组中的空格和换行符去掉:strip()
for time in times:
times2=time[0].strip(),time[1].strip(),time[2].strip(),time[3].strip(),time[4].strip(),time[5].strip(),time[6].strip(),time[7].strip()
print(times2)
# 元组转换成列表:list()
times=list(times2)
print(times)
#3、打开表格,写入标题
path = "D:\python\\fund_基金\\text4.xls"
workbook = xlrd.open_workbook(path) #打开工作簿
sheets = workbook.sheet_names() #获取工作簿中的所有表格
worksheet = workbook.sheet_by_name(sheets[0]) #获取工作簿中的第一个表格
rows_old = worksheet.nrows #获取表格中已存在的数据的行数
new_workbook = copy(workbook) #将xlrd对象拷贝转化为xlwt对象
new_worksheet = new_workbook.get_sheet(0) #获取转化后工作簿中的第一个表格
for j in range(len(times)): #循环读取列表,将列表数据写入row行,j列
new_worksheet.write(row,j+1,times[j])
row+=1
new_workbook.save(path) #保存工作簿
print("标题写入成功")
#二、循环读取各个基金的四分位排名
for code in fund_codes:
#1、获取网页返回内容
base_url='http://fund.eastmoney.com/%s.html?spm=search'%code
response=requests.get(url=base_url)
response.encoding = response.apparent_encoding
soup = BeautifulSoup(response.text,'lxml').decode('utf-8') #网页返回的内容
#2、正则表达式解析出排名高低,并格式化为列表格式
pattern = re.compile('<div.*?fund_item IncreaseAmount popTab.*?IncreaseAmount">.*?<div.*?bd">.*?<li.*?increaseAmount_stage">.*?<div.*?typeName.*?position:relative;">.*?<div.*?infoTips">.*?</td>.*?<h3>(.*?)</h3>.*?<h3>(.*?)</h3>.*?<h3>(.*?)</h3>.*?<h3>(.*?)</h3>.*?<h3>(.*?)</h3>.*?<h3>(.*?)</h3>.*?<h3>(.*?)</h3>.*?<h3>(.*?)</h3>',re.S)
items=re.findall(pattern,soup)
print(items)
# 将数组中的空格和换行符去掉:strip()
for item in items:
items2=item[0].strip(),item[1].strip(),item[2].strip(),item[3].strip(),item[4].strip(),item[5].strip(),item[6].strip(),item[7].strip()
print(items2)
# 元组转换成列表:list()
lists=list(items2)
print(lists)
#3、将数据写入到文件中
#1)写入txt文件
# file=open("fund.txt","w+")
# for i in lists:
# file.writelines(i)
# 2)首次写入excel文件,只能写入一行, 无法追加多行
# f=xlwt.Workbook()
# sheet1=f.add_sheet(u'sheet1',cell_overwrite_ok=True)
# for j in range(len(lists)):
# sheet1.write(row,j,lists[j])
# row = row + 1
# f.save('text4.xls')
#3)打开表格,追加形式写入新数据
path = "D:\python\\fund_基金\\text4.xls"
workbook = xlrd.open_workbook(path) #打开工作簿
sheets = workbook.sheet_names() #获取工作簿中的所有表格
worksheet = workbook.sheet_by_name(sheets[0]) #获取工作簿中的第一个表格
rows_old = worksheet.nrows #获取表格中已存在的数据的行数
new_workbook = copy(workbook) #将xlrd对象拷贝转化为xlwt对象
new_worksheet = new_workbook.get_sheet(0) #获取转化后工作簿中的第一个表格
for j in range(len(lists)): #循环读取列表,将列表数据写入row行,j列
new_worksheet.write(row,0,code)
new_worksheet.write(row,j+1,lists[j])
row=row+1
new_workbook.save(path) #保存工作簿
print("%s行追加写入成功!"%(row-1))
最终执行结果:test4.xls