雅虎財經(jīng)數(shù)據(jù)的抓取及圖表制作

本次實踐是抓取了雅虎財經(jīng)的成分股數(shù)據(jù)蝌麸,該數(shù)據(jù)是美股各大公司歷年來的股票價格拔第,具體包括開盤價,收盤價聊替,最高最低價格楼肪。利用這些數(shù)據(jù)制作了一個圖形界面,方便打印出各個時間段的圖表惹悄。最終具體表現(xiàn)形式如下:

image.png

一春叫、制作圖形界面
首先創(chuàng)建一個StockFrame類,這個類關(guān)于圖形界面泣港,里面包含多個函數(shù)暂殖,所有在圖形界面上的操作均在內(nèi)部定義,內(nèi)部基本分為 畫圖形界面当纱、載入數(shù)據(jù)呛每、選擇操作、點擊操作等.
本文中圖形界面主要包含了 狀態(tài)欄坡氯、textField晨横、列表框、按鈕等元素箫柳,UI界面是用wxpython制作的手形,也有其他圖形界面的庫,如果有這方面需求的可以深入了解下悯恍,具體代碼上傳到了github库糠。

二、獲取雅虎財經(jīng)數(shù)據(jù)
由于雅虎財經(jīng)采用動態(tài)加載涮毫,無法直接讀取是獲取不了數(shù)據(jù)的瞬欧,需要使用自動化工具驅(qū)動瀏覽器來獲取數(shù)據(jù)。數(shù)據(jù)獲取的代碼如下:

采用自動化工具驅(qū)動谷歌瀏覽器
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)
轉(zhuǎn)碼
dStr = driver.page_source.encode('utf-8')
正則表達(dá)式獲取成分股中所需要的參數(shù)
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自動化工具來進(jìn)入網(wǎng)頁罢防,
然后利用正則表達(dá)式獲取所需要的參數(shù)艘虎,這里我們需要的是公司縮寫、全稱以及當(dāng)前股價咒吐,如下圖所示:

image.png

如果直接用網(wǎng)頁獲取源代碼野建,是得不到以上幾個數(shù)據(jù)的,轉(zhuǎn)碼后打印dStr渤滞,得到我們需要解析的數(shù)據(jù)是:
< 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%)" >

三贬墩、將數(shù)據(jù)載入圖形界面中

將數(shù)據(jù)放入設(shè)定好的位置
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

四、選擇某家公司妄呕,便能生成如下界面:

參數(shù)圖.png

五陶舞、根據(jù)選擇參數(shù)制圖
制圖主要包括兩個函數(shù),一個是時間段選擇的函數(shù) :

def _wxdate2pydate(date):
    import datetime
    if date.IsValid():
        ymd = map(int, date.FormatISODate().split('-'))
        return datetime.date(*ymd)
    else:
        return None

另外就是圖表制作的函數(shù):

#code:公司代碼绪励;start, end:起止時間肿孵;list:所需要顯示的指標(biāo)
def PlotData(code, start, end, list):
    start_date = _wxdate2pydate(start)
    end_date = _wxdate2pydate(end)
    #根據(jù)公司代碼唠粥,起止時間得到所有數(shù)據(jù)
    quotes = quotes_historical_yahoo_ochl(code, start_date, end_date)
    fields = ['date', 'open', 'close', 'high', 'low', 'volume']
    list1 = []
    #格式化時間,將時間參數(shù)放入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
    #根據(jù)數(shù)據(jù)停做,時間列表晤愧,所有指標(biāo)生成dataFrame
    quotesdf = pd.DataFrame(quotes, index=list1, columns=fields)
    #剔除date數(shù)據(jù),這里是因為格式不一致
    quotesdf = quotesdf.drop(['date'], axis=1)
    quotesdftemp = pd.DataFrame()
    #將所選擇的指標(biāo)蛉腌,如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的表現(xiàn)形式為 :

image.png

目的就是為了生成這個表格官份,并根據(jù)這個表格作圖 :

image.png

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市烙丛,隨后出現(xiàn)的幾起案子舅巷,更是在濱河造成了極大的恐慌,老刑警劉巖河咽,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件钠右,死亡現(xiàn)場離奇詭異,居然都是意外死亡忘蟹,警方通過查閱死者的電腦和手機(jī)飒房,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來媚值,“玉大人狠毯,你說我怎么就攤上這事≡友” “怎么了垃你?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵椅文,是天一觀的道長喂很。 經(jīng)常有香客問我,道長皆刺,這世上最難降的妖魔是什么少辣? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮羡蛾,結(jié)果婚禮上漓帅,老公的妹妹穿的比我還像新娘。我一直安慰自己痴怨,他們只是感情好忙干,可當(dāng)我...
    茶點故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著浪藻,像睡著了一般捐迫。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上爱葵,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天施戴,我揣著相機(jī)與錄音反浓,去河邊找鬼。 笑死赞哗,一個胖子當(dāng)著我的面吹牛雷则,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播肪笋,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼月劈,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了藤乙?” 一聲冷哼從身側(cè)響起艺栈,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎湾盒,沒想到半個月后湿右,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡罚勾,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年毅人,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片尖殃。...
    茶點故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡丈莺,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出送丰,到底是詐尸還是另有隱情缔俄,我是刑警寧澤,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布器躏,位于F島的核電站俐载,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏登失。R本人自食惡果不足惜遏佣,卻給世界環(huán)境...
    茶點故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望揽浙。 院中可真熱鬧状婶,春花似錦、人聲如沸馅巷。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽钓猬。三九已至稍刀,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間逗噩,已是汗流浹背掉丽。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工跌榔, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人捶障。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓僧须,卻偏偏與公主長得像,于是被迫代替她去往敵國和親项炼。 傳聞我的和親對象是個殘疾皇子担平,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,037評論 2 355

推薦閱讀更多精彩內(nèi)容