読者です 読者をやめる 読者になる 読者になる

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

都内で働くエンジニアの日記です。投資と技術の話題がメインです。

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

技術

以前作成した、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})日")

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

広告を非表示にする