エンジニアリングとお金の話

都内で働くエンジニアの日記です。

【技術】yahooファイナンスの株価を取得するツールを作成した

【SPONSORED LINK】

以前作成した、yahooファイナンスの株価をダンロードするツールを動かしてみたら全然動かなくなっていたので手直しをしてみた。
※以前の記事はこちら
http://hatakazu.hatenablog.com/entry/2012/06/28/081734

#-*- coding:utf-8 -*-
import re
import requests
from BeautifulSoup import BeautifulSoup

""" yahoo finance get stockPrice """
def stockPriceDict(code,startDay,endDay):
    url="http://info.finance.yahoo.co.jp/history/?code=%s&sy=%s&sm=%s&sd=%s&ey=%s&em=%s&ed=%s&tm=d&p=%s"
    stockDay=[]
    startPrice=[]
    highPrice=[]
    lowPrice=[]
    endPrice=[]
    volume=[]
    loop=1

    while True:
        bs=BeautifulSoup(requests.get(url % (code,str(startDay)[0:4],str(startDay)[4:6],str(startDay)[6:8],str(endDay)[0:4],str(endDay)[4:6],str(endDay)[6:8],loop)).text)

        if len(bs.findAll("td")[3:]) == 0 or len(bs.findAll("td")[3:]) == 1:
            break

        for num,line in enumerate(bs.findAll("td")[3:]):
            if str(line).find("width") == -1:
                if num % 7 == 0:
                    re1=re.compile(r"(\d{4})年(\d{1,2})月(\d{1,2})日")
                    yyyymmdd="".join([re1.search(line.text.encode("utf-8")).group(i).zfill(2) for i in range(1,4)]) 
                    stockDay.append(yyyymmdd)
                elif num % 7 == 1:
                    startPrice.append(line.text.encode("utf-8"))
                elif num % 7 == 2:
                    highPrice.append(line.text.encode("utf-8"))
                elif num % 7 == 3:
                    lowPrice.append(line.text.encode("utf-8"))
                elif num % 7 == 4:
                    endPrice.append(line.text.encode("utf-8"))
                elif num % 7 == 5:
                    volume.append(line.text.encode("utf-8"))
            else:
                loop += 1
                break
        return {"stockDay":stockDay, "startPrice":startPrice, "highPrice":highPrice, "lowPrice":lowPrice, "endPrice":endPrice, "volume":volume}

if __name__ == '__main__':
    code=7203
    print stockPriceDict(code,20150601,20150701)

ちょっと困ったのが、対象日(例:2015年7月22日)の数字部分のみを正規表現で取得しようとして

re1=re.compile(r"(\d{4}).(\d{1,2}).(\d{1,2}).")

と書いてみたがうまく動かず、

re1=re.compile(r"(\d{4})年(\d{1,2})月(\d{1,2})日")

と書いたらうまく動いた。正規表現てよくわからんなー