pagetakaBlog

最近リフォームと鳥取県日南町の記事多め。写真、PC、ネット等の話題も

Python:東証からPDFをDL。スクリプト掲載、自己責任で。

【注意書き:使用中フォルダ、ファイルを削除する可能性があるかも】
【注意書き:使用中フォルダ、ファイルを削除する可能性があるかも】

このPythonスクリプトを実行すると、特定のフォルダを削除する可能性があります。注意書きをお読みいただき、納得の上、自己責任でお試しください。爺は、一切責任を負えません。

とっても大切なこと:フォルダとファイルを削除する機能があります。

このスクリプトには、PC内のフォルダとその中にあるファイル等を一括削除する機能があります。対象のフォルダ名は 'C:\\jpx_data\\' です。もし、同名フォルダをすでに使用中であれば、このスクリプトを実行するとフォルダ、ファイルが失われます。実行前に、

東証株式日報(PDF)をダウンロードする環境。

Python3.13.1で今回のスクリプトを書きました。追加でインストールするライブラリがあります。具体的には以下のライブラリです。

import dataclasses
import os
import shutil
import urllib.error
import urllib.request as req
from bs4 import BeautifulSoup
import sys

VSCodeだとターミナル画面で、pip install xxx でインストールできます。
今回、RDBは使いませんので、MySQLなどの設定は必要ありません。

フォルダ名指定は @dataclasses.dataclass

フォルダ名をご自身の都合の良い名前に変更する場合は、スクリプト内の python_folder の値を変更してください。

@dataclasses.dataclass
class st:
python_folder: str = 'C:\\jpx_data\\'

'C:\\jpx_data\\' を書き直してください。「\]は半角円マークです。
このフォルダには、東証サイトからDLしたPDFなどが置かれます。

このスクリプトを立ち上げるたびに、 'C:\\jpx_data\\' 削除し再作成(空)

比較的短い期間のデータをDLし保管する、ということで、毎回データを追加するのではなく、必要日数(以上)をDLするようになっています。大切なファイルを、 'C:\\jpx_data\\' に置かないでください。

東証から日報PDFをダウンロードするPythonスクリプト

以下に、東証から日報PDFをダウンロードするPythonスクリプトを掲載します。実行は自己責任でお願いします。爺は責任負えませぬ、キッパリ。

不都合や齟齬がありましたら、優し目にお知らせください(懇願)。

"""
jpx株式日報(PDF)をDLしPCに保管する。このスクリプトでは取得日数10日以上を担保できる二月分を無条件に実行する。
具体的には、dataclassのclass num: n_data_days: int = 10 で指定している。
DLしたPDFは、dataclassで明示した python_folder: str = 'C:\\jpx_data\\' に保管される。
このフォルダ―には他形式のファイルも保存される。PCで同名フォルダをすでに使っている場合は、python_folderの値を
必ず使用してない他のフォルダ名へ書き直してください。


# !!! 必読: PCで'C:\\jpx_data\\'をすでに使用している場合ファイル等削除発生します !!!
# @dataclasses.dataclass内のclass st: の値を支障のないフォルダ位置に書き直してください。

"""

import dataclasses
import os
import shutil
import urllib.error
import urllib.request as req
from bs4 import BeautifulSoup
import sys

url_jpx = ['https://www.jpx.co.jp/markets/statistics-equities/daily/index.html',
        'https://www.jpx.co.jp/markets/statistics-equities/daily/00-archives-01.html']

@dataclasses.dataclass
class st:
    python_folder: str = 'C:\\jpx_data\\' # ←フォルダ名を現に何らかの用途に使っている場合は要書き直し
    
    jpx_head: str = 'https://www.jpx.co.jp'

class num:
    n_data_days: int = 10   #資料とする日数

    
# 関数
def check_and_make_dir():
    # 自己責任で次行のreturnを削除してからお使いください。
    return  # 大切なフォルダ・ファイルが意図せず削除されないよう、早期returnを置いてます。
    
    # !!! 必読:このスクリプトを現に使用するPCで'C:\\jpx_data\\'を使用している場合ファイル等削除発生します
    # @dataclasses.dataclass内のclass st: の値を書き直すこと
    # def check_and_make_dir(): 直下の return を削除すれば python_holder の値で動きます    

    shutil.rmtree(st.python_folder, ignore_errors=True); os.makedirs(st.python_folder)

    return '例外:def check_and_make_dir() 発生しないつもりの戻り値'
    
def find_pdf_url_on_jpx():
    links = []
    for a_url in url_jpx:
        res = req.urlopen(a_url)
        soup = BeautifulSoup(res, 'html.parser')
        result = soup.select('a[href]')
        [links.append(link.get('href')) for link in result]
        url_pdfs = [f'{st.jpx_head}{temp}' for temp in links \
                if ('stq_' in temp and temp.endswith('pdf') )]
        
    return url_pdfs if len(url_pdfs) >= num.n_data_days else sys.exit()



def dl_PDF_jpx2pc(url_pdfs):

    for i, a_url in enumerate(url_pdfs[:num.n_data_days]):
    # for i, a_url in enumerate(url_pdfs[:num.n_data_days]):
        try:
            a_pdf = req.urlopen(f'{a_url}').read()
            with open(f'{st.python_folder}{a_url[-12:]}', mode = 'wb') as f:
                f.write(a_pdf)
            # print(f'{i}: {a_url}')

        except urllib.error.URLError as e:            
            ermsg = f'接続断で処理中止: {e}'
            sys.exit(ermsg)

        except Exception as e:            
            ermsg = f'予期外エラーで処理中止: {e}'
            sys.exit(ermsg)

        finally:
            print(f'\r処理済:{i+1}/{len(url_pdfs)}', end ='')
    print()

    return ''


# メイン
def main():
    check_and_make_dir()
    url_pdfs = find_pdf_url_on_jpx()
    dl_PDF_jpx2pc(url_pdfs)    

    return 'end'


if __name__ == '__main__':

    main()

"""
処理済:x/n予期外エラーで処理中止: [Errno 2] No such file or directory: 'C:\\jpx_data\\yyyymmdd.pdf'
↑表示される場合は、'C:\\jpx_data\\'フォルダが存在してない可能性がありそうです。

'C:\\jpx_data\\'を使用する場合は、# 関数 def check_and_make_dir(): 内の注意書きをご覧いただき、
自己責任で同関数次行のreturnを削除してからお使いください。 
"""