みなさまこんにちは!ほぬです!
大変久しぶりの更新になってしまいましたが、今日は、東京証券取引所のサイトで、上場している企業が情報をアップロードしていくサイトである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追記
この後散々格闘しまして、③適時開示の修正が入っている日のものが取得できない。
を、できるようになった、改良版が完成しました。
こちらの記事に置いてありますので、そちらを使われたほうがいいかと思います。
ほぬ
コメント
[…] 先日の記事で、東証TDnetから適時開示の一覧を取ってきて保存するものを作成しましたが、そちらの改修版ができましたのでアップします。 […]