目錄
前置:
步驟:
step one:?pip安裝必要包,獲取年報url列表
step two:?將查看url列表轉換為pdf url
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?這個過程大概半個小時到一個小時
?公告鏈接,這一列就是我們要的
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文件
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
執行完畢后,研究歷年財報再也不用一個個下載啦,哈哈哈