利用Python实现批量下载上市公司财务报表

导语

用VBA做了个小工具,可以批量把某网站上的上市公司的财报下下来。

制作思路非常简单:

1、从该网站上的下载链接中找到规律:都是一段@#¥%……&开头加上想要下载的报表类型(BS,ER,SCF),加上会计期间(按年度、按报告期、按季度),再加上上市公司代码。

2、然后用Excel表格排列组合生成那些下载链接,并访问。这里没有直接用get/post,因为会被网站识别出来并拒绝访问,下载下来的文件就是空的。然后我就用了个比较笨的办法,调用IE去访问这些网址,然后用VBA的Sendkeys方法模拟手工点击下载按钮。

运行之后没有被block掉,可行

感觉像是在用手榴弹炸直升机,而且用VBA有个很大的缺陷:如果IE不能正确地出现在桌面的最前台(比如微信突然弹出个消息……),这样会导致application.sendkeys方法失效。

这里用Python再做一个,但还是避免不了要借用一下VBA里面的一些功能……

思路和上面是一样的,根据网站规则组装好下载链接后调用IE去下载。

不一样的是,这次没有模拟快捷键,而是用pyautogui的图像识别功能去调用鼠标点击下载按钮。用这种方法的好处是不容易被弹窗打断,命中率更高。

Python代码:

"""
运行前提
 1、确保“从THS批量下载上市公司财报.py”、“从THS批量下载上市公司财报.xlsm”、“capture.png”三个文件存放在同一目录下
 2、确保安装了以下几个第三方库:pyautogui、pywin32、pandas、xlwings
 3、确保把IE的默认下载路径改成本文件所在目录
 4、下载后立即最小化运行窗口,避免遮挡屏幕导致pyautogui无法定位图像位置
没有安装的话可以在命令提示符里面输入“pip install 库名”进行安装:
    pip install pyautogui
    pip install pywin32
    pip install pandas
    pip install xlwings
"""

import pyautogui
from win32com.client import DispatchEx
import pandas
import xlwings
import time
import os

# 同花顺网站下载{链接的固定字段:文件名固定字段}
ref = {'main&type=report': 'main_report.xls',
       'main&type=year': 'main_year.xls',
       'main&type=simple': 'main_simple.xls',
       'debt&type=report': 'debt_report.xls',
       'debt&type=year': 'debt_year.xls',
       'benefit&type=report': 'benefit_report.xls',
       'benefit&type=year': 'benefit_year.xls',
       'benefit&type=simple': 'benefit_simple.xls',
       'cash&type=report': 'cash_report.xls',
       'cash&type=year': 'cash_year.xls',
       'cash&type=simple': 'cash_simple.xls'}

df = pandas.read_excel(r'./从THS批量下载上市公司财报.xlsm', sheet_name='Main', dtype='str', header=0)

# 把表格中不足6位的公司代码补全成6位,比如把'2'补全成'000002'
df['公司代码'] = df['公司代码'].apply(lambda x: str('000000')[:(6 - len(x))] + str(x))

# 创建一个{下载文件名:下载链接}的字典
urls = {}
for i in ref.keys():
    for j in df['公司代码']:
        # 如果原来下载过就略过以节约时间
        if not os.path.exists(f'{j}_{ref[i]}'):
            urls[f'{j}_{ref[i]}'] = str(f'http://basic.10jqka.com.cn/api/stock/export.php?export={i}&code={j}')

wb = xlwings.App(visible=False, add_book=False).books.open(r'./从THS批量下载上市公司财报.xlsm')

# 这里用Excel宏的一个退出IE功能,比win32com的功能更好用
# 也是因为本人技术太渣,不知道怎么用Python完全退出IE
# QuitIE的宏代码在后面
QuitIE = wb.macro('QuitIE')

# 这里用Excel宏的XMLHTTP功能,下载效率更高
# XMLHTTP的宏代码在后面
XMLHTTP = wb.macro('XMLHTTP')

# IE浏览器下载button的截图
img = r'./capture.png'

def IEDownload(url):
    ie = DispatchEx('InternetExplorer.Application')
    ie.Navigate(url)

    # 最多尝试查找5次,避免死循环
    times = 0
    while times < 5:
        location = pyautogui.locateCenterOnScreen(img, confidence=0.9)
        if location is not None:
            pyautogui.click(location.x, location.y, clicks=1, button='left', duration=0.01, interval=0.01)
            break
        times += 1

windows = 0
for filename in urls:
    # 每7次调用一次xmlhttp,胆子大可以把这个值设小点
    if windows % 7 == 0:
        XMLHTTP(filename, urls[filename])
        if not os.path.exists(f'./{filename}'):
            IEDownload(urls[filename])
        windows += 1
    else:
        IEDownload(urls[filename])
        windows += 1
        # 每7次关闭IE的所有窗口,释放内存
        if windows % 7 == 0:
            time.sleep(0.05)
            QuitIE()
            time.sleep(0.05)

QuitIE()
wb.close()
xlwings.App().quit()

# 以下是可选功能,把xls格式的文件转成最新的xlsx格式
# if not os.path.exists('./xlsx格式文件'):
#   os.mkdir('./xlsx格式文件')
# for i in os.listdir('.'):
#   if not os.path.exists(f'./xlsx格式文件/{i}x') and i.endswith('xls'):
#          df=pandas.read_excel(f'./{i}',header=1,index_col=0)
#          df.to_excel(f'./xlsx格式文件/{i}x')

QuitIE宏代码:

Sub QuitIE() 
 
    Dim winmgmts As Object
    Dim ieprc As Object
    Dim ieprcs As Object
 
    Set winmgmts = GetObject("winmgmts://.")
    Set ieprcs = winmgmts.ExecQuery("SELECT * FROM Win32_Process WHERE Name = 'iexplore.exe'")
 
    For Each ieprc In ieprcs
        On Error Resume Next
        Call ieprc.Terminate
    Next
   
    Set ieprcs = Nothing
    Set winmgmts = Nothing
 
End Sub

XMLHTTP宏代码:

'传进来的两个参数分别是文件名和下载链接
Sub XMLHTTP(FileName, url)  
Dim h, s, fpath
fpath = ThisWorkbook.Path & "\"
'先判断下文件是不是已经下载过了
If Dir(fpath & FileName) = "" Then
 
    Set h = CreateObject("Microsoft.XMLHTTP")
    h.Open "GET", url, False   '网络中的文件URL
    h.send
    Set s = CreateObject("ADODB.Stream")
    s.Type = 1
    s.Open
    s.write h.responseBody
    s.savetofile fpath & FileName, 2 '本地保存文件名
    s.Close
 
    '万一被网站反爬了下载下来的就是空文件,删掉
    If FileLen(fpath & FileName) < 600 Then 
        Kill fpath & FileName
    End If
    
End If
End Sub

以上就是利用Python实现批量下载上市公司财务报表的详细内容,更多关于Python下载报表的资料请关注我们其它相关文章!

(0)

相关推荐

  • 对python生成业务报表的实例详解

    本文介绍一个用python结合xlsxwriter自动生成业务报表的程序.这里的业务数据采用的是指定的值,真实情况下需要其他程序来接入数据. # -*- coding: utf-8 -*- import xlsxwriter workbook = xlsxwriter.Workbook('chart.xlsx') worksheet = workbook.add_worksheet() # 指定类型为柱状图 chart = workbook.add_chart({'type': 'column'

  • 利用python实现周期财务统计可视化

    正文之前 上午给爸爸打了个电话庆祝他50岁生日,在此之前搞了个大扫除,看了会知乎,到实验室已经十一点多了.约喜欢的妹子吃饭失败,以至于工作积极性收到了打击,所以就写个程序来统计下开学十一天的财务消费情况,更清楚的认识自己. 正文 废话不多说,先放代码: import matplotlib.pyplot as plt import matplotlib from pylab import mpl plt.rcParams['font.sans-serif']=['SimHei'] def getA

  • 如何使用Python自动生成报表并以邮件发送

    数据分析师肯定每天都被各种各样的数据数据报表搞得焦头烂额,老板的,运营的.产品的等等.而且大部分报表都是重复性的工作,这篇文章就是帮助大家如何用Python来实现报表的自动发送,解放你的劳动力,可以让你有时间去做更有意思的事情. 首先来介绍下实现自动报表要使用到的Python库: pymysql 一个可以连接MySQL实例并且实现增删改查功能的库 datetime Python标准库中自带的关于时间的库 openpyxl 一个可以读写07版以后的Excel文档(.xlsx格式也支持)的库 smt

  • Python制作可视化报表的示例详解

    大家好,我是小F- 在数据展示中使用图表来分享自己的见解,是个非常常见的方法. 这也是Tableau.Power BI这类商业智能仪表盘持续流行的原因之一,这些工具为数据提供了精美的图形解释. 当然了,这些工具也有着不少缺点,比如不够灵活,无法让你自己创建设计. 当你对图表展示要求定制化时,编程也许就比较适合你,比如Echarts.D3.js. 今天小F给大家介绍一个用Python制作可视化报表的案例,主要是使用到Dash+Tailwindcss. 可视化报表效果如下,水果销售情况一览~ Das

  • 基于Python实现自动化生成数据报表

    目录 前言 开发工具 环境搭建 主要代码 前言 不要在用手敲生成Excel数据报表了,用Python自动生成Excel数据报表!废话不多说 让我们愉快地开始吧~ 开发工具 Python版本: 3.6.4 相关模块: pandasxlwingsmatplotlib模块: xlwingsmatplotlib模块: matplotlib模块: 以及一些Python自带的模块. 环境搭建 安装Python并添加到环境变量,pip安装需要的相关模块即可. 原始数据如下,主要有水果蔬菜名称.销售日期.销售数

  • ZABBIX3.2使用python脚本实现监控报表的方法

    如下所示: #!/usr/bin/python #coding:utf-8 import MySQLdb import time,datetime #zabbix数据库信息: zdbhost = '172.16.8.200' zdbuser = 'zabbix' zdbpass = 'zabbix' zdbport = 3306 zdbname = 'zabbix' #生成文件名称: xlsfilename = 'zabbix.xls' #需要查询的key列表 [名称,表名,key值,取值,格式

  • Python 实现自动化Excel报表的步骤

    好几个月没有写笔记了, 并非没有积累, 而是有点懒了. 想想还是要续上, 作为工作成长的一部分哦. 最近有做一些报表, 但一直找不到一个合适的报表工具, 又实在不想写前端, 后端... 思来想去, 感觉 Excel 就一定程度上能做可视化的, 除了不能动态交互外, 其他都挺好. 今天分享的就是一个关于如何用 Py 来自动化Excel 报表, 解放双手, 提高工作效率哦. 总体解决方案 输出报表 当然是测试用的假数据啦. 自动化Py脚本 基本思路: 1. 准备模板数据需要的 SQL 2. 用 Pa

  • 利用Python实现批量下载上市公司财务报表

    导语 用VBA做了个小工具,可以批量把某网站上的上市公司的财报下下来. 制作思路非常简单: 1.从该网站上的下载链接中找到规律:都是一段@#¥%……&开头加上想要下载的报表类型(BS,ER,SCF),加上会计期间(按年度.按报告期.按季度),再加上上市公司代码. 2.然后用Excel表格排列组合生成那些下载链接,并访问.这里没有直接用get/post,因为会被网站识别出来并拒绝访问,下载下来的文件就是空的.然后我就用了个比较笨的办法,调用IE去访问这些网址,然后用VBA的Sendkeys方法模拟

  • Python实现批量下载文件

    Python实现批量下载文件 #!/usr/bin/env python # -*- coding:utf-8 -*- from gevent import monkey monkey.patch_all() from gevent.pool import Pool import requests import sys import os def download(url): chrome = 'Mozilla/5.0 (X11; Linux i86_64) AppleWebKit/537.36

  • Python实现批量下载图片的方法

    本文实例讲述了Python实现批量下载图片的方法.分享给大家供大家参考.具体实现方法如下: #!/usr/bin/env python #-*-coding:utf-8-*-' #Filename:download_file.py import os,sys import re import urllib import urllib2 base_url = 'xxx' array_url = list() pic_url = list() inner_url = list() def get_a

  • python实现批量下载新浪博客的方法

    本文实例讲述了python实现批量下载新浪博客的方法.分享给大家供大家参考.具体实现方法如下: # coding=utf-8 import urllib2 import sys, os import re import string from BeautifulSoup import BeautifulSoup def encode(s): return s.decode('utf-8').encode(sys.stdout.encoding, 'ignore') def getHTML(url

  • python爬虫 批量下载zabbix文档代码实例

    这篇文章主要介绍了python爬虫 批量下载zabbix文档代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 # -*- coding: UTF-8 -*- import requests,re,time url = 'https://www.zabbix.com/documentation/3.4/zh/manual' base_url = 'https://www.zabbix.com/documentation/3.4/' seco

  • python FTP批量下载/删除/上传实例

    最近几天,学习python3的对FTP操作,做下总结!!!! 1.FTP链接 这样写的好处就是如果报错,很快就能找到错在哪里,方便找到问题. 2.FTP文件批量下载 有点要注意的: 如果for循环中不加while..try..except..,当然也可以下载,但经常会出现500网络连接错误类似这种错误!! 3.FTP文件批量删除 4.FTP文件上传 5.FTP关闭连接 目前就先分享到这里,新手上路多多关照!!!! 以上这篇python FTP批量下载/删除/上传实例就是小编分享给大家的全部内容了

  • 利用Python脚本批量生成SQL语句

    通过Python脚本批量生成插入数据的SQL语句 原始SQL语句: INSERT INTO system_user (id, login_name, name, password, salt, code, createtime, email, main_org, positions, status, used, url, invalid, millis, id_card, phone_no, past, end_date, start_date) VALUES ('6', 'db', 'db',

  • 用python爬虫批量下载pdf的实现

    今天遇到一个任务,给一个excel文件,里面有500多个pdf文件的下载链接,需要把这些文件全部下载下来.我知道用python爬虫可以批量下载,不过之前没有接触过.今天下午找了下资料,终于成功搞定,免去了手动下载的烦恼. 由于我搭建的python版本是3.5,我学习了上面列举的参考文献2中的代码,这里的版本为2.7,有些语法已经不适用了.我修正了部分语法,如下: # coding = UTF-8 # 爬取李东风PDF文档,网址:http://www.math.pku.edu.cn/teacher

  • Python实现批量下载音效素材详解

    目录 序言 环境/模块/目标 1.目标 2.开发环境 3.模块 流程讲解 全部代码 序言 作为当代新青年,应该多少会点短视频制作吧? 哈哈,那当代自媒体创作者好了~ 制作视频的时候,多少需要一些搞怪的声音?或者奇怪的声音?音乐等等~ 一个个下载多慢,我们今天就用python实现批量下载~ 环境/模块/目标 1.目标 2.开发环境 兄弟们,刚学Python的话,不要安装一些其它的软件,就装这两个就可以了~ Python 环境 Pycharm 编辑器 3.模块 本次使用的模块主要是这两个 reque

  • 利用Python实现批量打包程序的工具

    目录 程序调用cmd命令 os.system() os.popen() subprocess.run() 程序实现 GUI界面设计 逻辑设计 打包函数 最近看了一些大佬发的关于可视化打包工具auto-py-to-exe文章,auto-py-to-exe是基于pyinstaller,但相比于pyinstaller,它多了 GUI 界面.我自己也试了一下,感觉确实好用且方便,动动手指就能对程序进行打包. 但我发现auto-py-to-exe与pyinstaller都无法直接一次性打包多个程序,想打包

随机推荐