【Python/BS4】東証のTDnet(適時開示)をcsvで保存する

Python

みなさまこんにちは!ほぬです!
大変久しぶりの更新になってしまいましたが、今日は、東京証券取引所のサイトで、上場している企業が情報をアップロードしていくサイトであるTDnet(適時開示情報閲覧サービス)をスクレイピングしてみます。
具体的には、指定した日付の開示企業や時刻・開示タイトル・開示へのリンクを取得して、csvファイルに保存します。
元々の参考にしたものはこちらのブログのものになります。ありがたやありがたや。

適時開示情報の取得
https://qiita.com/Fortinbras/items/d9a5c3698972a6352231

コアの部分は上記サイトの丸ごと写経なのですが、リンク先のスクリプトでは、ちょっと困ったことがあります。
①python上で閲覧するだけなので、その場限りの閲覧になってしまう(保存しておきたい)。
②作成者の方も書いておられますが、開示量が10ページ以上にまたぐ日は取得できない
③開示情報の修正が入っている日は取得できない

このうち、①と②は、下に私が記載するものでクリアできました。
③が大変曲者で、まだ攻略できずにいますが、道筋は見えてきました。。。

できること

①指定した日付の適時開示一覧を取得してフレームワークに格納する
②格納したフレームワークをcsvファイルにコピペする
③作成したcsvファイルを、スクリプトの直下にある「data」という名前のフォルダに、「tekijikaiji + 日付.csv」というファイル名で保存する

参考サイトの写経で、あまり細切れで解説できるものではないので、丸貼りしてしまいます!

本体

from urllib.request import urlopen
from bs4 import BeautifulSoup
import pandas as pd
from datetime import datetime, date, timedelta

 # 日付
yesterday = datetime.today() - timedelta(days=1)
 # date = yesterday.strftime('%Y%m%d') #昨日
date = '20200219' #任意の日付を指定できる

def fn_test(url):

      #変数設定
      a,b,c,d,e,f  = [],[],[],[],[],[] #リストを6つ用意
      df = pd.DataFrame() #取得結果格納用のデータフレーム

      #ページの閲覧
      html = urlopen(url)
      bsObj = BeautifulSoup(html, "html.parser")    
      tbl3 = bsObj.findAll("table")[3]
      trs = tbl3.findAll("tr")

      for tr in trs:
            lst = []
            tds = tr.findAll('td') 
            for td in tds:
                  #各tdの値を各リストに各々格納
                  if td.get("class")[1] =="kjTime":a += [td.text ] #開示時刻
                  if td.get("class")[1] =="kjCode":b += [td.text ] #コード
                  if td.get("class")[1] =="kjName":c += [td.text ] #社名
                  if td.get("class")[1] =="kjTitle":d += [td.a.text ] #表題
                  if td.get("class")[1] =="kjTitle": #pdfのリンクURL
                      e += ['https://www.release.tdnet.info/inbs/' + td.a.get("href") ] if td.a is not None else [td.a ] 
                  if td.get("class")[1] =="kjXbrl" : #XBRLのDLリンク
                      f += ['https://www.release.tdnet.info/inbs/' + td.a.get("href") ] if td.a  is not None else [td.a ] 
            lst.append(td)
      #取得結果格納リスト群からデータフレーム生成
      df = pd.DataFrame(
              data={'日付': date, '時刻': a, 'コード': b, '会社名': c, '表題': d, 'url': e, 'XBRL': f},
              columns=['日付', '時刻', 'コード', '会社名', '表題', 'url', 'XBRL'])        
      return df 

 # URL文字列の生成
url0 = 'https://www.release.tdnet.info/inbs/'
url1 = url0  +  'I_list_{}_{}.html'.format('001',date)
 # 該当URLを閲覧
html = urlopen(url1)
bsObj = BeautifulSoup(html, "html.parser")
tbl1 = bsObj.findAll("table")[1]

dv1 = tbl1.findAll("div",{"class":"kaijiSum"})
dv2 = tbl1.findAll("div",{"class":"pager-O"})
dv3 = tbl1.findAll("div",{"class":"pager-M"})

if dv1 ==[]:
   print('開示0件')
else:
    print(str(dv1).split('全')[1].split('</')[0])
    lst =[ range((int(str(dv1).split('全')[1].split('件')[0])//100 + 1))]
    if lst ==[]:
        df_t  = fn_test(url1)
        print(df_t)
    else:
        # ページ数の取得
        mxpg= int(str(dv1).split('全')[1].split('件')[0])//100 + 1 
        print( mxpg )
        df_t = pd.DataFrame()

        # 再度URL文字列の生成
        for i in range(mxpg):
              s = str(i + 1)
              url1= url0  + 'I_list_{}_{}.html'.format(s.zfill(3) ,date)      
              print(s , url1)

              # ページを逐次閲覧して開示情報を取得
              df = fn_test(url1)
              df_t = df_t.append(df, ignore_index = True)

    df_t.to_csv('./data/tekijikaiji' + date + '.csv', sep = ',', encoding = 'utf-8_sig')
print('finished')

解説は時間かかるのでまた後日!
それから、ここで取得した開示一覧の中から、開示のタイトルが特定のキーワードに引っかかっているものだけを抽出したり、特定の銘柄コードのものだけを抽出したり、抽出したリンク先のpdfを自分のパソコンにダウンロードしたり、ができるものも作成したので、そちらも後日書いていきたいと思います!

2020/2/22追記
この後散々格闘しまして、③適時開示の修正が入っている日のものが取得できない。
を、できるようになった、改良版が完成しました。
こちらの記事に置いてありますので、そちらを使われたほうがいいかと思います。

ほぬ

コメント

  1. […] 先日の記事で、東証TDnetから適時開示の一覧を取ってきて保存するものを作成しましたが、そちらの改修版ができましたのでアップします。 […]

タイトルとURLをコピーしました