本次实践是抓取了雅虎财经的成分股数据,该数据是美股各大公司历年来的股票价格,具体包括开盘价,收盘价,最高最低价格。利用这些数据制作了一个图形界面,方便打印出各个时间段的图表。最终具体表现形式如下:
一、制作图形界面
首先创建一个StockFrame类,这个类关于图形界面,里面包含多个函数,所有在图形界面上的操作均在内部定义,内部基本分为 画图形界面、载入数据、选择操作、点击操作等.
本文中图形界面主要包含了 状态栏、textField、列表框、按钮等元素,UI界面是用wxpython制作的,也有其他图形界面的库,如果有这方面需求的可以深入了解下,具体代码上传到了github。
二、获取雅虎财经数据
由于雅虎财经采用动态加载,无法直接读取是获取不了数据的,需要使用自动化工具驱动浏览器来获取数据。数据获取的代码如下:
采用自动化工具驱动谷歌浏览器
driver = webdriver.Chrome()
driver.get('https://finance.yahoo.com/quote/%5EDJA')
找到并自动点击Components项
element = driver.find_element_by_link_text('Components')
webdriver.ActionChains(driver).click(element).perform()
time.sleep(5)
转码
dStr = driver.page_source.encode('utf-8')
正则表达式获取成分股中所需要的参数
m = re.findall(r'<td class="Py.*?><.*?>(.*?)</a></td>.*?>(.*?)</td>.*?>(.*?)</td>.*?</tr>', dStr)
if m:
print m
print len(m)
top.setData(m)
else:
wx.MessageBox('Download failed.', 'Message', wx.OK | wx.ICON_INFORMATION)
driver.close()
思路就是利用Selenium模块中的webdriver自动化工具来进入网页,
然后利用正则表达式获取所需要的参数,这里我们需要的是公司缩写、全称以及当前股价,如下图所示:
如果直接用网页获取源代码,是得不到以上几个数据的,转码后打印dStr,得到我们需要解析的数据是:
< td class ="Py(10px) Ta(start)" > < a href="/quote/ED?p=ED" class ="C($actionBlue) Cur(p) Td(u)" title="ED" > ED < / a > < / td > < td class ="Py(10px) Ta(start) Pstart(35px)" > Consolidated Edison, Inc.< / td > < td class ="Py(10px) W(16%)" > 78.53 < / td > < td class ="Py(10px)
W(16%)" > -0.05 < / td > < td class ="Py(10px) W(16%)" > < span class ="Trsdu(0.3s) C($dataRed)" > -0.06 % < / span > < / td > < td class ="Py(10px) W(16%)" > 1, 578, 790 < / td > < / tr > < tr class ="BdT Bdc($lightGray) Ta(end) Fz(s) W(12%)" >
三、将数据载入图形界面中
将数据放入设定好的位置
def setData(self, data):
self.list.ClearAll()
self.list.InsertColumn(0, "Symbol")
self.list.InsertColumn(1, "Name")
self.list.InsertColumn(2, "Last Trade")
pos = 0
for row in data:
pos = self.list.InsertStringItem(pos + 1, row[0])
self.list.SetStringItem(pos, 1, row[1].replace("&", "&"))
self.list.SetColumnWidth(1, -1)
self.list.SetStringItem(pos, 2, row[2])
if (pos % 2 == 0):
self.list.SetItemBackgroundColour(pos, (134, 225, 249))
self.FitInside()
pass
四、选择某家公司,便能生成如下界面:
五、根据选择参数制图
制图主要包括两个函数,一个是时间段选择的函数 :
def _wxdate2pydate(date):
import datetime
if date.IsValid():
ymd = map(int, date.FormatISODate().split('-'))
return datetime.date(*ymd)
else:
return None
另外就是图表制作的函数:
#code:公司代码;start, end:起止时间;list:所需要显示的指标
def PlotData(code, start, end, list):
start_date = _wxdate2pydate(start)
end_date = _wxdate2pydate(end)
#根据公司代码,起止时间得到所有数据
quotes = quotes_historical_yahoo_ochl(code, start_date, end_date)
fields = ['date', 'open', 'close', 'high', 'low', 'volume']
list1 = []
#格式化时间,将时间参数放入list1列表
for i in range(0, len(quotes)):
x = date.fromordinal(int(quotes[i][0]))
y = datetime.strftime(x, '%Y-%m-%d')
list1.append(y)
print list1
#根据数据,时间列表,所有指标生成dataFrame
quotesdf = pd.DataFrame(quotes, index=list1, columns=fields)
#剔除date数据,这里是因为格式不一致
quotesdf = quotesdf.drop(['date'], axis=1)
quotesdftemp = pd.DataFrame()
#将所选择的指标,如close,open的dateFrame赋予一个临时dateFrame中
for i in range(0, len(list)):
quotesdftemp[list[i]] = quotesdf[list[i]]
print quotesdftemp
print "ready to plot"
#画图
quotesdftemp.plot(marker='o')
plt.show()
dateFrame的表现形式为 :
目的就是为了生成这个表格,并根据这个表格作图 :
代码地址:https://github.com/Kerwin1992/yahooFinance