python_巨潮年报pdf下载

目录

前置:

步骤:

[step one: pip安装必要包,获取年报url列表](#step one: pip安装必要包,获取年报url列表)

[step two: 将查看url列表转换为pdf url](#step two: 将查看url列表转换为pdf url)

[step three: 多进程下载pdf](#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 ak
    pre_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 这个过程大概半个小时到一个小时

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

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_one
        df = 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)
            pass
        pdf_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)
        pass
    pass

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

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()
        pass
    for thread in threads:
        thread.join()
    print('all thread finished')
    pass


# 执行项
def temp_005(i):
    import requests
    pre_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.sep
        if not os.path.exists(tar_dir00):
            os.mkdir(tar_dir00)
        url_file_path = pre_dir + file_one
        with 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)
                        pass
                    else:
                        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)
                pass
            pass
        except:
            print(ticker)
        pass
    print('----------------end---',i)
    pass


if __name__ == '__main__':
    temp_thread()
    pass

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

相关推荐
行云流水剑5 分钟前
【学习记录】如何使用 Python 提取 PDF 文件中的内容
python·学习·pdf
IDRSolutions_CN17 分钟前
PDF 转 HTML5 —— HTML5 填充图形不支持 Even-Odd 奇偶规则?(第二部分)
java·经验分享·pdf·软件工程·团队开发
upp2 小时前
【bug】Error: /undefinedfilename in (/tmp/ocrmypdf.io.9xfn1e3b/origin.pdf)
ubuntu·pdf·bug·ghostscript
沉到海底去吧Go6 小时前
【工具教程】多个条形码识别用条码内容对图片重命名,批量PDF条形码识别后用条码内容批量改名,使用教程及注意事项
pdf
摸鱼仙人~6 小时前
PDF图片和表格等信息提取开源项目
pdf
空中湖21 小时前
文档极速转换器 - 免费批量Word转PDF工具
pdf·word
沉到海底去吧Go1 天前
【工具教程】PDF电子发票提取明细导出Excel表格,OFD电子发票行程单提取保存表格,具体操作流程
pdf·excel
诸葛大钢铁1 天前
PDF转PPT转换方法总结
pdf·powerpoint
漫游者Nova2 天前
PDF转Markdown/JSON软件MinerU最新1.3.12版整合包下载
pdf·json·markdown·mineru
sss191s2 天前
Java 集合面试题 PDF 及常见考点解析与备考指南
java·开发语言·pdf