前回Webページのスクレイピングまでできたので今回は株価のスクレイピングを試します。
株探のページ情報
URL
ソース(一部)
<div id="kobetsu_left"> <dl> <dt>前日終値</dt> <dd class="floatr">3,340.0 (<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"> </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"> </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"> </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"> </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())