袁嘉维的综合实验

Ⅰ.自动挑选出所分配行业于的公司

导入本部分所需模块


  import pdfplumber
  import pandas as pd
  import re
  import fitz
  import os
  os.chdir("./Final Project")

代码

  

     #把PDF解析成列表
    def Pdf_extract_table(filename):
            pdf = pdfplumber.open(filename)
            page_count = len(pdf.pages)
            data = []
            for i in range(page_count):
                data += pdf.pages[i].extract_table()
            pdf.close()
            return data

        #将上述列表转化成完整的数据框
    def Get_alllist(data):
            df = pd.DataFrame(data, columns=data[0]).iloc[:, 1:] #去掉第一列
            df = df.ffill() #将所属行业类型向后填充
            return df

    table = Pdf_extract_table("行业分类.pdf") #把PDF解析成列表
    company = Get_alllist(table) #将上述列表转化成完整的数据框

    companylist = company.loc[company['行业大类代码'] == "15"]
    company_list = companylist.loc[ : ,"上市公司简称"][-10:]#第二轮从后往前
    company_list[296]="安德利"#运行到该家公司会报错,在 http://www.cninfo.com.cn/new/data/szse_stock.json 查找后发现德利股份改名为安德利
    companylist = companylist.iloc[-10:]

    for i in range(len(company_list)):# 把*ST前面的"*"
              company_list.iloc[i] = company_list.iloc[i].replace('*', '')


  
  

结果

获取结果截图 运行结果截图

Ⅱ.下载年报

导入本部分所需模块

    
      #参考https://zhuanlan.zhihu.com/p/377143422
      import json
      import os
      from time import sleep
      from urllib import parse
      import requests
    
    

下载年报

    

      # #试错次数过多,网站检测到爬虫,断开链接--解决方法:换地址

      def get_adress(company_list):
                url = "http://www.cninfo.com.cn/new/information/topSearch/detailOfQuery"
                data = {
                    'keyWord': company_list,
                    'maxSecNum': 10,
                    'maxListNum': 5,
                 }
                hd = {
                      'Host': 'www.cninfo.com.cn',
                      'Origin': 'http://www.cninfo.com.cn',
                      'Pragma': 'no-cache',
                      'Accept-Encoding': 'gzip,deflate',
                      'Connection': 'keep-alive',
                      'Content-Length': '70',
                      'User-Agent': 'Mozilla/5.0 (Linux; Android 10; SM-G981B) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.162 Mobile Safari/537.36',
                      'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
                      'Accept': 'application/json,text/plain,*/*',
                      'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8',
                  }
                r = requests.post(url, headers=hd, data=data)
                print(r.text)
                r = r.content
                m = str(r, encoding="utf-8")
                pk = json.loads(m)
                orgId = pk["keyBoardList"][0]["orgId"]  # 获取参数
                plate = pk["keyBoardList"][0]["plate"]
                code = pk["keyBoardList"][0]["code"]
                print(orgId, plate, code)
                return orgId, plate, code

      def get_PDF(orgId, plate, code):
                url = "http://www.cninfo.com.cn/new/hisAnnouncement/query"
                data = {
                    'stock': '{},{}'.format(code, orgId),
                    'tabName': 'fulltext',
                    'pageSize': 30,
                    'pageNum': 1,
                    'column': plate,
                    'category': 'category_ndbg_szsh;',
                    'plate': '',
                    'seDate': '',
                    'searchkey': '',
                    'secid': '',
                    'sortName': '',
                    'sortType': '',
                    'isHLtitle': 'true',
                }

                hd = {
                    'Host': 'www.cninfo.com.cn',
                    'Origin': 'http://www.cninfo.com.cn',
                    'Pragma': 'no-cache',
                    'Accept-Encoding': 'gzip,deflate',
                    'Connection': 'keep-alive',
                    # 'Content-Length': '216',
                    'User-Agent': 'User-Agent:Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27',
                    'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
                    'Accept': 'application/json,text/plain,*/*',
                    'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8',
                    'X-Requested-With': 'XMLHttpRequest',
                    # 'Cookie': cookies
                }
                data = parse.urlencode(data)
                print(data)
                r = requests.post(url, headers=hd, data=data)
                print(r.text)
                r = str(r.content, encoding="utf-8")
                r = json.loads(r)
                reports_list = r['announcements']
                for report in reports_list:
                    if '摘要' in report['announcementTitle'] or "20" not in report['announcementTitle']:
                        continue
                    if "200" in report['announcementTitle']:#但如果将2010/2011也纳入忽略范围时会无法下载,仅建空文件夹
                        continue
                    if 'H' in report['announcementTitle']:
                        continue
                    if '已取消' in report['announcementTitle']:
                        continue
                    if '英文版' in report['announcementTitle']:
                        continue
                    else:  # http://static.cninfo.com.cn/finalpage/2019-03-29/1205958883.PDF
                        pdf_url = "http://static.cninfo.com.cn/" + report['adjunctUrl']
                        year = re.findall(r'\b\d{4}\b', pdf_url)
                        year = [int(i) - 1 for i in year]
                        year ="".join(list(map(str,year)))
                        # file_name = report['announcementTitle']
                        print("正在下载:" + pdf_url,  company + year +"年年度报告")
                        #下载
                        r = requests.get(pdf_url)
                        f = open(company +"/"+ company + year +"年年度报告" + ".pdf", "wb")#统一文件名
                        f.write(r.content)
                        sleep(2)



      if __name__ == '__main__':
                for company in company_list[:]:
                    os.mkdir(company)
                    orgId, plate, code = get_adress(company)
                    get_PDF(orgId, plate, code)
                    print("下载下一家")
                print("全部下载完毕!")

    
    

结果

运行结果截图 获取结果截图

Ⅲ解析年报,获取数据

获取年报位置

      

        file_dir = "E:\\learn\\大三下\\金融数据获取与处理\\Final Project"

        filepath=file_dir
        filelist=[]
        pdfpath=[]
        list1= os.listdir(filepath)
        for file1 in list1:
            path = os.path.join(filepath, file1)
            # print(file1)
            if os.path.isfile(path):
                filelist.append(file1)
                pdfpath.append(path)
            else:
                list2=os.listdir(path)
                for file2 in list2:
                    path2 = os.path.join(path, file2)
                    # print(file2)
                    if os.path.isfile(path2):
                        filelist.append(file2)
                        pdfpath.append(path2)
        filelist.remove('行业分类.pdf')
        pdfpath.remove('E:\learn\大三下\金融数据获取与处理\Final Project\行业分类.pdf')

      
    

获取数据

      

        def get_subtxt(doc,bounds=('主要会计数据和财务指标','总资产')):
            #默认设置为首尾页码
            start_pageno=0
            end_pageno=len(doc)-1
            #
            lb,ub=bounds
            #获取左界页码
            for n in range(len(doc)):
                page=doc[n]
                txt=page.get_text()
                if lb in txt:
                    start_pageno=n
                    break
            #获取右界页码
            for n in range(start_pageno,len(doc)):
                if ub in doc[n].get_text():
                    end_pageno=n
                    break
            #获取小范围内字符串
            txt=''
            for n in range(start_pageno,end_pageno+1):
                page=doc[n]
                txt += page.get_text()
            return(txt)

        #获取表头
        def get_th_span(txt):
            nianfen='(20\d\d|199\d)\s*?年'   #2016和年之间是空格,而2016年和2015年之间是空格
            s=f'{nianfen}\s*{nianfen}.*?{nianfen}'
            p=re.compile(s,re.DOTALL)  #re.DOTALL指.遇到换行符也是可以的
            matchobj=p.search(txt)
            #
            end=matchobj.end()
            year1=matchobj.group(1)
            year2=matchobj.group(2)
            year3=matchobj.group(3)
            #
            flag=(int(year1)-int(year2) == 1) and (int(year2)-int(year3) == 1)
            #
            while (not flag):
                matchobj=p.search(txt[end:])
                end=matchobj.end()
                year1=matchobj.group(1)
                year2=matchobj.group(2)
                year3=matchobj.group(3)
                flag=(int(year1)-int(year2) == 1)
                flag=flag and (int(year2)-int(year3) ==1)
            return(matchobj.span())

        #获取表格边界
        def get_bounds(txt):
            th_span_1st=get_th_span(txt)
            end=th_span_1st[1]
            th_span_2nd=get_th_span(txt[end:])
            th_span_2nd=(end+th_span_2nd[0],end+th_span_2nd[1])
            #
            s=th_span_1st[1]
            e=th_span_2nd[0]-1
            #
            while (txt[e] not in '0123456789'):  #如果最后一个不是数字
                e=e-1
            return(s,e+1)




        #获取‘营业收入’和‘归属于上市公司股\n东的净利润’
        def get_account_data(account,txt):
            p_txt='%s\D*?(\d{1,3}(?:,\d{3})*(?:\.\d+)?)' % account   #%s是占位符,用‘account’替换,\D是非数字,\d{1,3}是数字1或2或3个,*可重复,?非贪婪,()内是所要的数字,小数点后\d+表示小数点后至少一位数字
            p=re.compile(p_txt)
            matchobj=p.search(txt)
            amt=matchobj.group(1)
            return(amt)


        #获取整张表格
        # subtxt=txt[txt.find('营业收入'):txt.find('总资产')]
        def get_keywords(txt):
            p=re.compile(r's\D*?(\d{1,3}(?:,\d{3})*(?:\.\d+)?)')
            keywords=p.findall(txt)
            return(keywords)


        def parse_key_fin_data(subtxt,keywords):
            # keywords=['营业收入','营业成本','毛利','归属于上市','归属于上市','经营活动']
            ss=[]
            s=0
            for kw in keywords:
                n=subtxt.find(kw,s)
                ss.append(n)
                s=n+len(kw)
            ss.append(len(subtxt))
            data=[]
            p=re.compile('\D+(?:\s+\D*)?(?:(.*)|\(.*\))?')
            p2=re.compile('\s')
            for n in range(len(ss)-1):
                s=ss[n]
                e=ss[n+1]
                line=subtxt[s:e]
                #获取可能换行的账户名称
                matchobj=p.search(line)
                account_name=p2.sub('',matchobj.group())
                #获取三年数据
                amnts=line[matchobj.end():].split()
                #加上账户名称
                amnts.insert(0,account_name)
                #追加到总数据
                data.append(amnts)
            return data

        import matplotlib.pyplot as plt
        # from pylab import *
        plt.rcParams['font.sans-serif'] = ['SimHei']

        #东鹏特饮 仅2年年报
        filename='E:\learn\大三下\金融数据获取与处理\Final Project\东鹏饮料\东鹏饮料2021年年度报告.pdf'
        doc=fitz.open(filename)
        txt=get_subtxt(doc)
        span=get_bounds(txt)
        subtxt=txt[txt.find('营业收入'):txt.find('总资产')]
        keywords=['营业收入','归属于上市公司股东的净利润']
        data=parse_key_fin_data(subtxt, keywords)
        data_get=data[0]
        dp_sr=[]
        dp_jlr=[]
        dp_sr.append(data_get[4])#19
        dp_jlr.append(data_get[10])#19
        filename='E:\learn\大三下\金融数据获取与处理\Final Project\东鹏饮料\东鹏饮料2022年年度报告.pdf'
        doc=fitz.open(filename)
        txt=get_subtxt(doc)
        span=get_bounds(txt)
        subtxt=txt[txt.find('营业收入'):txt.find('总资产')]
        keywords=['营业收入','归属于上市公司股东的净利润']
        data=parse_key_fin_data(subtxt, keywords)
        data_get=data[0]
        dp_year=['2019年','2020年','2021年','2022年']
        dp_sr.append(data_get[4])#20
        dp_sr.append(data_get[2])#21
        dp_sr.append(data_get[1])#22
        dp_jlr.append(data_get[10])#20
        dp_jlr.append(data_get[8])#21
        dp_jlr.append(data_get[7])#22

        #今世缘
        jsy_sr=[]
        jsy_jlr=[]
        filename='E:\learn\大三下\金融数据获取与处理\Final Project\今世缘\今世缘2014年年度报告.pdf'
        doc=fitz.open(filename)
        txt=get_subtxt(doc)
        span=get_bounds(txt)
        subtxt=txt[txt.find('营业收入'):txt.find('总资产')]
        keywords=['营业收入','归属于上市公司股东的净利润']
        data=parse_key_fin_data(subtxt, keywords)
        data_get=data[0]
        jsy_sr.append(data_get[4])
        jsy_jlr.append(data_get[10])
        jsy_sr.append(data_get[2])
        jsy_jlr.append(data_get[8])
        jsy_sr.append(data_get[1])
        jsy_jlr.append(data_get[7])
        filename='E:\learn\大三下\金融数据获取与处理\Final Project\今世缘\今世缘2017年年度报告.pdf'
        doc=fitz.open(filename)
        txt=get_subtxt(doc)
        span=get_bounds(txt)
        subtxt=txt[txt.find('营业收入'):txt.find('总资产')]
        keywords=['营业收入','归属于上市公司股东的净利润']
        data=parse_key_fin_data(subtxt, keywords)
        data_get=data[0]
        jsy_sr.append(data_get[5])
        jsy_jlr.append(data_get[13])
        jsy_sr.append(data_get[2])
        jsy_jlr.append(data_get[10])
        jsy_sr.append(data_get[1])
        jsy_jlr.append(data_get[9])
        filename='E:\learn\大三下\金融数据获取与处理\Final Project\今世缘\今世缘2020年年度报告.pdf'
        doc=fitz.open(filename)
        txt=get_subtxt(doc)
        span=get_bounds(txt)
        subtxt=txt[txt.find('营业收入'):txt.find('总资产')]
        keywords=['营业收入','归属于上市公司股东的净利润']
        data=parse_key_fin_data(subtxt, keywords)
        data_get=data[0]
        jsy_sr.append(data_get[4])
        jsy_jlr.append(data_get[10])
        jsy_sr.append(data_get[2])
        jsy_jlr.append(data_get[8])
        jsy_sr.append(data_get[1])
        jsy_jlr.append(data_get[7])
        filename='E:\learn\大三下\金融数据获取与处理\Final Project\今世缘\今世缘2022年年度报告.pdf'
        doc=fitz.open(filename)
        txt=get_subtxt(doc)
        span=get_bounds(txt)
        subtxt=txt[txt.find('营业收入'):txt.find('总资产')]
        keywords=['营业收入','归属于上市公司股东的净利润']
        data=parse_key_fin_data(subtxt, keywords)
        data_get=data[0]
        jsy_sr.append(data_get[2])
        jsy_jlr.append(data_get[8])
        jsy_sr.append(data_get[1])
        jsy_jlr.append(data_get[7])
        # year=['2019年','2020年','2021年','2022年']

        #口子窖
        kzj_sr=[]
        kzj_jlr=[]
        filename='E:\learn\大三下\金融数据获取与处理\Final Project\口子窖\口子窖2015年年度报告.pdf'
        doc=fitz.open(filename)
        txt=get_subtxt(doc)
        span=get_bounds(txt)
        subtxt=txt[txt.find('营业收入'):txt.find('总资产')]
        keywords=['营业收入','归属于上市公司股东的净利润']
        data=parse_key_fin_data(subtxt, keywords)
        data_get=data[0]
        kzj_sr.append(data_get[4])
        kzj_jlr.append(data_get[10])
        kzj_sr.append(data_get[2])
        kzj_jlr.append(data_get[8])
        kzj_sr.append(data_get[1])
        kzj_jlr.append(data_get[7])
        filename='E:\learn\大三下\金融数据获取与处理\Final Project\口子窖\口子窖2018年年度报告.pdf'
        doc=fitz.open(filename)
        txt=get_subtxt(doc)
        span=get_bounds(txt)
        subtxt=txt[txt.find('营业收入'):txt.find('总资产')]
        keywords=['营业收入','归属于上市公司股东的净利润']
        data=parse_key_fin_data(subtxt, keywords)
        data_get=data[0]
        kzj_sr.append(data_get[4])
        kzj_jlr.append(data_get[15])
        kzj_sr.append(data_get[2])
        kzj_jlr.append(data_get[13])
        kzj_sr.append(data_get[1])
        kzj_jlr.append(data_get[12])
        filename='E:\learn\大三下\金融数据获取与处理\Final Project\口子窖\口子窖2021年年度报告.pdf'
        doc=fitz.open(filename)
        txt=get_subtxt(doc)
        span=get_bounds(txt)
        subtxt=txt[txt.find('营业收入'):txt.find('总资产')]
        keywords=['营业收入','归属于上市公司股东的净利润']
        data=parse_key_fin_data(subtxt, keywords)
        data_get=data[0]
        kzj_sr.append(data_get[4])
        kzj_jlr.append(data_get[10])
        kzj_sr.append(data_get[2])
        kzj_jlr.append(data_get[8])
        kzj_sr.append(data_get[1])
        kzj_jlr.append(data_get[7])
        filename='E:\learn\大三下\金融数据获取与处理\Final Project\口子窖\口子窖2022年年度报告.pdf'
        doc=fitz.open(filename)
        txt=get_subtxt(doc)
        span=get_bounds(txt)
        subtxt=txt[txt.find('营业收入'):txt.find('总资产')]
        keywords=['营业收入','归属于上市公司股东的净利润']
        data=parse_key_fin_data(subtxt, keywords)
        data_get=data[0]
        kzj_sr.append(data_get[1])
        kzj_jlr.append(data_get[7])

        #均瑶健康
        jyjk_sr=[]
        jyjk_jlr=[]
        filename='E:\learn\大三下\金融数据获取与处理\Final Project\均瑶健康\均瑶健康2020年年度报告.pdf'
        doc=fitz.open(filename)
        txt=get_subtxt(doc)
        span=get_bounds(txt)
        subtxt=txt[txt.find('营业收入'):txt.find('总资产')]
        keywords=['营业收入','归属于上市公司股东的净利润']
        data=parse_key_fin_data(subtxt, keywords)
        data_get=data[0]
        jyjk_sr.append(data_get[4])
        jyjk_jlr.append(data_get[10])
        jyjk_sr.append(data_get[2])
        jyjk_jlr.append(data_get[8])
        jyjk_sr.append(data_get[1])
        jyjk_jlr.append(data_get[7])
        filename='E:\learn\大三下\金融数据获取与处理\Final Project\口子窖\口子窖2022年年度报告.pdf'
        doc=fitz.open(filename)
        txt=get_subtxt(doc)
        span=get_bounds(txt)
        subtxt=txt[txt.find('营业收入'):txt.find('总资产')]
        keywords=['营业收入','归属于上市公司股东的净利润']
        data=parse_key_fin_data(subtxt, keywords)
        data_get=data[0]
        jyjk_sr.append(data_get[2])
        jyjk_jlr.append(data_get[8])
        jyjk_sr.append(data_get[1])
        jyjk_jlr.append(data_get[7])

        #威龙股份
        wlgf_sr=[]
        wlgf_jlr=[]
        filename='E:\learn\大三下\金融数据获取与处理\Final Project\威龙股份\威龙股份2016年年度报告.pdf'
        doc=fitz.open(filename)
        txt=get_subtxt(doc)
        span=get_bounds(txt)
        subtxt=txt[txt.find('营业收入'):txt.find('总资产')]
        keywords=['营业收入','归属于上市公司股东的净利润']
        data=parse_key_fin_data(subtxt, keywords)
        data_get=data[0]
        data_get2=data[1]
        wlgf_sr.append(data_get[4])
        wlgf_jlr.append(data_get2[4])
        wlgf_sr.append(data_get[2])
        wlgf_jlr.append(data_get2[1])
        wlgf_sr.append(data_get[1])
        wlgf_jlr.append(data_get2[1])
        filename='E:\learn\大三下\金融数据获取与处理\Final Project\威龙股份\威龙股份2019年年度报告.pdf'
        doc=fitz.open(filename)
        txt=get_subtxt(doc)
        span=get_bounds(txt)
        subtxt=txt[txt.find('营业收入'):txt.find('总资产')]
        keywords=['营业收入','归属于上市公司股东的净利润']
        data=parse_key_fin_data(subtxt, keywords)
        data_get=data[0]
        wlgf_sr.append(data_get[4])
        wlgf_jlr.append(data_get[10])
        wlgf_sr.append(data_get[2])
        wlgf_jlr.append(data_get[8])
        wlgf_sr.append(data_get[1])
        wlgf_jlr.append(data_get2[7])
        filename='E:\learn\大三下\金融数据获取与处理\Final Project\威龙股份\威龙股份2022年年度报告.pdf'
        doc=fitz.open(filename)
        txt=get_subtxt(doc)
        span=get_bounds(txt)
        subtxt=txt[txt.find('营业收入'):txt.find('总资产')]
        keywords=['营业收入','归属于上市公司股东的净利润']
        data=parse_key_fin_data(subtxt, keywords)
        data_get=data[0]
        wlgf_sr.append(data_get[4])
        wlgf_jlr.append(data_get[42])
        wlgf_sr.append(data_get[2])
        wlgf_jlr.append(data_get[40])
        wlgf_sr.append(data_get[1])
        wlgf_jlr.append(data_get[39])

        #安德利
        adl_sr=[]
        adl_jlr=[]
        filename='E:\learn\大三下\金融数据获取与处理\Final Project\安德利\安德利2020年年度报告.pdf'
        doc=fitz.open(filename)
        txt=get_subtxt(doc)
        span=get_bounds(txt)
        subtxt=txt[txt.find('营业收入'):txt.find('总资产')]
        keywords=['营业收入','归属于上市公司股东的净利润']
        data=parse_key_fin_data(subtxt, keywords)
        data_get=data[0]
        adl_sr.append(data_get[4])
        adl_jlr.append(data_get[10])
        adl_sr.append(data_get[2])
        adl_jlr.append(data_get[8])
        adl_sr.append(data_get[1])
        adl_jlr.append(data_get[7])
        filename='E:\learn\大三下\金融数据获取与处理\Final Project\安德利\安德利2022年年度报告.pdf'
        doc=fitz.open(filename)
        txt=get_subtxt(doc)
        span=get_bounds(txt)
        subtxt=txt[txt.find('营业收入'):txt.find('总资产')]
        keywords=['营业收入','归属于上市公司股东的净利润']
        data=parse_key_fin_data(subtxt, keywords)
        data_get=data[0]
        adl_sr.append(data_get[2])
        adl_jlr.append(data_get[8])
        adl_sr.append(data_get[1])
        adl_jlr.append(data_get[7])

        #李子园
        lzy_sr=[]
        lzy_jlr=[]
        filename='E:\learn\大三下\金融数据获取与处理\Final Project\李子园\李子园2020年年度报告.pdf'
        doc=fitz.open(filename)
        txt=get_subtxt(doc)
        span=get_bounds(txt)
        subtxt=txt[txt.find('营业收入'):txt.find('总资产')]
        keywords=['营业收入','归属于上市公司股东的净利润']
        data=parse_key_fin_data(subtxt, keywords)
        data_get=data[0]
        data_get2=data[1]
        lzy_sr.append(data_get[4])
        lzy_jlr.append(data_get2[4])
        lzy_sr.append(data_get[2])
        lzy_jlr.append(data_get2[2])
        lzy_sr.append(data_get[1])
        lzy_jlr.append(data_get2[1])
        filename='E:\learn\大三下\金融数据获取与处理\Final Project\安德利\安德利2022年年度报告.pdf'
        doc=fitz.open(filename)
        txt=get_subtxt(doc)
        span=get_bounds(txt)
        subtxt=txt[txt.find('营业收入'):txt.find('总资产')]
        keywords=['营业收入','归属于上市公司股东的净利润']
        data=parse_key_fin_data(subtxt, keywords)
        data_get=data[0]
        lzy_sr.append(data_get[2])
        lzy_jlr.append(data_get[8])
        lzy_sr.append(data_get[1])
        lzy_jlr.append(data_get[7])

        #迎驾贡酒
        yjgj_sr=[]
        yjgj_jlr=[]
        filename=['E:\learn\大三下\金融数据获取与处理\Final Project\迎驾贡酒\迎驾贡酒2015年年度报告.pdf' ,'E:\learn\大三下\金融数据获取与处理\Final Project\迎驾贡酒\迎驾贡酒2018年年度报告.pdf' ]
        for i in filename:
            doc=fitz.open(i)
            txt=get_subtxt(doc)
            span=get_bounds(txt)
            subtxt=txt[txt.find('营业收入'):txt.find('总资产')]
            keywords=['营业收入','归属于上市公司股东的净利润']
            data=parse_key_fin_data(subtxt, keywords)
            data_get=data[0]
            yjgj_sr.append(data_get[4])
            yjgj_jlr.append(data_get[10])
            yjgj_sr.append(data_get[2])
            yjgj_jlr.append(data_get[8])
            yjgj_sr.append(data_get[1])
            yjgj_jlr.append(data_get[7])
        filename=['E:\learn\大三下\金融数据获取与处理\Final Project\迎驾贡酒\迎驾贡酒2020年年度报告.pdf' ,'E:\learn\大三下\金融数据获取与处理\Final Project\迎驾贡酒\迎驾贡酒2022年年度报告.pdf' ]
        for i in filename:
            doc=fitz.open(i)
            txt=get_subtxt(doc)
            span=get_bounds(txt)
            subtxt=txt[txt.find('营业收入'):txt.find('总资产')]
            keywords=['营业收入','归属于上市公司股东的净利润']
            data=parse_key_fin_data(subtxt, keywords)
            data_get=data[0]
            yjgj_sr.append(data_get[2])
            yjgj_jlr.append(data_get[8])
            yjgj_sr.append(data_get[1])
            yjgj_jlr.append(data_get[7])

        #金徽酒
        jhj_sr=[]
        jhj_jlr=[]
        filename=['E:\learn\大三下\金融数据获取与处理\Final Project\金徽酒\金徽酒2016年年度报告.pdf' ,'E:\learn\大三下\金融数据获取与处理\Final Project\金徽酒\金徽酒2019年年度报告.pdf' ,'E:\learn\大三下\金融数据获取与处理\Final Project\金徽酒\金徽酒2022年年度报告.pdf' ]
        for i in filename:
            doc=fitz.open(i)
            txt=get_subtxt(doc)
            span=get_bounds(txt)
            subtxt=txt[txt.find('营业收入'):txt.find('总资产')]
            keywords=['营业收入','归属于上市公司股东的净利润']
            data=parse_key_fin_data(subtxt, keywords)
            data_get=data[0]
            data_get2=data[1]
            jhj_sr.append(data_get[4])
            jhj_jlr.append(data_get2[4])
            jhj_sr.append(data_get[2])
            jhj_jlr.append(data_get2[2])
            jhj_sr.append(data_get[1])
            jhj_jlr.append(data_get2[1])

        #香飘飘
        xpp_sr=[]
        xpp_jlr=[]
        filename=['E:\learn\大三下\金融数据获取与处理\Final Project\香飘飘\香飘飘2017年年度报告.pdf' ,'E:\learn\大三下\金融数据获取与处理\Final Project\香飘飘\香飘飘2020年年度报告.pdf' ]
        for i in filename:
            doc=fitz.open(i)
            txt=get_subtxt(doc)
            span=get_bounds(txt)
            subtxt=txt[txt.find('营业收入'):txt.find('总资产')]
            keywords=['营业收入','归属于上市公司股东的净利润']
            data=parse_key_fin_data(subtxt, keywords)
            data_get=data[0]
            xpp_sr.append(data_get[4])
            xpp_jlr.append(data_get[10])
            xpp_sr.append(data_get[2])
            xpp_jlr.append(data_get[8])
            xpp_sr.append(data_get[1])
            xpp_jlr.append(data_get[7])
        filename='E:\learn\大三下\金融数据获取与处理\Final Project\香飘飘\香飘飘2022年年度报告.pdf'
        doc=fitz.open(filename)
        txt=get_subtxt(doc)
        span=get_bounds(txt)
        subtxt=txt[txt.find('营业收入'):txt.find('总资产')]
        keywords=['营业收入','归属于上市公司股东的净利润']
        data=parse_key_fin_data(subtxt, keywords)
        data_get=data[0]
        xpp_sr.append(data_get[2])
        xpp_jlr.append(data_get[8])
        xpp_sr.append(data_get[1])
        xpp_jlr.append(data_get[7])

        #将str转化为float

        def tran(data,newlist):
            for i in data:
                i=i.replace(',','')
                newlist.append(float(i))
        #dp
        dp1=[]
        tran(dp_sr,dp1)
        dp2=[]
        tran(dp_jlr,dp2)


        #jsy
        jsy1=[]
        tran(jsy_sr,jsy1)
        jsy2=[]
        tran(jsy_jlr,jsy2)


        #kzj
        kzj1=[]
        kzj1=[]
        tran(kzj_sr,kzj1)
        kzj2=[]
        tran(kzj_jlr,kzj2)


        #jyjk
        jyjk1=[]
        tran(jyjk_sr,jyjk1)
        jyjk2=[]
        tran(jyjk_jlr,jyjk2)

        #wlgf
        wlgf1=[]
        tran(wlgf_sr,wlgf1)
        wlgf2=[]
        tran(wlgf_jlr,wlgf2)


        #adl
        adl1=[]
        tran(adl_sr,adl1)
        adl2=[]
        tran(adl_jlr,adl2)


        #lzy
        lzy1=[]
        tran(lzy_sr,lzy1)
        lzy2=[]
        tran(lzy_jlr,lzy2)

        #yjgj
        yjgj1=[]
        tran(yjgj_sr,yjgj1)
        yjgj2=[]
        tran(yjgj_jlr,yjgj2)

        #jhj
        jhj1=[]
        tran(jhj_sr,jhj1)
        jhj2=[]
        tran(jhj_jlr,jhj2)

        #xpp
        xpp1=[]
        tran(xpp_sr,xpp1)
        xpp2=[]
        tran(xpp_jlr,xpp2)
      

结果

获取年报位置 提取出的数据示例

Ⅳ.画图

某公司的营业收入及分配给股东的净利润

    
      #画图
      ykzj=['2013年','2014年','2015年','2016年','2017年','2018年','2019年','2020年','2021年','2022年']
      plt.figure(figsize=(9, 6))
      plt.plot(ykzj,kzj1)
      plt.bar(ykzj,kzj1)
      plt.title(u'口子窖营业收入')
      plt.legend()
      plt.show()
      plt.figure(figsize=(9, 6))
      plt.plot(ykzj,kzj2)
      plt.bar(ykzj,kzj2)
      plt.title(u'口子窖归属于上市公司股东的净利润')
      plt.show()
    
  

多公司比较

  
    #多公司比较
    #营业收入
    form={'东鹏饮料':dp1}
    a = ['2013','2014','2015','2016','2017','2018','2019','2020','2021','2022']
    b_1 =  [None,None,None,None,None,None]+dp1
    b_2 = jsy1[1:]
    b_3 = kzj1
    b_4 = [None,None,None,None,None]+jyjk1
    b_5 = [None]+wlgf1
    b_6 = [None,None,None,None,None]+adl1
    b_7 = [None,None,None,None,None]+lzy1
    b_8 = yjgj1
    b_9 = [None]+jhj1
    b_10 = [None,None]+xpp1
    #设置图片尺寸与清晰度
    plt.figure(figsize=(10, 8), dpi=80)
    #导入数据,绘制条形图
    plt.plot(a, b_1, marker = "o", mfc = "white", label='东鹏饮料')
    plt.plot( a,b_2,  marker = "o", mfc = "white",label='今世缘')
    plt.plot( a,b_3,  marker = "o", mfc = "white",label='口子窖')
    plt.plot( a,b_4, marker = "o", mfc = "white", label='均瑶健康')
    plt.plot( a,b_5,  marker = "o", mfc = "white",label='威龙股份')
    plt.plot( a,b_6,  marker = "o", mfc = "white",label='安德利')
    plt.plot( a,b_7,  marker = "o", mfc = "white",label='李子园')
    plt.plot( a,b_8, marker = "o", mfc = "white", label='迎驾贡酒')
    plt.plot( a,b_9, marker = "o", mfc = "white", label='金徽酒')
    plt.plot( a,b_10, marker = "o", mfc = "white", label='香飘飘')
    #添加标题
    plt.title('每一年的营业收入对比图', size=20)
    #添加xy轴
    plt.xlabel('时间')
    plt.ylabel('营业收入(元)')
    #x轴刻度
    plt.grid()
    plt.legend()
    #展示效果图
    plt.show()

    
  

结果

某公司十年营业收入 某公司十年分配给股东的净利润 十家公司营业收入对比图

Ⅴ.公司信息提取


    #dp

    filename="E:\learn\大三下\金融数据获取与处理\Final Project\东鹏饮料\东鹏饮料2021年年度报告.pdf"
    pdf = pdfplumber.open(filename)
    page1 = pdf.pages[4]
    table1 = page1.extract_tables()[2]
    df1 = pd.DataFrame(table1)
    page2 = pdf.pages[5]
    table2 = page2.extract_tables()[0]
    df2 = pd.DataFrame(table2)
    dp=pd.concat([df1,df2], ignore_index=True)
    dp.set_index([0],inplace=True)
    dp=dp.iloc[:,0]
    dp=pd.DataFrame(dp)
    dp.columns=["东鹏饮料"]

    #jsy
    filename="E:\learn\大三下\金融数据获取与处理\Final Project\今世缘\今世缘2022年年度报告.pdf"
    pdf = pdfplumber.open(filename)
    page1 = pdf.pages[3]
    table1 = page1.extract_tables()[2]
    df1 = pd.DataFrame(table1)
    page2 = pdf.pages[3]
    table2 = page2.extract_tables()[3]
    df2 = pd.DataFrame(table2)
    jsy=pd.concat([df1,df2], ignore_index=True)
    jsy.set_index([0],inplace=True)
    jsy=jsy.iloc[:,0]
    jsy=pd.DataFrame(jsy)
    jsy.columns=["今世缘"]

    #kzj
    filename="E:\learn\大三下\金融数据获取与处理\Final Project\口子窖\口子窖2022年年度报告.pdf"
    pdf = pdfplumber.open(filename)
    page1 = pdf.pages[3]
    table1 = page1.extract_tables()[2]
    df1 = pd.DataFrame(table1)
    page2 = pdf.pages[3]
    table2 = page2.extract_tables()[3]
    df2 = pd.DataFrame(table2)
    page3 = pdf.pages[4]
    table3 = page3.extract_tables()[0]
    df3 = pd.DataFrame(table3)
    kzj=pd.concat([df1,df2,df3], ignore_index=True)
    kzj.set_index([0],inplace=True)
    kzj=pd.DataFrame(kzj)
    kzj.columns=["口子窖"]

    #jyjk
    filename="E:\learn\大三下\金融数据获取与处理\Final Project\均瑶健康\均瑶健康2022年年度报告.pdf"
    pdf = pdfplumber.open(filename)
    page1 = pdf.pages[5]
    table1 = page1.extract_tables()[2]
    df1 = pd.DataFrame(table1)
    table2 = page1.extract_tables()[3]
    df2 = pd.DataFrame(table2)
    jyjk=pd.concat([df1,df2], ignore_index=True)
    jyjk.set_index([0],inplace=True)
    jyjk=jyjk.iloc[:,0]
    jyjk=pd.DataFrame(jyjk)
    jyjk.columns=["均瑶健康"]

    #wlgf
    filename="E:\learn\大三下\金融数据获取与处理\Final Project\威龙股份\威龙股份2022年年度报告.pdf"
    pdf = pdfplumber.open(filename)
    page1 = pdf.pages[4]
    table1 = page1.extract_tables()[2]
    df1 = pd.DataFrame(table1)
    table2 = page1.extract_tables()[3]
    df2 = pd.DataFrame(table2)
    wlgf=pd.concat([df1,df2], ignore_index=True)
    wlgf.set_index([0],inplace=True)
    wlgf=wlgf.iloc[:,0]
    wlgf=pd.DataFrame(wlgf)
    wlgf.columns=["威龙股份"]

    #adl
    filename="E:\learn\大三下\金融数据获取与处理\Final Project\安德利\安德利2022年年度报告.pdf"
    pdf = pdfplumber.open(filename)
    page = pdf.pages[4]
    table1 = page.extract_tables()[0]
    df1 = pd.DataFrame(table1)
    table2 = page.extract_tables()[1]
    df2 = pd.DataFrame(table2)
    adl=pd.concat([df1,df2], ignore_index=True)
    adl.set_index([0],inplace=True)
    adl=adl.iloc[:,0]
    adl=pd.DataFrame(adl)
    adl.columns=["安德利"]

    #lzy
    filename="E:\learn\大三下\金融数据获取与处理\Final Project\李子园\李子园2022年年度报告.pdf"
    pdf = pdfplumber.open(filename)
    page = pdf.pages[5]
    table1 = page.extract_tables()[1]
    df1 = pd.DataFrame(table1)
    table2 = page.extract_tables()[2]
    df2 = pd.DataFrame(table2)
    lzy=pd.concat([df1,df2], ignore_index=True)
    lzy.set_index([0],inplace=True)
    lzy=lzy.iloc[:,0]
    lzy=pd.DataFrame(lzy)
    lzy.columns=["李子园"]

    #yjgj
    filename="E:\learn\大三下\金融数据获取与处理\Final Project\迎驾贡酒\迎驾贡酒2022年年度报告.pdf"
    pdf = pdfplumber.open(filename)
    page = pdf.pages[3]
    table1 = page.extract_tables()[2]
    df1 = pd.DataFrame(table1)
    page = pdf.pages[4]
    table2 = page.extract_tables()[0]
    df2 = pd.DataFrame(table2)
    yjgj=pd.concat([df1,df2], ignore_index=True)
    yjgj.set_index([0],inplace=True)
    yjgj=yjgj.iloc[:,0]
    yjgj=pd.DataFrame(yjgj)
    yjgj.columns=["迎驾贡酒"]

    #jhj表格不规则 半手动提取
    import numpy as np
    filename="E:\learn\大三下\金融数据获取与处理\Final Project\金徽酒\金徽酒2022年年度报告.pdf"
    pdf = pdfplumber.open(filename)
    page = pdf.pages[4]
    table1 = page.extract_tables()[0]
    df1 = pd.DataFrame(table1)[1]
    df3 = pd.DataFrame(np.array(['','','','姓名','联系地址','电话','传真','电子信箱']))
    df1=pd.concat([df3,df1],axis=1, ignore_index=True)[1:]
    df1=df1.drop([2])
    df2 =pd.DataFrame([['公司注册地址','甘肃省陇南市徽县伏家镇'],['公司注册地址的历史变更情况','不适用'],['公司办公地址','甘肃省陇南市徽县伏家镇'],['公司办公地址的邮政编码','742308'],['公司网址','www.jinhuijiu.com'],['电子信箱','jhj@jinhuijiu.com']])
    jhj=pd.concat([df1,df2], ignore_index=True)
    jhj.set_index([0],inplace=True)
    jhj=pd.DataFrame(jhj)
    jhj.columns=["金徽酒"]

    #xpp
    filename="E:\learn\大三下\金融数据获取与处理\Final Project\香飘飘\香飘飘2022年年度报告.pdf"
    pdf = pdfplumber.open(filename)
    page = pdf.pages[5]
    table1 = page.extract_tables()[1]
    df1 = pd.DataFrame(table1)
    table2 = page.extract_tables()[2]
    df2 = pd.DataFrame(table2)
    xpp=pd.concat([df1,df2], ignore_index=True)
    xpp.set_index([0],inplace=True)
    xpp=xpp.iloc[:,0]
    xpp=pd.DataFrame(xpp)
    xpp.columns=["香飘飘"]

    allinfo= pd.concat([dp, jsy,kzj,jyjk,wlgf,adl,lzy,yjgj,jhj,xpp], axis=1, ignore_index=False)
    allinfo=allinfo.iloc[1:]


  

结果

提取的公司信息汇总

Ⅵ.结果解读

营业收入: 大部分公司总体上涨,部分公司波动较大,且香飘飘、威龙股份主要呈现下降的趋势。

从对比图的结果来看,东鹏饮料与今世缘等公司涨势凶猛,金徽酒则较为平稳。体现产业投资向高附加值产品倾斜。

结果总结:从细分龙头发展历程看集中度发展趋势:2010年-2020年我国制造业细分龙头企业不断崛起,产业内的地位持续巩固。对比盈利能力,大多数龙头公司的利润率都要优于各自行业水平。往后看,预计各类行业集中度将进一步呈现上升趋势。首先,中游原材料加工业方面,碳中和及碳达峰将推动集中度持续提升。具备成本优势、技术优势的行业龙头企业将脱颖而出。下游制造业方面,龙头企业凭借高研发力度建立成长优势,奠定强者恒强的局面。下游消费品方面,在社会消费升级的环境下消费行业龙头更容易通过推出高端产品、加大营销等方式扩张市场占有率。

本次实验的心得

过程艰难,由于是公司列表从后往前的第二轮,大部分公司的年报数量都不一,难以采用循环方法,最后为了节省时间采用了手动方法。感谢老师的教导,在做实验的过程中,对正则表达式和爬虫有了更熟练的运用。但仍然不够得心应手,还需要继续精进。