AB型技術系 主に備忘録

ほぼプログラム関連の備忘録

pythonで株価をスクレイピングする

前回Webページのスクレイピングまでできたので今回は株価のスクレイピングを試します。

freelancer.hatenablog.jp

株価を取得できるサイト

スクレイピングが許可されているサイトを調べてみると下記が見つかりました。

株探

kabutan.jp

みんかぶ

minkabu.jp

この中からページのソースを見て解析しやすそうだった株探から株価を取得することにしました。

株探のページ情報

URL

https://kabutan.jp/stock/?code=銘柄コード

武田薬品工業の株価情報(2021年10月7日時点)

kabutan.jp

武田薬品工業は現在保有中の銘柄です。

ソース(一部)

<div id="kobetsu_left">

<dl>
  <dt>前日終値</dt>
  <dd class="floatr">3,340.0&nbsp;(<time datetime="2021-10-06">10/06</time>)</dd>
</dl>


<h2><time datetime="2021-10-07">10月07日</time></h2>

<table>
  <tbody>
    <tr>
      <th scope="row">始値</th>
      <td>3,200.0</td>
      <td class="mark">&nbsp;</td>
      <td>(<time datetime="2021-10-07T09:03+09:00">09:03</time>)</td>
    </tr>
    <tr>
      <th scope="row">高値</th>
      <td>3,245.0</td>
            <td class="mark">&nbsp;</td>
            <td>(<time datetime="2021-10-07T14:52+09:00">14:52</time>)</td>
    </tr>
    <tr>
      <th scope="row">安値</th>
      <td>3,157.0</td>
            <td class="mark">&nbsp;</td>
            <td>(<time datetime="2021-10-07T09:06+09:00">09:06</time>)</td>
    </tr>
    <tr>
            <th scope="row">終値</th>
                  <td>3,221.0</td>
            <td class="mark">&nbsp;</td>
      <td>(<time datetime="2021-10-07T15:00+09:00">15:00</time>)</td>
    </tr>
  </tbody>
</table>
・
・
・
</div>

始値、高値、安値、終値辺りが取得したい項目

株探の解析

サンプルプログラム

import requests
from bs4 import BeautifulSoup

res = requests.get("https://kabutan.jp/stock/?code=4502")
doc = BeautifulSoup(res.text, "html.parser")
el = doc.select("#kobetsu_left tr")
if el is not None:
    for row in el:
        print(row.select("td"))

selectメソッドにCSSセレクタ("#kobetsu_left tr")を指定して要素を取得します。
取得した要素の中からさらにselectメソッドにCSSセレクタ("td")を指定して取得した要素を出力してみます。

実行結果

[<td>3,200.0</td>, <td class="mark"> </td>, <td>(<time datetime="2021-10-07T09:03+09:00">09:03</time>)</td>]
[<td>3,245.0</td>, <td class="mark"> </td>, <td>(<time datetime="2021-10-07T14:52+09:00">14:52</time>)</td>]
[<td>3,157.0</td>, <td class="mark"> </td>, <td>(<time datetime="2021-10-07T09:06+09:00">09:06</time>)</td>]
[<td>3,221.0</td>, <td class="mark"> </td>, <td>(<time datetime="2021-10-07T15:00+09:00">15:00</time>)</td>]
・
・
・
・

株価部分を含んだ要素が取得できてますね。
この結果からさらに株価部分を取得できれば目的は達成できます。

サンプルプログラム

import requests
from bs4 import BeautifulSoup

res = requests.get("https://kabutan.jp/stock/?code=4502")
doc = BeautifulSoup(res.text, "html.parser")
el = doc.select("#kobetsu_left tr")
if el is not None:
    print("始値" + el[0].select("td")[0].getText())
    print("高値" + el[1].select("td")[0].getText())
    print("安値" + el[2].select("td")[0].getText())
    print("終値" + el[3].select("td")[0].getText())

実行結果

始値3,200.0
高値3,245.0
安値3,157.0
終値3,221.0

必要なデータが無事取得できました。
保有している銘柄コードの配列作ってURLの銘柄コード部分を動的に変えれば保有している銘柄の株価が取得できます。
スクレイピングが許可されているとは言え大量にアクセスすると負荷をかけてしまうので数秒に1回くらいにアクセスするようにする必要はありそうです。