python批量获取基金定期报告

#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文件的读取

缺点:

目前只支持填入需要爬取基金的基金名称,不能方便精确的输入基金的代码,后续可以改进

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值