雅虎财经数据的抓取及图表制作

本次实践是抓取了雅虎财经的成分股数据,该数据是美股各大公司历年来的股票价格,具体包括开盘价,收盘价,最高最低价格。利用这些数据制作了一个图形界面,方便打印出各个时间段的图表。最终具体表现形式如下:

雅虎财经数据的抓取及图表制作_第1张图片
image.png

一、制作图形界面
首先创建一个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' 
  
image.png

如果直接用网页获取源代码,是得不到以上几个数据的,转码后打印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

四、选择某家公司,便能生成如下界面:

雅虎财经数据的抓取及图表制作_第2张图片
参数图.png

五、根据选择参数制图
制图主要包括两个函数,一个是时间段选择的函数 :

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的表现形式为 :

雅虎财经数据的抓取及图表制作_第3张图片
image.png

目的就是为了生成这个表格,并根据这个表格作图 :

雅虎财经数据的抓取及图表制作_第4张图片
image.png

代码地址: https://github.com/Kerwin1992/yahooFinance

你可能感兴趣的:(雅虎财经数据的抓取及图表制作)