杨梦萍的实验报告

代码


from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from bs4 import BeautifulSoup
import requests
import time
# from parse_disclosure_table import DisclosureTable
import re
import requests
import pandas as pd
# import fitz
import csv
import matplotlib.pyplot as plt
import matplotlib.font_manager as fm
from urllib.parse import urljoin  # 用于拼接 URL

browser = webdriver.Edge()
browser.get('https://www.szse.cn/disclosure/listed/fixed/index.html')

# 报告类型选择
# 选择年度报告类型
element = browser.find_element(By.CSS_SELECTOR, "#select_gonggao .glyphicon").click()
element = browser.find_element(By.LINK_TEXT, "年度报告").click()
time.sleep(1)

firm = [
['000695' ,'滨海能源'],
['000812' ,'陕西金叶'],
['002117' ,'东港股份'],
['002191' ,'劲嘉股份'],
['002229' ,'鸿博股份'],
['002599' ,'盛通股份'],
['002836' ,'新宏泽'],
['600836' ,'上海易连'],
['601515' ,'东风股份'],
['603058' ,'永吉股份'],
['603429' ,'集友股份']
]

# 自动控制浏览器选择所取的公司
# 手动一个一个获取
for i in range(len(firm)):
    name = firm[i][1]
    code = firm[i][0]
    f = open('inner_HTML_%s.html' %name,'w',encoding='utf-8')
    element = browser.find_element(By.ID, "input_code").click()
    element = browser.find_element(By.ID,'input_code').send_keys('%s' %code)
    time.sleep(0.5)
    element = browser.find_element(By.ID, "input_code").send_keys(Keys.ENTER)
    element = browser.find_element(By.ID,'disclosure-table')
    time.sleep(0.5)
    innerHTML = element.get_attribute('innerHTML')
    f.write(innerHTML)
    time.sleep(0.5)
    f.close()
    element = browser.find_element(By.CSS_SELECTOR, ".selected-item:nth-child(2) > .icon-remove").click()
    time.sleep(0.5)

browser.quit()

# 将获取的公司年报地址存入csv文件中
for i in range(len(firm)):
    name = firm[i][1]
    f = open('inner_HTML_%s.html' %name,encoding='utf-8')
    t = f.read()
    soup = BeautifulSoup(t, 'html.parser')
    # print(type(t))
    comments = soup.find_all('div', {'class': 'text-title-box'})
    data_list = []
    for item in comments:
        content = item.find('span', {'class': 'pull-left title-text ellipsis'})
        # print(content.text)
        if content.text[-5:] != f"年年度报告":
            continue
        print(content.text)
        # 找到报告的下载地址和名称
        link = item.find("a", {"attachformat": "pdf"})
        url = urljoin("https://www.szse.cn", link.get("href"))
        name = link.find("span", {"class": "title-text"}).get("title")

        # 将报告名和下载地址追加到 CSV 文件中
        with open(f"{firm[i][1]}.csv", "a", newline="", encoding="utf-8") as f:
            writer = csv.writer(f)
            writer.writerow([name, url])
    f.close()

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time


for i in range(len(firm)):
    name = firm[i][1]
    df = pd.read_csv(f'{name}.csv')
    urls = df.iloc[:, 1].tolist()
    for j in range(len(urls)):
        ann_url = urls[j]
        # 创建 WebDriver 对象
        driver = webdriver.Chrome()

        # 打开深交所网站并进入目标页面
        driver.get(ann_url)

        # 等待下载按钮可单击
        download_btn = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "a#annouceDownloadBtn[href*='info/download']")))

        # 点击 "公告下载"
        download_btn.click()

        # 等待下载并关闭浏览器
        time.sleep(10)
        driver.quit()
    
# 在pdf中获取数据
import PyPDF2
import pandas as pd

# 打开PDF文件
for i in range(10):
    name = firm[i]
    for j in range(2012,2023):
        with open(f'{name}{j}年年度报告.pdf', 'rb') as pdf_file:
            # 创建文件阅读器
            pdf_reader = PyPDF2.PdfFileReader(pdf_file)

            # 获取PDF中文本内容(一般情况下,表格一般在最后一页)
            page_text = pdf_reader.getPage(pdf_reader.getNumPages()-1).extractText()

            # 把文本内容分割成行
            lines = page_text.split('\n')

            # 提取表格数据
            data = []
            for line in lines:
                # 通过判断年份来确定新的一行开始
                if line.strip().isdigit():
                    year = line.strip()
                    continue
                # 判断行是否包含股票代码,以此判断是否属于表格数据
                if 'SH' in line or 'SZ' in line:
                    # 分割行中的数据,并在末尾添加年份
                    row_data = line.split()
                    row_data.append(year)
                    data.append(row_data)

            # 创建DataFrame,并设置列名
            df = pd.DataFrame(data, columns=['股票代码', '股票简称', '办公地址', '公司网址', '营业收入', '基本每股收益', '年份'])

            # 将DataFrame数据写入CSV文件
            df.to_csv('公司.csv', index=False, encoding='utf-8')

# 可视化
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib
matplotlib.rcParams['font.sans-serif'] = 'SimHei' 

df = pd.read_csv('公司.csv', usecols=['年份', '营业收入', '基本每股收益'])

plt.figure()
plt.plot(df['年份'], df['营业收入'], 'o-', label='营业收入', linewidth=2)
plt.xticks(rotation=45)
plt.xlabel('年份')
plt.ylabel('营业收入')
plt.title('金陵体育近十年营业收入变化趋势图')
plt.legend()
plt.show()

plt.figure()
plt.plot(df['年份'], df['基本每股收益'], 'x-', label='基本每股收益', linewidth=2)
plt.xticks(rotation=45)
plt.xlabel('年份')
plt.ylabel('基本每股收益')
plt.title('金陵体育近十年基本每股收益变化趋势图')
plt.legend()
plt.show()

import pandas as pd
import matplotlib.pyplot as plt
import matplotlib
matplotlib.rcParams['font.sans-serif'] = 'SimHei' 

df = pd.read_csv('公司.csv', usecols=['年份', '股票简称', '股票代码', '办公地址', '公司网址', '营业收入', '基本每股收益'])
# 1. 按年份制图
grouped = df.groupby(['年份'])

for name, group in grouped:
    plt.figure(figsize=(12, 6))
    plt.suptitle(f"{name}年营业收入和基本每股收益柱状图")
    plt.subplot(211)
    plt.bar(group['股票简称'], group['营业收入'], width=0.3, label='营业收入')
    plt.xticks(rotation=45)
    plt.xlabel('股票简称(股票代码)')
    plt.ylabel('营业收入')
    plt.legend()
    plt.subplot(212)
    plt.bar(group['股票简称'], group['基本每股收益'], width=0.3, label='基本每股收益')
    plt.xticks(rotation=45)
    plt.xlabel('股票简称(股票代码)')
    plt.ylabel('基本每股收益')
    plt.legend()
    plt.show()


data = pd.read_csv('公司.csv')
# # 2. 所有绘制在同一张图-折线
#按年份从小到大排序
data = data.sort_values('年份')

#获取全部的股票信息
stocks = data['股票简称'].unique()
#按年份从小到大排序
data = data.sort_values('年份')

#获取全部的股票信息
stocks = data['股票简称'].unique()




fig, ax1 = plt.subplots(figsize=(12, 6))

# 绘制每个公司的营业收入
for stock in stocks:
    stock_data = data[data['股票简称'] == stock]
    # 将字符串中的逗号替换为空格,并将列类型转换为浮点数
    stock_data['营业收入'] = stock_data['营业收入'].str.replace(',', '')
    stock_data['营业收入'] = stock_data['营业收入'].str.replace(' ', '').astype(float)
    ax1.plot(stock_data['年份'], stock_data['营业收入'], label=stock)

# 添加y轴标签、图例和标题
ax1.set_xlabel('年份')
ax1.set_ylabel('营业收入', color='tab:red')
ax1.tick_params(axis='y', labelcolor='tab:red')
ax1.legend(loc='upper left', bbox_to_anchor=(1.02, 1), borderaxespad=0)
ax1.set_title('营业收入随时间的变化趋势图')
# 显示图形
plt.show()
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib
matplotlib.rcParams['font.sans-serif'] = 'SimHei' 
df = pd.read_csv('公司_4.csv')  # 读取文件

# 3. 所有绘制在一张图上-柱形图
# 将字符串中的逗号替换为空格,并将列类型转换为浮点数
df['营业收入'] = df['营业收入'].str.replace(',', '')
df['营业收入'] = df['营业收入'].str.replace(' ', '').astype(float)
df['基本每股收益'] = df['基本每股收益'].astype(float)

# 获取不同年份的营业收入情况
year_revenue = df.pivot_table(index='年份', columns='股票简称', values='营业收入')
year_revenue.plot(kind='bar')
plt.title('营业收入对比图')
plt.xlabel('年份')
plt.ylabel('营业收入')
plt.show()

# 获取不同年份的基本每股收益情况
year_eps = df.pivot_table(index='年份', columns='股票简称', values='基本每股收益')
year_eps.plot(kind='bar')
plt.title('基本每股收益对比图')
plt.xlabel('年份')
plt.ylabel('基本每股收益')
plt.show()

每家公司的趋势图

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

行业解读

中国印刷行业实现累计工业总产值122,046,474千元,比上年同期增长22.45%;实现累计产品销售收入8,265,655千元,比上年同期增长29.25%;实现累计利润总额6,724,711千元,比上年同期增长25.83%;全行业规模以上企业数量为4451个,实现累计工业总产值188,663,957千元,比上年同期增长18.64%。 但不可忽视的是,随着互联网的迅速发展,网络已经成为人们日常生活不可缺少的一部分,随着大型电子商务的快速普及和发展,许多著名的传统企业也纷纷加入到电子商务行业当中。目前国内的印刷厂已达数十万家,市场竞争越来越激烈、印刷费用日益高涨、客户对价格和速度的要求也越来越高,要确保未来业务量的持续增长,就需要构建新的市场机遇。 观察本次实验报告所截取的几家公司经营现状,我们也能得知在近十年的发展历程中企业营收大都保持着正向发展,同时每股收益状况相对波动较大,由此也可以看出印刷行业总体保持向好走势,但落到各家企业而言,在行业内的生存空间随着竞争的加剧正在不断萎缩,未来也需要向着更加高程度的数字化和多样化发展。

心得体会

一个学期的学习过后,最大的感想就是这门课的难度不容小觑!虽然在过去的学习中有接触过python课程,但实话说更多地将目光落在了表面,对于内在的运行规律和逻辑实则一窍不通,甚至在本学期的课堂上也存在诸多一知半解的内容,但是很感谢老师耐心的教导,不记得多少次把老师喊住问问题了,只记得老师永远是非常耐心与和蔼,对于我没听懂的步骤,总是细致入微到每个细节逐一讲解,让人收获颇丰。 其次就是我们的实验报告了,真的没有想到只会点“三脚猫”功夫就要上战场了,只能不停地询问同学、翻看学长学姐的作业范例,只能说是勉勉强强做出了个成品,但是就在这样慌慌张张的过程中倒也学到了很多,比如终于系统地将本学期学过的知识点融汇在了一起,比如学到了如何将密密麻麻的代码变成一篇图文并茂的报告。很开心能通过这门课再次加深对python的了解,一点一滴的学习也将给予我日后继续学习的动力!