python爬取股票最新數據並用excel繪制樹狀圖的示例
大傢好,最近大A的白馬股們簡直 跌媽不認,作為重倉瞭抱團白馬股基金的養雞少年,每日那是一個以淚洗面啊。
不過從金融界最近一個交易日的大盤雲圖來看,其實很多中小股還是紅色滴,綠的都是白馬股們。
以下截圖來自金融界網站-大盤雲圖:
那麼,今天我們試著用python爬取最近交易日的股票數據,並試著用excel簡單繪制以下上面這個樹狀圖。本文旨在拋磚引玉,吼吼。
1. python爬取網易財經不同板塊股票數據
目標網址:
http://quotes.money.163.com/old/#query=hy010000&DataType=HS_RANK&sort=PERCENT&order=desc&count=24&page=0
由於這個爬蟲部分比較簡單,這裡不做過多贅述,僅介紹一下思路並附上完整代碼供大傢參考。
爬蟲思路:
- 請求目標網站數據,解析出主要行業(新)的數據:行業板塊名稱及對應id(如金融,hy010000)
- 根據行業板塊對應id構造新的行業股票數據網頁
- 由於翻頁網址不變,按照《》的裡的套路找到股票列表數據的真實地址
- 代入參數,獲取全部頁數,然後翻頁爬取全部數據
爬蟲代碼:
# -*- coding: utf-8 -*- """ Created Feb 28 10:30:56 2021 @author: 可以叫我才哥 """ import requests import re import pandas as pd # 獲取全部板塊及板塊id url = 'http://quotes.money.163.com/old/#query=hy001000&DataType=HS_RANK&sort=PERCENT&order=desc&count=24&page=0' r = requests.get(url) html = r.text # 替換非字符為空,便於下面的正則 html = re.sub('\s','',html) # 正則獲取 板塊及id所在區域 labelHtml = re.findall(r'</span>主要行業\(新\)</a>(.*?)</span>證監會行業\(新\)',html)[0] # 正則板塊和id,結果為由元組組成的列表 label = re.findall(r'"qid="(hy.*?)"qquery=.*?"title="(.*?)">',labelHtml) # 轉化為dataframe類型 dfLabel = pd.DataFrame(label,columns=['id','板塊']) # 根據板塊id和翻頁獲取頁面數據(json格式) def get_json(hy_id, page): query = 'PLATE_IDS:' + str(hy_id) params={ 'host': 'http://quotes.money.163.com/hs/service/diyrank.php', 'page': page, 'query': query, 'fields': 'NO,SYMBOL,NAME,PRICE,PERCENT,UPDOWN,FIVE_MINUTE,OPEN,YESTCLOSE,HIGH,LOW,VOLUME,TURNOVER,HS,LB,WB,ZF,PE,MCAP,TCAP,MFSUM,MFRATIO.MFRATIO2,MFRATIO.MFRATIO10,SNAME,CODE,ANNOUNMT,UVSNEWS', #你可以不用這麼多字段 'sort': 'PERCENT', 'order': 'desc', 'count': '24', 'type': 'query', } url = 'http://quotes.money.163.com/hs/service/diyrank.php?' r = requests.get(url,params=params) j = r.json() return j # 空列表用於存取每頁數據 dfs = [] # 遍歷全部板塊 for hy_id,板塊 in dfLabel.values: # 獲取頁數 j = get_json(hy_id, 0) pages = j['pagecount'] for page in range(pages): j = get_json(hy_id, page) data = j['list'] df = pd.DataFrame(data) df['板塊'] = 板塊 dfs.append(df) print(f'已爬取{len(dfs)}個板塊數據') result = pd.concat(dfs)
2. excel樹狀圖
excel樹狀圖是在office2016級之後版本中新加的圖表類型,想要繪制需要基於此版本及之後的版本哦。
2.1. 簡單的樹狀圖
簡單的樹狀圖繪制流程:框選數據—>插入—>圖表—>選中樹狀圖 即可。
以下圖為例,在樹狀圖中,每個色塊代表一個省份,色塊面積大小則由其GDO值大小決定。
2.2. 帶有增長率的樹狀圖
我們發現,在基礎的樹狀圖中,色塊顏色除瞭區別色塊之外並沒有其他特殊含義。拿GDP來說,除瞭值之外我們一般也會去看其增長率,那麼是否可以讓色塊顏色和增長率有關聯呢?
下面我們試著探究一下,如果成功的話,那麼金融界的大盤雲圖似乎也可以用excel樹狀圖來進行繪制瞭不是!
思路:
- 我們希望色塊顏色能代表增長率,比如紅色是上漲,綠色是下降且顏色越深代表絕對值越大
- 再對每個色塊進行對應的顏色填充即可
由於 樹狀圖頂多支持多級,色塊顏色也隻能手動單一填充,怎麼辦呢?既然手動可以,那麼其實就可以用VBA自動化這個過程咯。
2.3.1. 增長率配色
基於思路1,我們需要對增長率進行配色,最簡單的就是用條件格式裡的色階。
框選增長率數據—>開始—>條件格式—>色階(選中那個讓值越大顏色越紅的,由於這裡有負增長率,所以選瞭帶紅綠的):
為瞭更好的展示區分正負增長率,我們在設置完色階後再進行管理規則:
- 我們將中間值設為數字0,這樣負增長率就是綠色,正增長率就是紅色;
- 我們將最大值設置為百分點值80,也就是增長率前80%的值都是最紅的。
最終配色效果:
2.3.2. VBA填充色塊顏色
先看效果:
湖北因為收到疫情影響最大,有接近小半年屬於封省狀態,全年增長率為負數。
由於條件格式下單元格顏色是不固定的無法通過vba獲取,我們需要將顏色賦值到新的一列中去,需要用到如下操作:
**選中增長率數據復制,然後點擊剪切板最右下角會出現剪貼板,再鼠標左鍵選擇需要粘貼的地方如E2,點擊剪貼板中需要粘貼的數據即可。**這個時候,被粘貼的單元格區域的顏色就是固定的瞭,你可以選擇刪除數據隻留顏色部分。
VBA思路:
激活需要操作的圖表(Activate)
遍歷全部的系列和數據點(ActiveChart.FullSeriesCollection(1).Points.Count)
從第一個數據點開始,獲取對應增長率單元格顏色(ActiveSheet.Range(“E” & i + 1).Interior.Color)
將單元格賦值給該數據點(Selection.Format.Fill.ForeColor.RGB)
VBA代碼:
Sub My_Color() ActiveSheet.ChartObjects("圖表 1").Activate '遍歷全部的數據點 For i = 1 To ActiveChart.FullSeriesCollection(1).Points.Count '選中數據點 ActiveChart.FullSeriesCollection(1).Points(i).Select '獲取單元格顏色 MyColor = ActiveSheet.Range("E" & i + 1).Interior.Color '將單元格顏色賦值給對應數據點填充色 Selection.Format.Fill.ForeColor.RGB = MyColor Next End Sub
執行腳本過程如下:
好瞭,以上就是本次全部內容,大傢可以試著爬取股票數據,然後試著繪制一下。
溫馨提示:接近小5000股票數據,vba填充色塊顏色會卡死,不建議全選操作。
以上就是python爬取股票最新數據並用excel繪制樹狀圖的示例的詳細內容,更多關於python 爬取股票數據並繪圖的資料請關註WalkonNet其它相關文章!
推薦閱讀:
- Python獲取時光網電影數據的實例代碼
- Python爬蟲學習之requests的使用教程
- 用Python爬取各大高校並可視化幫弟弟選大學,弟弟直呼牛X
- Python利用百度地圖獲取兩地距離(附demo)
- Python爬蟲之自動爬取某車之傢各車銷售數據