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

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

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'<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自动化工具来进入网页,
然后利用正则表达式获取所需要的参数,这里我们需要的是公司缩写、全称以及当前股价,如下图所示:

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

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

参数图.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的表现形式为 :

image.png

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

image.png

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,607评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,047评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,496评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,405评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,400评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,479评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,883评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,535评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,743评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,544评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,612评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,309评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,881评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,891评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,136评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,783评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,316评论 2 342

推荐阅读更多精彩内容