我的编程空间,编程开发者的网络收藏夹
学习永远不晚

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

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

利用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下载报表的资料请关注编程网其它相关文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

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

下载Word文档到电脑,方便收藏和打印~

下载Word文档

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录