#fund information.py
import pandas as pd
import numpy as np
import time
import requests
import json
import xlrd
def getpdfurl(searchkey,sdate,edate):
#定义获取pdfurl的字典
sdate = pd.Timestamp(sdate).strftime('%Y-%m-%d')#用pandas库把输入时间转化成标准格式时间
edate = pd.Timestamp(edate).strftime('%Y-%m-%d')#用pandas库把输入时间转化成标准格式时间
#readline of text
params = {
'pageNum': '1',
'pageSize': '30',
'column': 'fund',
'tabName': 'fulltext',
'plate':'' ,
'stock': '',
'searchkey':searchkey ,
'secid':'' ,
'category': 'category_ndbg_jjgg;category_bndbg_jjgg;category_jdbg_jjgg',
'trade':'' ,
'seDate': '{}~{}'.format(sdate,edate),
'sortName': '',
'sortType': '',
'isHLtitle': 'true'}
url = 'http://www.cninfo.com.cn/new/hisAnnouncement/query'
headers = {"User-Agent": 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36'}
response_comment = requests.post(url,params = params,headers = headers )
res = json.loads(response_comment.text)#返回值转text,再转成json格式
n = len(res['announcements'])#读取['announcements']键的值
#print(n)
#print(res['announcements'])
allpdf = []
for k in range(n):#遍历每个返回值,构建返回的list
allpdf.append(pd.DataFrame.from_dict(res['announcements'][k],orient='index').T)#转换字典res到DataFram格式,.T为反转INDEX
allpdf = pd.concat(allpdf,axis = 0).reset_index(drop = True)#concat融合行也就是0的成为新的dataframe,合并后通过reset函数修改排序,参数为drop,因为原先的index为0,重新安排序列
allpdf = allpdf[['secName','announcementTitle','adjunctUrl']]#选择有用的列,secname是基金名称,annouT是报告的文件名,url是地址信息
#print(allpdf)
time.sleep(10)
return allpdf#作为列表返回
def getFundReportpdf(allpdf,fpath):#保存为本地文件的自定义函数
headers = {"User-Agent": 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36'}
count = 0
for k in range(allpdf.shape[0]):#读取列表的index数量,遍历每行的adjunctUrl
url = allpdf.adjunctUrl[k]
#通过网页审查得到PDF地址的url规律
urls = 'http://static.cninfo.com.cn/{}#navpanes=0&toolbar=0&statusbar=0&pagemode=thumbs&page=1'.format(url)
fname = allpdf.announcementTitle[k]#获取每个报告的报告名 转换成string
fname = fname.replace('<em>','')#替换掉不能用的文字
fname = fname.replace('</em>','')
#print(fname)
r = requests.get(urls, timeout = 300,headers = headers)
with open (fpath + '{}.pdf'.format(fname),'wb') as f:
f.write(r.content)
f.close()
count+=1
print('fname'+"\r当前进度: {:.2f}%".format(count*100/allpdf.shape[0]),end="")#显示下载进度文件名+百分比进度
time.sleep(10)
def main():
data = xlrd.open_workbook(r'E:\基金报告爬取\新建 XLS 工作表.xls')
table = data.sheet_by_index(0)
for i in range(table.nrows):
try:#通过增加try,excep函数增加程序的稳定性
sk = table.row_values(i)[0]
sd = table.row_values(i)[1]
ed = table.row_values(i)[2]
allpdf = getpdfurl(sk,sd,ed)
getFundReportpdf(allpdf,r'E:\基金报告爬取\ ')
time.sleep(10)
except:
continue
main()
功能:
读取Excel内希望获取的基金信息,爬取对应时期内的基金定期报告到指定文件夹内,便于后期批量提取基金的运行报告
运用到的python语言:
pandas库修正输入时期到指定格式
requests库的post访问,data的编辑
json库把response内容转化为字典内容方便后续编辑
pandas库转化字典内容到dataFrame格式
os库的文件读和写
xlrd库的excel文件的读取
缺点:
目前只支持填入需要爬取基金的基金名称,不能方便精确的输入基金的代码,后续可以改进