Python
Python3
xbrl
GoogleColaboratory

上場会社一覧を取得して有報キャッチャーのatomを閲覧するまわり(XBRL取得の準備など)

qiita.py
#事前処理
#!pip list
!pip install -q xlrd
###############################################

from google.colab import files

import google.colab
import googleapiclient.discovery
import googleapiclient.http

import os
#import datetime
import requests
from bs4 import BeautifulSoup
import time

import pandas as pd


def fn_fuga(sic):

    ### 有報キャッチャーの閲覧 ###
    start = time.time()
    print(sic)

    url = 'http://resource.ufocatch.com/atom/edinet/query/'+str(sic) + '0' 
    r = requests.get(url)

    soup = BeautifulSoup( r.text,'html.parser')
    tbl = soup.find_all("entry")

    if len(tbl) > 0:print("処理を開始します")
    ## 本処理:XBRLをダウンロードしてファイルをパースして値を取得 [後編に続く] ##    

    time.sleep(3)
    e_time = time.time() - start
    print ("endpoint_time:{0}".format(e_time) + "[sec]")


def fn_hoge(sc):

    ### 取得銘柄リストの生成###

    #JPXの東証上場一覧のページへのアクセス
    url= 'https://www.jpx.co.jp/markets/statistics-equities/misc/tvdivq0000001vg2-att/data_j.xls'
    os.system('wget '+ str(url)+' -O data_j.xls -a wget-log')

    ## pandasでexcelファイルの読み込みとdf整形など
    df = pd.read_excel( "data_j.xls" ) 
    df.columns = ['date','code','name','lst','sectorCode','sectorName', 'flr1', 'flr2', 'flr3', 'flr4']
    drop_col = ['flr1', 'flr2', 'flr3', 'flr4'] 
    df = df.drop(drop_col , axis=1) 
    df = df[df['sectorCode'] !='-']
    df = df[df['lst'] !='PRO Market']

    ec = sc+100
    df = df[df['code'] >=sc]
    df = df[df['code'] <=ec]
    lst = [i for i in df['code']]
    print( lst )
    x =[fn_fuga(sic) for sic in lst]
    print(len(lst))
# main
if __name__ == '__main__':

    total_star = time.time()

    sc = 1301
    if len(str(sc))==4:fn_hoge(sc)

    elapsed_time = time.time() - total_star
    print ("total_time:{0}".format(elapsed_time) + "[sec]")

 有価証券報告書のXBRLファイルを取得してパースしたい場合は、有報キャッチャーにて取得可能です。(他のサイトだと、日経電子版の各銘柄ページのリリース状況にEDINET提出書類としてpdfとXBRLファイルが置いてあります)

 有報キャッチャーのatomのURLで、企業コード(=証券コード+'0'の5桁のコード)を指定してあげると、該当銘柄の提出書類のXBRLやpdfのURL一覧が閲覧可能。例えば1301極洋の提出書類を閲覧したい場合は、「13010」で閲覧可能。

 仮に存在しない証券コード(例えば13020など)を指定してatomのURLを実行しても、スカスカの結果が変えるだけ、entryタグが存在しないなので、普通に1301から9999までrange(1301,9999)でforループを実行しても問題ないかと思うけれど、存在しないコードをわざわざ検索しにいくのも無駄といえば無駄なので、上記スクリプトでは最初に東証HPにて公開されている月次の上場会社一覧エクセルファイルをwgetで取得して、pandasでread_excel()でdfを生成した上で、ループ処理で有報キャッチャーatom_URLを閲覧しにいっています。

 なお東証HPにて公開されている月次の上場会社一覧エクセルファイルは、J-REITやETF、インフラファンドなども含まれているので、上記ではSectorCode='-'でそれら銘柄を除外し、なおかつPROマーケット銘柄も市場名で判定して除外しております。