「退屈なことはPythonにやらせよう」という本を読んだので、Webスクレイピングに挑戦しています。
以前の記事で生まれて初めてのスクレイピングに挑戦してみたのですが、なかなかうまく行きませんでした。今回は、前回のテーマは一旦おいておいて、Yahoo!ファイナンスから企業の株価データを取得してみたいと思います。
赤枠で囲ったあたりのデータを取得したい。
環境
まずはいつもどおり環境の確認から。
開発用マシンのOSはLinux Mintです。バージョンは、
$ lsb_release -r Release: 17.2
次に、Pythonのバージョンを確認します。「退屈なことはPythonにやらせよう」はPython3を前提として書かれているため、Python3がインストールされているか確認します。
$ Python3 --version Python 3.4.3
HTMLコードの解析
スクリプトを書く前に、対象部分のHTMLコードを確認しておきます。
まずは、「詳細情報」の箇所。
<div class="lineFi clearfix">
<dl class="tseDtlDelay"><dd class="ymuiEditLink mar0"><strong>1,825</strong><span class="date yjSt">(06/26)</span></dd>
<dt class="title">前日終値<a class="tips alignPos" href="https://info.finance.yahoo.co.jp/dictionary/" onMouseOver="showTips('zenjituowarine');" onMouseOut ="hideTips('zenjituowarine');" data-ylk="slk:word;pos:1"><img src="https://s.yimg.jp/images/finance/common/image/btn_yougo.png" onmouseover="this.src='https://s.yimg.jp/images/finance/common/image/btn_yougo_on.png'" onmouseout="this.src='https://s.yimg.jp/images/finance/common/image/btn_yougo.png'"></a>
<span class="tips yjSt" id="zenjituowarine">前営業日、最後の取引値</span></dt>
</dl>
</div>
このあたりを見ていくと、
<
div class=”lineFi clearfix”>の後のタグの値を拾っていけばなんとかなりそうです。参考指標や信用取引情報も同じ感じで行けそうですね。
作ったスクリプト
#! python3
import sys,requests, bs4
res = requests.get('https://stocks.finance.yahoo.co.jp/stocks/detail/?code=' + sys.argv[1])
soup = bs4.BeautifulSoup(res.text,'lxml')
print(soup.select('dd[class="category yjSb"]')[0].getText())
print(soup.select('table[class="stocksTable"] > tr > th[class="symbol"]')[0].getText())
elems = soup.select('div[class="lineFi clearfix"] strong')
for e in elems:
print(e.getText())
elems = soup.select('div[class="lineFi yjMS clearfix"] strong')
for e in elems:
print(e.getText())
elems = soup.select('div[class="lineFi yjMS clearfix"] strong')
for e in elems:
print(e.getText())
elems = soup.select('div[class="yjMS clearfix"] strong')
for e in elems:
print(e.getText())
使い方と実行結果
コマンドラインから引数に企業コードを指定してスクリプトを呼び出します。異常系は考慮していないので存在するコードを指定してください。
$ python3 yahoo.py 2001 食料品 日本製粉(株) 1,825 1,822 1,839 1,819 82,400 150,691 1,425~2,225 150,854 82,524,009 1.64 30.00 (連) 16.30 (連) 1.02 (連) 112.12 (連) 1,784.44 182,800 100 1,863 1,569 9,600 +4,300 25,400 +3,300 150,854 82,524,009 1.64 30.00 (連) 16.30 (連) 1.02 (連) 112.12 (連) 1,784.44 182,800 100 1,863 1,569 9,600 +4,300 25,400 +3,300 0.38
後はこいつをCSVに吐き出す処理を書いて、ループで回してあげれば株価データの一括取得ができそうです。
コメント