Yahooファイナンスの株価を取得してみる

RでYahooファイナンスを取得するモジュール、RFinanceYJを改造し使っていたのですが、あまりの遅さに閉口してしまいました。丸一日掛けても14年分の日次株価は1000銘柄程度しか撮れていません。やり方はこの辺りにまとめています。

http://d.hatena.ne.jp/anagotan/searchdiary?word=%2A%5BR%5D

RaspberryPiを手に入れたこともあり、pythonで書き直してみました。pythonは2.7です

master.py

マスターを取得します 

#!/bin/env python
# coding:utf-8

import urllib
import urllib2
from lxml import etree
import time


def get_stockmaster(hira):
	p=1
	ret="dummy"
	ss=""
	while(ret!=""):
		ret,plen=get_stockmaster_page(hira,p)
		#print ret
		if ret != "":
			ss=ss+ret
		p=p+1
	return ss

def get_stockmaster_page(hira,p):
	hira=hira.encode('utf-8')
	url="http://stocks.finance.yahoo.co.jp/stocks/qi/?%s"
	params={"js":hira,"p":p}
	data=urllib.urlencode(params)
	#print data
	res=urllib.urlopen(url % data)
	page=res.read()
	root=etree.fromstring(page,etree.HTMLParser())
	elem=root.xpath("//a[contains(@href,'/stocks/detail')]")
	i=0
	ret=""
	for ele in elem:
		if ele.text != None:
			if i%3==0:
				ret=ret+ele.text+"\t"
			if i%3==1:
				ret=ret+ele.text.encode('utf-8')+"\n"
		i=i+1
	time.sleep(1)
	return ret,len(elem)

def get_stockmasterall():
	hira=u"あいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよわ"
	size=len(hira)
	ss=""
	for i in range(0,size):
		print hira[i:i+1]
		#print i
		ss=ss+get_stockmaster(hira[i:i+1])
	f=open("data/master.txt","w")
	f.write(ss)
	f.close()

if __name__ == '__main__':
	get_stockmasterall()

hist.py

時系列データを取得します 

#!/bin/env python
# coding:utf-8

import urllib
import urllib2
from lxml import etree
import time


def get_stockdata(code,sy,sm,sd,ey,em,ed,tm):
	p=1
	plen=53
	ss=""
	while(plen>=53):
		ret,plen=get_stockdata_page(code,sy,sm,sd,ey,em,ed,tm,p)
		ss=ss+ret
		p=p+1
	f=open("data/"+code+".txt","w")
	f.write(ss)
	f.close()

def get_stockdata_page(code,sy,sm,sd,ey,em,ed,tm,p):
	url="http://info.finance.yahoo.co.jp/history/?%s"
	params={"code":code,"sy":sy,"sm":sm,"sd":sd,"ey":ey,"em":em,"ed":ed,"tm":tm,"p":p}
	data=urllib.urlencode(params)
	#print data
	res=urllib.urlopen(url % data)
	page=res.read()
	root=etree.fromstring(page,etree.HTMLParser())
	elem=root.xpath("//table")
	
	ret=""
	plen=len(elem[1].xpath("//tr"))
	for tr in elem[1].xpath("//tr"):
		if len(tr.findall("td"))==7:
			str=""
			for td in tr.findall("td"):
				s=td.text.encode('utf-8').replace(',','').replace('年','-').replace('月','-').replace('日','')
				str=str+s+"\t"
			str=str+code
			ret=ret+str+"\n"
	time.sleep(1)
	return ret,plen

def get_stockdata_all(sy,sm,sd,ey,em,ed,tm):
	f=open("data/master.txt")
	lines=f.readlines()
	f.close()
	for line in lines:
		ay=line.split("\t")
		print ay[0]
		get_stockdata(ay[0],sy,sm,sd,ey,em,ed,tm)

if __name__ == '__main__':
	get_stockdata_all("2000","01","01","2014","08","27","d")

やっつけで作成しましたがとりあえずファイルに落とすところまでは確認できました。

ちなみに動作環境はRapberryPITypeB+のRASPBIANVersion:June 2014で動いています