[Python] RoboBrowserを使ってみる (2)

こちらの記事の続きです。

robobrowser Pythonでwebスクレイピングを行うためのライブラリです。 セッション部分にはrequestが、HTML部分にはbeautifulsoupが内部で対応しています。 とてもコードは書きやすいですが、robobrowser==0...

今回は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