見出し画像

Beautiful Soupで日経平均の「昨日の終値」をスクレイピングしてみた

(1)まずはインストールから

pip3 install beautifulsoup4
pip3 install requests

(2)スクレイピングするサイトを決める

今回はみんなの株式における「昨日の終値」を取ってくることにしましょう。

まずはスクレイピングしたいURLを定義します。

url='https://minkabu.jp/stock/100000018/daily_bar'
r=requests.get(url)​

ここでrに何が入ったか、確認してみましょう。

r.text

そうすると、以下のようなソースコードが出てきます。

そこで、見やすく、変換するために、以下のコードを書きましょう。

soup=BeautifulSoup(r.text,'html.parser')
soup

美しいスープという意味のBeautifulSoup。これを書くと・・・。

一気に見やすくなった・・・!ここで取り出したい箇所を確認します。

これをとる時にまずやることはこの近辺のソースコードの確認です。Chromeで開き、該当の数字を選択し、右クリックして検証を押しましょう。

そうすると、この箇所の構造が以下のようになっていることがわかります。

tr,tdはテーブル構造を意味します。テーブル構造は表を描画するときに使うhtmlです。確かに元のサイトを見ると、表の中に数字が入っている形式になっていますね。さらに、tdの中にclass="num"というクラスが指定されていることがわかります。ですが、numというクラスが使われている箇所は最初のtdの中だけで全部で5箇所あるみたいですね。

Beautiful Soup4では、ある箇所を指定して抜き出すという機能があります。早速、tdの中でnumというクラスが書かれている箇所を抜き出してみましょう。

closing_pricelist=soup.select('td.num')
closing_pricelist

こんな風に書くと、numクラスが書かれている箇所のhtmlを全て引っ張ってくることができます。実際に叩いてみると以下のようになります。

[<td class="num">20,578.67</td>,
<td class="num">20,694.35</td>,
<td class="num">20,554.16</td>,
<td class="num">20,649.14</td>,
<td class="num">20,649.14</td>,
<td class="num">20,581.58</td>,
<td class="num">20,662.23</td>,
<td class="num">20,578.02</td>,
<td class="num">20,625.16</td>,
<td class="num">20,625.16</td>,
<td class="num">20,625.75</td>,
<td class="num">20,667.56</td>,
<td class="num">20,614.29</td>,
<td class="num">20,620.19</td>,
<td class="num">20,620.19</td>,
<td class="num">20,641.49</td>,
<td class="num">20,748.35</td>,
<td class="num">20,633.30</td>,
<td class="num">20,704.37</td>,
<td class="num">20,704.37</td>,
<td class="num">20,500.50</td>,
<td class="num">20,520.68</td>,
<td class="num">20,361.12</td>,
<td class="num">20,460.93</td>,
<td class="num">20,460.93</td>,
<td class="num">20,474.31</td>,
<td class="num">20,511.21</td>,
<td class="num">20,433.31</td>,
<td class="num">20,479.42</td>,
<td class="num">20,479.42</td>,
<td class="num">20,467.22</td>,
<td class="num">20,529.94</td>,
<td class="num">20,439.92</td>,
<td class="num">20,456.08</td>,
<td class="num">20,456.08</td>,
<td class="num">20,325.44</td>,
<td class="num">20,329.01</td>,
<td class="num">20,173.76</td>,
<td class="num">20,261.04</td>,
<td class="num">20,261.04</td>,
<td class="num">20,579.98</td>,
<td class="num">20,719.31</td>,
<td class="num">20,579.98</td>,
<td class="num">20,710.91</td>,
<td class="num">20,710.91</td>,
<td class="num">20,706.07</td>,
<td class="num">20,731.19</td>,
<td class="num">20,584.29</td>,
<td class="num">20,628.01</td>,
<td class="num">20,628.01</td>,
<td class="num">20,489.97</td>,
<td class="num">20,626.05</td>,
<td class="num">20,482.62</td>,
<td class="num">20,618.57</td>,
<td class="num">20,618.57</td>,
<td class="num">20,605.35</td>,
<td class="num">20,684.06</td>,
<td class="num">20,582.01</td>,
<td class="num">20,677.22</td>,
<td class="num">20,677.22</td>,
<td class="num">20,590.47</td>,
<td class="num">20,633.90</td>,
<td class="num">20,502.66</td>,
<td class="num">20,563.16</td>,
<td class="num">20,563.16</td>,
<td class="num">20,323.97</td>,
<td class="num">20,465.71</td>,
<td class="num">20,300.35</td>,
<td class="num">20,418.81</td>,
<td class="num">20,418.81</td>,
<td class="num">20,324.25</td>,
<td class="num">20,419.88</td>,
<td class="num">20,184.85</td>,
<td class="num">20,405.65</td>,
<td class="num">20,405.65</td>,
<td class="num">20,669.99</td>,
<td class="num">20,697.42</td>,
<td class="num">20,581.17</td>,
<td class="num">20,655.13</td>,
<td class="num">20,655.13</td>,
<td class="num">20,432.68</td>,
<td class="num">20,503.38</td>,
<td class="num">20,369.27</td>,
<td class="num">20,455.44</td>,
<td class="num">20,455.44</td>,
<td class="num">20,758.15</td>,
<td class="num">20,782.06</td>,
<td class="num">20,676.92</td>,
<td class="num">20,684.82</td>,
<td class="num">20,684.82</td>,
<td class="num">20,529.29</td>,
<td class="num">20,682.24</td>,
<td class="num">20,462.98</td>,
<td class="num">20,593.35</td>,
<td class="num">20,593.35</td>,
<td class="num">20,548.07</td>,
<td class="num">20,570.19</td>,
<td class="num">20,406.52</td>,
<td class="num">20,516.56</td>,
<td class="num">20,516.56</td>]

これは表の中に書かれている数字が格納されている箇所全てを抜き出しているからですよね。ではこのうち、何個目のものがみんなの株式における「昨日の終値」になるでしょうか。

この4番目のnumクラスの数字が答えだということがわかります。つまり、コードで言うと、以下のコードですね。

<td class="num">20,649.14</td>,

この数字を取ってきたいのですが、プログラムの場合、数字は1からではなく、0から始まります。そのため、4番目の数字は0,1,2,3、で考えると3になるということに注意が必要です。そのため、

closing_price=soup.select('td.num')[3].string

こう書いてあげます。[3]の箇所が配列と言います。td.numで抽出出来た要素のうち、4番目(3+1)の箇所を取ってきてね、という命令ですね。.stringの箇所で文字データとして取ってきてね、という命令をしていることにも注目です。

closing_price

試しにこのように打ってみると、

'20,649.14'

このようになります。今の時点で、このデータは文字列データになっています。文字データということは数字としては認識してくれていません。さらに、20649.14ということは小数点が存在しますのでint型で書いたらエラーになってしまいます。ここはfloat型を使いましょう。さらに、20,649.14の中にはカンマが存在しています。これは文字列であるため、一度外してあげないと数字として扱うことが出来ません。

float(closing_price.replace(',', ''))

そこでこんな風に書くと良いでしょう。replace(',', '')の箇所でカンマを何もないものに置換しています。これによって

20649.14

こういう昨日の終値を取得することができるようになりました。めでたしめでたし。

サポートされた費用は、また別のカンファレンス参加費などに当てようと思います。