こちらの記事の続きです。
今回はRoboBrowserを使って、みんかぶから現在株価と目標株価を取得してみます。
インポートとインスタンスの生成
robobrowserをインポートして、インスタンスを作成します。
>>> from robobrowser import RoboBrowser >>> br = RoboBrowser(parser='html.parser') >>> br.open('https://minkabu.jp/stock/') >>> br ‹RoboBrowser url=https://minkabu.jp/stock/›
検索フォームへの入力と検索の実行
実際にブラウザでページを開いてhtmlのソースを見ながら、フォームへの入力と検索の実行をコードに落とし込みます。まずは、時価総額一位のトヨタ、証券コード’7203’で検索をすることにします。
>>> form = br.get_form(action='/stock/find') >>> form['stock_find[name_or_code]'] = 7203 >>> br.submit_form(form) >>> br ‹RoboBrowser url=https://minkabu.jp/stock/7203?q=7203›
取得したい部分の選択と算出
取得したページを確認します。
>>> src = str(br.parsed) >>> src # 長いので省略
長いのでテキストファイルに保存して確認します。
>>> with open('src.txt', mode='w', encoding='UTF-8') as f: ... f.write(src) ... 104171
テキストファイルで取得したい箇所の前後が確認できたので、正規表現を使って取得します。
現在株価を取得します。
>>> import re >>> start = '\n' >>> end = '\.' >>> cur_price = re.search('{}(.*){}'.format(start, end), src).group(1) >>> cur_price = cur_price.replace(',', '') >>> cur_price ' 6500'現在株価の小数点部分を取得します。
>>> start = '\.' >>> end = '\n円' >>> cur_price_dec = re.search('{}(.*){}'.format(start, end), src).group(1) >>> cur_price_dec '0'現在株価を算出します。
>>> cur_price = float(cur_price + '.' + cur_price_dec) >>> cur_price 6500.0目標株価を取得します。
>>> start = '' >>> end = '円' >>> target_price = re.search('{}(.*){}'.format(start, end), src).group(1) >>> target_price = float(target_price.replace(',', '')) >>> target_price 7138.0タイムスタンプの設定と出力の整形
取得したい情報は無事に取得できたので、取得時間のタイムスタンプを設定して、出力情報を整形します。
>>> import time >>> import datetime >>> timestamp = time.time() >>> str_date = datetime.datetime.fromtimestamp(timestamp).strftime('%Y/%m/%d %H:%M:%S') >>> result = '取得日時:{} 現在株価:{} 目標株価:{} 差:{}'.format(str_date, cur_price, target_price, cur_price-target_price) >>> result '取得日時:2019/05/22 13:26:55 現在株価:6500.0 目標株価:7138.0 差:-638.0'関数にまとめる
良い感じでできるようなので、今までのコードを関数としてまとめます。
import datetime import re import time from robobrowser import RoboBrowser def prepare_browser(): br = RoboBrowser(parser='html.parser') return br def get_stock_diff_target_and_cur(br, code): br.open('https://minkabu.jp/stock/') form = br.get_form(action='/stock/find') form['stock_find[name_or_code]'] = code br.submit_form(form) src = str(br.parsed) start = '<div class="stock_price">\n' end = '\.<span class="decimal">' cur_price = re.search('{}(.*){}'.format(start, end), src).group(1) cur_price = cur_price.replace(',', '') start = '\.<span class="decimal">' end = '</span>\n<span class="stock_price_unit">円</span>' cur_price_dec = re.search('{}(.*){}'.format(start, end), src).group(1) cur_price = float(cur_price + '.' + cur_price_dec) start = '<div class="md_target_box_price">' end = '<span class="decimal">円</span></div>' target_price = re.search('{}(.*){}'.format(start, end), src).group(1) target_price = float(target_price.replace(',', '')) timestamp = time.time() str_date = datetime.datetime.fromtimestamp(timestamp).strftime('%Y/%m/%d %H:%M:%S') result = '取得日時:{} 現在株価:{} 目標株価:{} 差:{}'.format(str_date, cur_price, target_price, cur_price-target_price) return result dic_stocks = {7203: 'トヨタ', 9984: 'SBG', 9432: 'NTT', 9437: 'NTTドコモ'} br = prepare_browser() for code, name in dic_stocks.items(): print(name, get_stock_diff_target_and_cur(br, code))例えば、 {7203: ‘トヨタ’, 9984: ‘SBG’, 9432: ‘NTT’, 9437: ‘NTTドコモ’} という辞書でループを回すと以下のような結果を出力します。
トヨタ 取得日時:2019/05/22 13:33:02 現在株価:6501.0 目標株価:7138.0 差:-637.0 SBG 取得日時:2019/05/22 13:33:03 現在株価:10800.0 目標株価:11502.0 差:-702.0 NTT 取得日時:2019/05/22 13:33:04 現在株価:4958.0 目標株価:5073.0 差:-115.0 NTTドコモ 取得日時:2019/05/22 13:33:05 現在株価:2549.5 目標株価:2842.0 差:-292.5