In [1]:
import pandas as pd
import numpy as np
import openpyxl
import re
import requests
import time
import os
import fitz
In [2]:
xlsx = '文化娱乐行业.xlsx'
df = pd.read_excel(xlsx)
exf = openpyxl.load_workbook(xlsx)
sheet = exf.active
C2 = sheet['C2']
C = sheet['C']
links = [c.value for c in C]
links_1 = links[1:-1]
links_2 = ''.join(links_1)

p = re.compile('"(.*?)","(.*?)"')
list_of_tuple = p.findall(links_2)

df1 = pd.DataFrame({'Link': [t[0] for t in list_of_tuple],
                    'f_name': [t[1] for t in list_of_tuple]})
df1.to_excel('文化娱乐行业_final.xlsx')
print(df1.head(10))
                                                Link                 f_name
0  http://news.windin.com/ns/bulletin.php?code=16...    当代文体:2020年年度报告(修订版)
1  http://news.windin.com/ns/bulletin.php?code=91...    美盛文化:2020年年度报告(更新后)
2  http://news.windin.com/ns/bulletin.php?code=9A...  美盛文化:2020年年度报告摘要(更新后)
3  http://news.windin.com/ns/bulletin.php?code=E5...    欢瑞世纪:2020年年度报告(更新后)
4  http://news.windin.com/ns/bulletin.php?code=DD...    ST三五:2020年年度报告(更新后)
5  http://news.windin.com/ns/bulletin.php?code=04...    奥飞娱乐:2020年年度报告(更新后)
6  http://news.windin.com/ns/bulletin.php?code=93...    浙文影业:2020年年报报告(修订稿)
7  http://news.windin.com/ns/bulletin.php?code=77...  浙文影业:2020年年度报告摘要(修订稿)
8  http://news.windin.com/ns/bulletin.php?code=C5...    华谊兄弟:2020年年度报告(更新后)
9  http://news.windin.com/ns/bulletin.php?code=C8...   *ST晨鑫:2020年年度报告(更新后)
In [3]:
df2=pd.read_excel(r'C:\Users\pc\Desktop\杨天明6\文化娱乐行业_final.xlsx')
links=df2['Link'];f_names=df1['f_name']
p=re.compile('(?<=\d{4})(年报)|(年年报)')
f_names=[p.sub('年年度报告',f) for f in df2.f_name]
df2['f_name']=f_names;del p,f_names
print(df2)
     Unnamed: 0                                               Link  \
0             0  http://news.windin.com/ns/bulletin.php?code=16...   
1             1  http://news.windin.com/ns/bulletin.php?code=91...   
2             2  http://news.windin.com/ns/bulletin.php?code=9A...   
3             3  http://news.windin.com/ns/bulletin.php?code=E5...   
4             4  http://news.windin.com/ns/bulletin.php?code=DD...   
..          ...                                                ...   
278         278  http://news.windin.com/ns/bulletin.php?code=B4...   
279         279  http://news.windin.com/ns/bulletin.php?code=AD...   
280         280  http://news.windin.com/ns/bulletin.php?code=7B...   
281         281  http://news.windin.com/ns/bulletin.php?code=8A...   
282         282  http://news.windin.com/ns/bulletin.php?code=E0...   

                    f_name  
0      当代文体:2020年年度报告(修订版)  
1      美盛文化:2020年年度报告(更新后)  
2    美盛文化:2020年年度报告摘要(更新后)  
3      欢瑞世纪:2020年年度报告(更新后)  
4      ST三五:2020年年度报告(更新后)  
..                     ...  
278          中青宝:2019年年度报告  
279        中青宝:2019年年度报告摘要  
280         横店影视:2019年年度报告  
281       横店影视:2019年年度报告摘要  
282         金利科技:2016年年度报告  

[283 rows x 3 columns]
In [4]:
def filter_links(words,df,include=True):
    ls=[]
    for word in words:
        if include:
            ls.append([word in f for f in df.f_name])
        else:
            ls.append([word not in f for f in df.f_name])
    index=[]
    for r in range(len(df)):
        flag=not include
        for c in range(len(words)):
            if include:
                flag = flag or ls[c][r]
            else:
                flag = flag and ls[c][r]
        index.append(flag)
    df3 = df[index]
    return(df3)
In [5]:
df_all=filter_links(['摘要','问询函','社会责任','审计','财务','风险','债券'],df1,include=False)
df_orig=filter_links(['(','(',],df_all,include=False)
df_updt=filter_links(['(','(',],df_all,include=True)
df_updt=filter_links(['取消'],df_updt,include=False)
print(df_orig,df_updt)
                                                  Link           f_name
11   http://news.windin.com/ns/bulletin.php?code=84...   北京文化:2020年年度报告
13   http://news.windin.com/ns/bulletin.php?code=A0...  *ST长动:2020年年度报告
17   http://news.windin.com/ns/bulletin.php?code=25...   美盛文化:2020年年度报告
18   http://news.windin.com/ns/bulletin.php?code=0E...   惠程科技:2020年年度报告
20   http://news.windin.com/ns/bulletin.php?code=E9...  *ST天润:2020年年度报告
..                                                 ...              ...
274  http://news.windin.com/ns/bulletin.php?code=D1...   力盛赛车:2019年年度报告
276  http://news.windin.com/ns/bulletin.php?code=CA...   三七互娱:2019年年度报告
278  http://news.windin.com/ns/bulletin.php?code=B4...    中青宝:2019年年度报告
280  http://news.windin.com/ns/bulletin.php?code=7B...   横店影视:2019年年度报告
282  http://news.windin.com/ns/bulletin.php?code=E0...   金利科技:2016年年度报告

[123 rows x 2 columns]                                                   Link  \
0    http://news.windin.com/ns/bulletin.php?code=16...   
1    http://news.windin.com/ns/bulletin.php?code=91...   
3    http://news.windin.com/ns/bulletin.php?code=E5...   
4    http://news.windin.com/ns/bulletin.php?code=DD...   
5    http://news.windin.com/ns/bulletin.php?code=04...   
6    http://news.windin.com/ns/bulletin.php?code=93...   
8    http://news.windin.com/ns/bulletin.php?code=C5...   
9    http://news.windin.com/ns/bulletin.php?code=C8...   
10   http://news.windin.com/ns/bulletin.php?code=D1...   
25   http://news.windin.com/ns/bulletin.php?code=40...   
26   http://news.windin.com/ns/bulletin.php?code=39...   
37   http://news.windin.com/ns/bulletin.php?code=E0...   
93   http://news.windin.com/ns/bulletin.php?code=CC...   
94   http://news.windin.com/ns/bulletin.php?code=CB...   
142  http://news.windin.com/ns/bulletin.php?code=4A...   
144  http://news.windin.com/ns/bulletin.php?code=BF...   
145  http://news.windin.com/ns/bulletin.php?code=01...   
146  http://news.windin.com/ns/bulletin.php?code=8F...   
147  http://news.windin.com/ns/bulletin.php?code=19...   
148  http://news.windin.com/ns/bulletin.php?code=19...   
151  http://news.windin.com/ns/bulletin.php?code=FE...   
152  http://news.windin.com/ns/bulletin.php?code=FE...   
155  http://news.windin.com/ns/bulletin.php?code=8D...   
159  http://news.windin.com/ns/bulletin.php?code=E0...   
161  http://news.windin.com/ns/bulletin.php?code=D8...   
162  http://news.windin.com/ns/bulletin.php?code=21...   
169  http://news.windin.com/ns/bulletin.php?code=A5...   
172  http://news.windin.com/ns/bulletin.php?code=61...   

                       f_name  
0         当代文体:2020年年度报告(修订版)  
1         美盛文化:2020年年度报告(更新后)  
3         欢瑞世纪:2020年年度报告(更新后)  
4         ST三五:2020年年度报告(更新后)  
5         奥飞娱乐:2020年年度报告(更新后)  
6         浙文影业:2020年年报报告(修订稿)  
8         华谊兄弟:2020年年度报告(更新后)  
9        *ST晨鑫:2020年年度报告(更新后)  
10         长城退:2020年年度报告(更新后)  
25    世纪华通:2020年报独立董事述职报告(王迁)  
26   世纪华通:2020年报独立董事述职报告(梁飞媛)  
37        金科文化:2019年年度报告(更新后)  
93      ST三五:2020年年度报告全文(更新后)  
94        ST三五:2020年年度报告(更新后)  
142       恺英网络:2019年年度报告(更新后)  
144      *ST长城:2019年年度报告(更新后)  
145      *ST鼎龙:2017年年度报告(更新后)  
146        当代文体:2019年度报告(修订版)  
147       北京文化:2019年年度报告(更新后)  
148       北京文化:2019年年度报告(更新后)  
151      *ST长城:2019年年度报告(更新后)  
152      *ST长城:2019年年度报告(更新后)  
155      *ST当代:2019年年度报告(更新后)  
159       美盛文化:2019年年度报告(更新后)  
161       欢瑞世纪:2019年年度报告(更新后)  
162       力盛赛车:2019年年度报告(更新后)  
169       掌趣科技:2019年年度报告(更新后)  
172      吉比特:2019年年度报告(补充披露稿)  
In [6]:
def sub_with_update(df_updt,df_orig):
    index_orig=[];i=0
    index_updt=[];j=0
    for i,f in enumerate(df_orig):
        for j,fn in enumerate(df_updt):
            if f in fn:
                index_orig.append(i)
                index_updt.append(j)
    for n in range(len(index_orig)):
        i=index_orig[n]
        j=index_updt[n]
        df_orig.iloc[i,-2]=df_updt.iloc[j,-2]
    return(df_orig)

df_newest=sub_with_update(df_updt,df_orig)

df_newest.sort_values(by=['f_name'],inplace=True,ignore_index=True)
print(df_newest)
                                                  Link           f_name
0    http://news.windin.com/ns/bulletin.php?code=0A...  *ST中南:2020年年度报告
1    http://news.windin.com/ns/bulletin.php?code=6A...  *ST大晟:2020年年度报告
2    http://news.windin.com/ns/bulletin.php?code=C3...  *ST天娱:2020年年度报告
3    http://news.windin.com/ns/bulletin.php?code=E9...  *ST天润:2020年年度报告
4    http://news.windin.com/ns/bulletin.php?code=57...  *ST当代:2020年年度报告
..                                                 ...              ...
118  http://news.windin.com/ns/bulletin.php?code=90...   顺网科技:2019年年度报告
119  http://news.windin.com/ns/bulletin.php?code=E5...   顺网科技:2020年年度报告
120  http://news.windin.com/ns/bulletin.php?code=23...   鹿港文化:2019年年度报告
121  http://news.windin.com/ns/bulletin.php?code=1E...   鹿港文化:2020年年度报告
122  http://news.windin.com/ns/bulletin.php?code=49...   鼎龙文化:2019年年度报告

[123 rows x 2 columns]
D:\anaconda\lib\site-packages\pandas\core\indexing.py:670: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame

See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
  iloc._setitem_with_indexer(indexer, value)

D:\anaconda\lib\site-packages\ipykernel_launcher.py:12: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame

See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
  if sys.path[0] == '':

D:\anaconda\lib\site-packages\ipykernel_launcher.py:17: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame

See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy

In [7]:
df_newest['公司简称']=[f[:4] for f in df_newest.f_name]
counts=df_newest['公司简称'].value_counts()
ten_company=[]
for cn in counts.index[:10]:
    ten_company.append(filter_links([cn],df_newest))
print(ten_company)
[                                                 Link          f_name  公司简称
92  http://news.windin.com/ns/bulletin.php?code=B3...  游族网络:2019年年度报告  游族网络
93  http://news.windin.com/ns/bulletin.php?code=B3...  游族网络:2019年年度报告  游族网络
94  http://news.windin.com/ns/bulletin.php?code=97...  游族网络:2020年年度报告  游族网络,                                                  Link          f_name  公司简称
20  http://news.windin.com/ns/bulletin.php?code=F6...  世纪华通:2019年年度报告  世纪华通
21  http://news.windin.com/ns/bulletin.php?code=F6...  世纪华通:2019年年度报告  世纪华通
22  http://news.windin.com/ns/bulletin.php?code=46...  世纪华通:2020年年度报告  世纪华通,                                                  Link          f_name  公司简称
65  http://news.windin.com/ns/bulletin.php?code=F1...  幸福蓝海:2019年年度报告  幸福蓝海
66  http://news.windin.com/ns/bulletin.php?code=E7...  幸福蓝海:2020年年度报告  幸福蓝海,                                                  Link          f_name  公司简称
38  http://news.windin.com/ns/bulletin.php?code=D1...  力盛赛车:2019年年度报告  力盛赛车
39  http://news.windin.com/ns/bulletin.php?code=C6...  力盛赛车:2020年年度报告  力盛赛车,                                                  Link          f_name  公司简称
53  http://news.windin.com/ns/bulletin.php?code=47...  天神娱乐:2019年年度报告  天神娱乐
54  http://news.windin.com/ns/bulletin.php?code=47...  天神娱乐:2019年年度报告  天神娱乐,                                                  Link          f_name  公司简称
14  http://news.windin.com/ns/bulletin.php?code=CA...  三七互娱:2019年年度报告  三七互娱
15  http://news.windin.com/ns/bulletin.php?code=5F...  三七互娱:2020年年度报告  三七互娱,                                                   Link          f_name  公司简称
103  http://news.windin.com/ns/bulletin.php?code=08...  美盛文化:2019年年度报告  美盛文化
104  http://news.windin.com/ns/bulletin.php?code=25...  美盛文化:2020年年度报告  美盛文化,                                                  Link          f_name  公司简称
30  http://news.windin.com/ns/bulletin.php?code=17...  众应互联:2019年年度报告  众应互联
31  http://news.windin.com/ns/bulletin.php?code=3D...  众应互联:2020年年度报告  众应互联,                                                  Link          f_name  公司简称
12  http://news.windin.com/ns/bulletin.php?code=99...  万达电影:2019年年度报告  万达电影
13  http://news.windin.com/ns/bulletin.php?code=28...  万达电影:2020年年度报告  万达电影,                                                  Link          f_name  公司简称
70  http://news.windin.com/ns/bulletin.php?code=3B...  恺英网络:2019年年度报告  恺英网络
71  http://news.windin.com/ns/bulletin.php?code=85...  恺英网络:2020年年度报告  恺英网络]
D:\anaconda\lib\site-packages\ipykernel_launcher.py:1: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
  """Entry point for launching an IPython kernel.

In [8]:
def get_PDF_url(url):
    r=requests.get(url);r.encoding='utf-8';html=r.text
    r.close()
    p=re.compile('<a href=(.*?)\s.*?>(.*?)</a>',re.DOTALL)
    a=p.search(html)
    if a is None:
        Warning('没有找到下载链接,请手动检查链接:%s' % url)
        return()
    else:
        href=a.group(1);fname=a.group(2).strip()
    href=r.url[:26]+href
    return((href,fname))
In [9]:
for n in range(len(ten_company)):
    df_One_Co = pd.DataFrame({'Link':[h for h in ten_company[n]['Link']],
                    'f_name':[f for f in ten_company[n]['f_name']]})
    for i in range(len(df_One_Co)):
        href,fname=get_PDF_url(df_One_Co.Link[i])
        r=requests.get(href,allow_redirects=True)
        open('%s'%fname,'wb').write(r.content)
        time.sleep(10)
    r.close()
In [10]:
filenames = os.listdir()
print(filenames)
['.ipynb_checkpoints', 'project.ipynb', '万达电影:2019年年度报告.pdf', '万达电影:2020年年度报告.pdf', '三七互娱:2019年年度报告.pdf', '三七互娱:2020年年度报告.pdf', '世纪华通:2019年年度报告.pdf', '世纪华通:2020年年度报告.pdf', '众应互联:2019年年度报告.pdf', '众应互联:2020年年度报告.pdf', '力盛赛车:2019年年度报告.pdf', '力盛赛车:2020年年度报告.pdf', '天神娱乐:2019年年度报告.pdf', '幸福蓝海:2019年年度报告.pdf', '幸福蓝海:2020年年度报告.pdf', '恺英网络:2019年年度报告.pdf', '恺英网络:2020年年度报告.pdf', '文化娱乐行业.xlsx', '文化娱乐行业_final.xlsx', '游族网络:2019年年度报告.pdf', '游族网络:2020年年度报告.pdf', '美盛文化:2019年年度报告.pdf', '美盛文化:2020年年度报告.pdf']
In [11]:
for i in range(len(ten_company)):
    prefix= ten_company[i].iloc[1,-1]
    print(prefix)
    pdf = [f for f in filenames if prefix[:3] in f and f.endswith('.pdf')]
    print(pdf)
    year = [p[-13:-9] for p in pdf]
    print(year)
    
游族网络
['游族网络:2019年年度报告.pdf', '游族网络:2020年年度报告.pdf']
['2019', '2020']
世纪华通
['世纪华通:2019年年度报告.pdf', '世纪华通:2020年年度报告.pdf']
['2019', '2020']
幸福蓝海
['幸福蓝海:2019年年度报告.pdf', '幸福蓝海:2020年年度报告.pdf']
['2019', '2020']
力盛赛车
['力盛赛车:2019年年度报告.pdf', '力盛赛车:2020年年度报告.pdf']
['2019', '2020']
天神娱乐
['天神娱乐:2019年年度报告.pdf']
['2019']
三七互娱
['三七互娱:2019年年度报告.pdf', '三七互娱:2020年年度报告.pdf']
['2019', '2020']
美盛文化
['美盛文化:2019年年度报告.pdf', '美盛文化:2020年年度报告.pdf']
['2019', '2020']
众应互联
['众应互联:2019年年度报告.pdf', '众应互联:2020年年度报告.pdf']
['2019', '2020']
万达电影
['万达电影:2019年年度报告.pdf', '万达电影:2020年年度报告.pdf']
['2019', '2020']
恺英网络
['恺英网络:2019年年度报告.pdf', '恺英网络:2020年年度报告.pdf']
['2019', '2020']
In [12]:
def getText(pdf):
    text = ''
    doc = fitz.open(pdf)
    for page in doc:
        text += page.getText()
    doc.close()
    return(text)
    
def parse_data_line(pdf):    
    text = getText(pdf)
    p1 = re.compile('\w{1,2}、主要会计数据和财务指标(.*?)(?=\w{1,2}、)',re.DOTALL)
    subtext = p1.search(text)
    if subtext is None:
        p1 = re.compile('(\w{1,2})\s*主要会计数据(.*?)(?=(\w{1,2})\s*主要财务指标)',re.DOTALL)
        subtext = p1.search(text).group(0)
    else:
        subtext = p1.search(text).group(0)
    subp='([0-9,.%\- ]*?)\n' and '([0-9,.%\- ]*?)\s'
    psub='%s%s%s%s'%(subp,subp,subp,subp)
    p=re.compile('(\D+\n)+%s'%psub)
    lines=p.findall(subtext)    
    return(lines)
In [13]:
filenames = os.listdir()
import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif']=['SimHei']  
plt.rcParams['axes.unicode_minus'] = False 
In [14]:
for i in range(5):
    prefix= ten_company[-i].iloc[1,-1]
    print(prefix)
    pdf = [f for f in filenames if prefix[:3] in f and f.endswith('.pdf')]
    year = [p[-13:-9] for p in pdf]
    df_data=pd.DataFrame({'年份':year,
                      '年营业收入':''})
    for y in range(len(pdf)):
        lines=parse_data_line(pdf[y])
        df_fnc=pd.DataFrame([l for l in lines],columns=['',year[y]+'年',str(eval(year[y])-1)+'年','本年比上年增减',str(eval(year[y])-2)+'年']) 
        #df_fnc.to_excel('%s%s财务数据.xls'%(prefix,year[y]))
        s=df_fnc.iloc[0,1]
        s=s.replace(',','')
        df_data['年营业收入'][[y]]=eval(s)
    print(df_data)
    plt.figure()
    plt.plot(df_data['年份'],df_data['年营业收入'],label=u'年营业收入',color='#FF8247')
    for x,y in zip(df_data['年份'],df_data['年营业收入']):#显示bar数值
        plt.text(x,y,'%.3e'%y,ha='center',va='bottom')
    plt.xlabel(u'(年)',fontsize=13)
    plt.ylabel(u'年营业收入(元)',fontsize=13,rotation=90)
    plt.legend(loc='best')
    plt.title(u'%s%s-%s年营业收入的可视化'%(prefix,str(year[0]),str(year[-1])),fontsize=13)
    plt.yticks(range(0,10**10,10**9))
    plt.show()
游族网络
     年份        年营业收入
0  2019   3.2205e+09
1  2020  4.70314e+09
D:\anaconda\lib\site-packages\matplotlib\cbook\__init__.py:2064: FutureWarning: Support for multi-dimensional indexing (e.g. `obj[:, None]`) is deprecated and will be removed in a future version.  Convert to a numpy array before indexing instead.
  x[:, None]

D:\anaconda\lib\site-packages\matplotlib\axes\_base.py:248: FutureWarning: Support for multi-dimensional indexing (e.g. `obj[:, None]`) is deprecated and will be removed in a future version.  Convert to a numpy array before indexing instead.
  x = x[:, np.newaxis]

D:\anaconda\lib\site-packages\matplotlib\axes\_base.py:250: FutureWarning: Support for multi-dimensional indexing (e.g. `obj[:, None]`) is deprecated and will be removed in a future version.  Convert to a numpy array before indexing instead.
  y = y[:, np.newaxis]

恺英网络
     年份        年营业收入
0  2019  2.03688e+09
1  2020  1.54319e+09
D:\anaconda\lib\site-packages\matplotlib\cbook\__init__.py:2064: FutureWarning: Support for multi-dimensional indexing (e.g. `obj[:, None]`) is deprecated and will be removed in a future version.  Convert to a numpy array before indexing instead.
  x[:, None]

D:\anaconda\lib\site-packages\matplotlib\axes\_base.py:248: FutureWarning: Support for multi-dimensional indexing (e.g. `obj[:, None]`) is deprecated and will be removed in a future version.  Convert to a numpy array before indexing instead.
  x = x[:, np.newaxis]

D:\anaconda\lib\site-packages\matplotlib\axes\_base.py:250: FutureWarning: Support for multi-dimensional indexing (e.g. `obj[:, None]`) is deprecated and will be removed in a future version.  Convert to a numpy array before indexing instead.
  y = y[:, np.newaxis]

万达电影
     年份        年营业收入
0  2019  1.54354e+10
1  2020  6.29548e+09
D:\anaconda\lib\site-packages\matplotlib\cbook\__init__.py:2064: FutureWarning: Support for multi-dimensional indexing (e.g. `obj[:, None]`) is deprecated and will be removed in a future version.  Convert to a numpy array before indexing instead.
  x[:, None]

D:\anaconda\lib\site-packages\matplotlib\axes\_base.py:248: FutureWarning: Support for multi-dimensional indexing (e.g. `obj[:, None]`) is deprecated and will be removed in a future version.  Convert to a numpy array before indexing instead.
  x = x[:, np.newaxis]

D:\anaconda\lib\site-packages\matplotlib\axes\_base.py:250: FutureWarning: Support for multi-dimensional indexing (e.g. `obj[:, None]`) is deprecated and will be removed in a future version.  Convert to a numpy array before indexing instead.
  y = y[:, np.newaxis]

众应互联
Traceback (most recent call last):

  File "D:\anaconda\lib\site-packages\IPython\core\interactiveshell.py", line 2961, in run_code
    exec(code_obj, self.user_global_ns, self.user_ns)

  File "<ipython-input-14-198f4d260f5a>", line 14, in <module>
    df_data['年营业收入'][[y]]=eval(s)

  File "<string>", line unknown
    
    ^
SyntaxError: unexpected EOF while parsing
In [ ]: