卢欣鸿的实验报告

结果

结果截图 结果截图

获取的数据截图

结果截图 结果截图 结果截图 结果截图 结果截图

代码


import requests,json,os,time,re
def read_l(txt):
    line_l = [line.strip() for line in open(txt, encoding='UTF-8').readlines()]
    return line_l
def downloadpdf(pdf_url, filename):
    pdf = requests.get(pdf_url)
    with open(filename, 'wb') as f:
        f.write(pdf.content)
def find_text(text,l):
    for i in l:
        if i in text:
            r = True
            break
        else:
            r = False
    return r
def rename(file_name,firm_id):
    global pattern,s_l
    year = re.findall(pattern,file_name)[0]
    for s in s_l:
        if s in file_name:
            season = str(s_l.index(s)+1)
            break
        else:
            pass
    new_name = f'{firm_id}_{year}_{season}.pdf'
    return new_name

pattern = '[0-9]{4}'
s_l = ['第一季度','半年度','第三季度','年年度']
txt = r'D:\金融数据获取与处理\company1.txt'
firm_ids = read_l(txt)
date = ["2010-12-31", "2023-5-29"]
path = r'D:\金融数据获取与处理\abcd'
l = ['摘要','取消','正文']

#url
url = 'http://www.szse.cn/api/disc/announcement/annList?random=0.8015180112682705'
headers = {'Accept':'application/json, text/javascript, */*; q=0.01',
            'Accept-Encoding':'gzip, deflate',
            'Accept-Language':'en-US,en;q=0.9,zh-CN;q=0.8,zh;q=0.7',
            'Connection':'keep-alive',
            'Content-Length':'92',
            'Content-Type':'application/json',
            'DNT':'1',
            'Host':'www.szse.cn',
            'Origin':'http://www.szse.cn',
            'Referer':'http://www.szse.cn/disclosure/listed/fixed/index.html',
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36',
            'X-Request-Type':'ajax',
            'X-Requested-With':'XMLHttpRequest'}

#payload,获取源代码
for firm_id in firm_ids:
    dirname = path+f'{firm_id}'
    os.mkdir(dirname)
    for page in range(1,5):
        try:
            payload = {'seDate': date,
                       'stock': ["{firm_id}".format(firm_id=firm_id)],
                       'channelCode': ["fixed_disc"],
                       'pageSize': 30,
                       'pageNum': '{page}'.format(page=page)}
            response = requests.post(url, headers=headers, data=json.dumps(payload))
            doc = response.json()
            if response.status_code==200:
                print('获取{0}的第{1}页源代码成功'.format(firm_id,page))

            datas = doc.get('data')
            for i in range(len(datas)):
                data = datas[i]
                pdf_url = 'http://disc.static.szse.cn/download'+data.get('attachPath')
                title = data.get('title')
                publish_time = data.get('publishTime')[:9]
                filename = rename(title,firm_id)

                if find_text(title,l):
                    continue
                else:
                    downloadpdf(pdf_url, dirname+'/'+filename)
                    print(f'开始下载{filename}')
                    time.sleep(2)
        except:
            print('{0}的第{1}页不存在'.format(firm_id,page))
        
        
import os#引用os库
import pdfplumber#引进pdfplumber库
#遍历文件夹的所有PDF文件
file_list=[]#新建一个空列表用于存放文件名
file_dir=r'D:\金融数据获取与处理\abcd'#遍历的文件夹
for files in os.walk(file_dir):#遍历指定文件夹及其下的所有子文件夹
    for file in files[2]:#遍历每个文件夹里的所有文件,(files[2]:母文件夹和子文件夹下的所有文件信息,files[1]:子文件夹信息,files[0]:母文件夹信息)
        print(file)
        if os.path.splitext(file)[1]=='.PDF' or os.path.splitext(file)[1]=='.pdf':#检查文件后缀名,逻辑判断用==
            # file_list.append(file)#筛选后的文件名为字符串,将得到的文件名放进去列表,方便以后调用
            if file.endswith("2017_4.pdf"):
                file_list.append(file_dir + '\\' + file)  # 给文件名加入文件夹路径

print(file_list)
file_list = ['D:\\金融数据获取与处理\\abcd\\abcd000166\\000166_2017_4.pdf', 'D:\\金融数据获取与处理\\abcd\\abcd000617\\000617_2017_4.pdf',
             'D:\\金融数据获取与处理\\abcd\\abcd000666\\000666_2017_4.pdf', 'D:\\金融数据获取与处理\\abcd\\abcd000686\\000686_2017_4.pdf',
             'D:\\金融数据获取与处理\\abcd\\abcd000712\\000712_2017_4.pdf', 'D:\\金融数据获取与处理\\abcd\\abcd000728\\000728_2017_4.pdf',
             'D:\\金融数据获取与处理\\abcd\\abcd000750\\000750_2017_4.pdf', 'D:\\金融数据获取与处理\\abcd\\abcd002670\\002670_2017_4.pdf']

import pandas as pd
for filename in file_list:
    with pdfplumber.open(filename) as pdf:
        page01 = pdf.pages[4]
        tables = page01.extract_tables()  # 提取多个表格
        pd.set_option('display.max_columns', None)  # 把表格内容全部显示,默认显示部分
        df1 = pd.DataFrame(tables[0][1:], columns=tables[0][0])  # table[1:]是表格第二行及以下内容,table[0]是表格第一行,及表头内容
        df2 = pd.DataFrame(tables[0][1:], columns=tables[0][0])  # table[1:]是表格第二行及以下内容,table[0]是表格第一行,及表头内容
        df3 = pd.concat([df1, df2])
        df3.to_csv(filename+'info.csv')
        

import pdfplumber
import pandas as pd
from openpyxl import Workbook #保存表格,需要安装openpyxl

import os#引用os库
import pdfplumber#引进pdfplumber库
#遍历文件夹的所有PDF文件
file_list=[]#新建一个空列表用于存放文件名
file_dir=r'D:\金融数据获取与处理\abcd'#遍历的文件夹
for files in os.walk(file_dir):#遍历指定文件夹及其下的所有子文件夹
    for file in files[2]:#遍历每个文件夹里的所有文件,(files[2]:母文件夹和子文件夹下的所有文件信息,files[1]:子文件夹信息,files[0]:母文件夹信息)
        print(file)
        if os.path.splitext(file)[1]=='.PDF' or os.path.splitext(file)[1]=='.pdf':#检查文件后缀名,逻辑判断用==
            # file_list.append(file)#筛选后的文件名为字符串,将得到的文件名放进去列表,方便以后调用
            if file.endswith("2017_4.pdf"):
                file_list.append(file_dir + '\\' + file)  # 给文件名加入文件夹路径

print(file_list)
file_list = ['D:\\金融数据获取与处理\\abcd\\abcd000166\\000166_2017_4.pdf', 'D:\\金融数据获取与处理\\abcd\\abcd000617\\000617_2017_4.pdf',
             'D:\\金融数据获取与处理\\abcd\\abcd000666\\000666_2017_4.pdf', 'D:\\金融数据获取与处理\\abcd\\abcd000686\\000686_2017_4.pdf',
             'D:\\金融数据获取与处理\\abcd\\abcd000712\\000712_2017_4.pdf', 'D:\\金融数据获取与处理\\abcd\\abcd000728\\000728_2017_4.pdf',
             'D:\\金融数据获取与处理\\abcd\\abcd000750\\000750_2017_4.pdf', 'D:\\金融数据获取与处理\\abcd\\abcd002670\\002670_2017_4.pdf',]


import pandas as pd
for filename in file_list:
    with pdfplumber.open(filename) as pdf:
        page01 = pdf.pages[8]  # 指定提取第几页
        table = page01.extract_table()
        workbook = Workbook()
        sheet = workbook.active
        for row in table:
            sheet.append(row)
        print(type(workbook))
        workbook.save(filename="D:\\金融数据获取与处理\\abcd\\abcd000166.xlsx")


def xlsx_to_csv_pd():
    data_xls = pd.read_excel('D:\\金融数据获取与处理\\abcd\\abcd000166.xlsx', index_col=0)
    data_xls.to_csv('000166.csv', encoding='utf-8')
xlsx_to_csv_pd()
data = pd.read_csv('000166.csv')
print(data)


import matplotlib.pyplot as plt
import pandas as pd
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签


x = range(2013,2023)
y1=[1550635405.88,1624727209.92,929518743.99,901787760.47,28830386089.04,29306189171.45,33885599825.37,30127421045.60,30963931672.48,32431443205.38]
#对其营业收入做折线图
plt.plot(x,y1)
plt.title("中油资本营业收入折线图")
plt.show()


#对归属于上市公司股东的净利润(元)做折线图
y2 = [-28342658.05,9844601.90,-115180623.91,-76181117.94,5535421902.28,6842540372.67,7237830948.22,7843863454.16,5550119961.32,4917991589.44]
plt.plot(x,y2)
plt.title("中油资本归属于上市公司股东的净利润折线图")
plt.show()

#绘制十家公司十年的营业收入曲线
x = range(2013,2023)
data = pd.read_excel(r"D:\\金融数据获取与处理\\abcd\\ten_company_income.xlsx")
print(data)
data = data.T
data = data.rename(columns={0:"申万宏源",1:"中油资本",2:"经纬纺机",3:"东北证券 ",4:"锦龙股份",5:"国元证券",6:"国海证券",7:"国盛金控",8:"西部证券",9:"国信证券"})
data.plot()
plt.title("资本市场服务业营业收入对比折线图")
plt.show()