python_巨潮年报pdf下载

devtools/2025/3/17 19:36:03/

目录

前置:

步骤:

step one: pip安装必要包,获取年报url列表

pdf%20url-toc" name="tableOfContents" style="margin-left:40px">step two: 将查看url列表转换为pdf url

pdf%C2%A0-toc" name="tableOfContents" style="margin-left:40px">step three: 多进程下载pdf 


前置:

1 了解一些股票的基本面需要看历年年报,在巨潮一个个下载比较费时间,所以考虑用python把年报pdf下载下来。

2 如果要下载的股票个数很多,提前预备好大硬盘。本人下载深沪两市年报,大概150G。另外,要耐心,整个下载过程要十几二十小时,视电脑配置和网络而定。

步骤:

step one: pip安装必要包,获取年报url列表

pip install pandas -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install openpyxl -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install akshare -i https://pypi.tuna.tsinghua.edu.cn/simple

pandas 本地处理数据、openpyxl excel表格处理需要这个包、akshare获取url接口(要了解akshare具体用法可以看其官网,直接百度搜素就能找到其官网)

1 获取股票代码列表,可以在通达信中获取。(通达信行情-》A股-》按“34”键-》导出表格)

2 写代码,遍历每个股票,一个股票一个Excel,记录该股票所有年报url。(巨潮最早能查到2000年)

def temp_000():import akshare as akpre_dir = r'E:/temp002/'with open('./stock_ticker.txt',mode='r',encoding='utf-8') as fr:contents = fr.read()stock_ticker_list = contents.split('\n')for symbol_str in stock_ticker_list:try:df = ak.stock_zh_a_disclosure_report_cninfo(symbol=symbol_str, market="沪深京",category="年报",start_date="20000101",end_date="20250315")df.to_excel(pre_dir+symbol_str+'.xlsx',engine='openpyxl')except:print(symbol_str)pass

3 这个过程大概半个小时到一个小时

 公告链接,这一列就是我们要的

pdf%20url" name="step%20two%3A%C2%A0%E5%B0%86%E6%9F%A5%E7%9C%8Burl%E5%88%97%E8%A1%A8%E8%BD%AC%E6%8D%A2%E4%B8%BApdf%20url">step two: 将查看url列表转换为pdf url

step one获取的公告链接是网页查看的url,要下载pdf需要获取pdf对应的url

1 拿一个公告链接用浏览器打开,寻找pdf对应的url

http://www.cninfo.com.cn/new/disclosure/detail?stockCode=000001&announcementId=1222806509&orgId=gssz0000001&announcementTime=2025-03-15 00:00:00

 2 对比pdf url与公告链接的关系,将所有公告链接转换成pdf对应的url

def temp_001():pre_dir = r'E:/temp002/'tar_dir = r'E:/temp006/'file_list = os.listdir(pre_dir)for file_one in file_list:ticker = file_one[0:6]pre_file_path = pre_dir + file_onedf = pd.read_excel(pre_file_path,engine='openpyxl')url_list = df['公告链接'].to_list()pdf_url_list = []for u_one in url_list:u_one_00 = u_one.split('&')node_00 = u_one_00[1].replace('announcementId=','')node_01 = u_one_00[-1].replace('announcementTime=','')node_01 = node_01[0:10]tar_node = f'http://static.cninfo.com.cn/finalpage/{node_01}/{node_00}.PDF'pdf_url_list.append(tar_node)passpdf_url_list_str = '\n'.join(pdf_url_list)with open(f'{tar_dir}/{ticker}.txt', mode='w', encoding='utf-8') as fw:fw.write(pdf_url_list_str)passpass

3 这个过程几分钟,一个股票对应一个txt文件

pdf%C2%A0" name="step%20three%3A%C2%A0%E5%A4%9A%E8%BF%9B%E7%A8%8B%E4%B8%8B%E8%BD%BDpdf%C2%A0">step three: 多进程下载pdf 

要下载的pdf很多,但股票个数也就五千多个,本人搞了个简单的多线程

1 分5个线程,把txt文件分到五个文件夹里,文件夹以0、1、2、3、4命名

2 创建下载后放置pdf文件的文件夹,文件夹同样以0、1、3、4命名

3 写代码,执行。等待执行完毕,整个过程十几小时以上,看电脑配置和网络情况。

import os,threading'''
多线程下载财报
'''# 创建多个线程
def temp_thread():threads = []for i in range(5):thread = threading.Thread(target=temp_005,args=(i,))threads.append(thread)thread.start()passfor thread in threads:thread.join()print('all thread finished')pass# 执行项
def temp_005(i):import requestspre_dir = r'E:/temp006/'+str(i)+'/'tar_dir = r'E:/temp007/'+str(i)+'/'file_list = os.listdir(pre_dir)for file_one in file_list:ticker = file_one[0:6]tar_dir00 = tar_dir + ticker + os.path.sepif not os.path.exists(tar_dir00):os.mkdir(tar_dir00)url_file_path = pre_dir + file_onewith open(url_file_path,'r') as fr:url_str = fr.read()url_list = url_str.split('\n')try:for url_one in url_list:tar_file_name00 = url_one.split('/')tar_file_name = f"{tar_file_name00[-2]}_{tar_file_name00[-1]}.pdf"try:res = requests.get(url_one)if res.status_code == 200:with open(tar_dir00+tar_file_name,'wb') as fw:fw.write(res.content)passelse:error_str = f'下载失败,状态码:{res.status_code}。{url_one}\n'with open(f'./{i}.txt','a',encoding='utf-8') as fw:fw.write(error_str)except:print(url_one)passpassexcept:print(ticker)passprint('----------------end---',i)passif __name__ == '__main__':temp_thread()pass

执行完毕后,研究历年财报再也不用一个个下载啦,哈哈哈


http://www.ppmy.cn/devtools/167903.html

相关文章

SpringMVC——REST简介及入门案例

REST简介 REST(Representational State Transfer)即表现层状态转移,是一种基于HTTP协议的网络应用程序的架构风格。它强调客户端和服务器之间的交互操作,通过对资源的表现形式进行操作来实现对资源的管理。REST风格的API设计具有简…

SQL Server表数据变更捕获的5种方法及实战对比

在数据驱动的业务场景中,准确捕获SQL Server表数据变更是数据审计、业务分析、系统集成等场景的必备能力。本文深入解析五种主流变更捕获方案,并提供企业级方案选型指南,帮助开发者构建高效可靠的变更追踪体系。 一、变更捕获核心技术原理 …

9种Python数据可视化方案,让财务数据焕发生命力

想象一下:你即将向董事会展示季度财务报告,面对的是一群已经看过无数PPT的高管。你是选择用普通的柱状图和折线图,还是用能够直观展示收入、支出、利润动态关系的交互式仪表板? 本文将通过一个完整的Python财务数据可视化案例&am…

安卓屏保调试

安卓屏保调试 - Wesley’s Blog 先看一下在设置点击屏保预览后的调用链(Android 14) #mermaid-svg-YQ66ef7zSvNutCCW {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-YQ66ef7zSvNutCCW .erro…

Web开发-PHP应用文件操作安全上传下载任意读取删除目录遍历文件包含

知识点: 1、安全开发-原生PHP-文件安全操作 2、安全开发-原生PHP-上传读取删除包含等 3、安全开发-原生PHP-代码审计文件安全 一、演示案例-WEB开发-文件安全-上传下载读取 文件上传 $_FILES:PHP中一个预定义的超全局变量,用于在上传文件时…

历次科技泡沫对人工智能发展的启示与规避措施

引言:科技浪潮中的 AI 与泡沫 在科技发展的漫长进程中,泡沫现象如影随形,成为了每一次技术变革时代的独特注脚。从早期铁路狂热时期的盲目投资,到 1929 年大崩盘前电气设备行业的过度繁荣,再到 2000 年左右那场震惊全…

计算机网络:Socket编程 Tcp协议 第二弹

目录 1. Tcp协议接口 1.1 listen监听函数 1.2 accept函数 1.3 connect函数 1.4 inet_ntop函数 2. TcpEchoServer服务 2.1 Common.hpp 2.1 TcpServer.hpp 2.1.1 TcpServer类 2.1.2 InitServer函数 2.1.3 Start函数 2.1.4 HandlerRequest函数 2.3 TcpServer.cc 2.4…

Spring(6)——Spring、Spring Boot 与 Spring MVC 的关系与区别

Spring、Spring Boot 与 Spring MVC 的关系与区别 1. 核心定位 Spring 定位:基础框架,提供 IoC(控制反转) 和 DI(依赖注入) 核心功能,管理对象生命周期及依赖关系。功能:支持事务管…