標籤: 獲取載入

圖片來源:郭耀仁 from DATAINPOINT
按下訂閱鈕透過電子郵件收到我的文章🎉
關於 Pandas
Pandas 套件全名 Panel DataFrame Series,很多人常用熊貓作為暱稱,但實際上命名的意義和緣由與熊貓八竿子打不著關係。Pandas 套件提供了新的資料結構類別 Index、Series、DataFrame 與 Panel(其中 Panel 資料結構類別在 0.20.0 停止開發維護,)扮演著 Python 在資料分析中的「最後一塊拼圖」;當使用者有表格式資料(Tabular data)的運算處理需求時,就可以透過她達成目的,另外她也提供了豐富的表格式資料載入、整併清理、轉換外型與視覺化的函式。
關於網頁爬蟲
網站爬蟲的核心任務可以簡單區分為兩個,依序是請求資料(requesting data)與解析資料(parsing data),慣常在學習網頁爬蟲時,會需要先暸解 HTTP 請求、瀏覽器開發者工具(Developer Tools)以及初階的網頁前端知識(HTML 與 CSS),接著才是認識 Python 的 Requests、BeautifulSoup4、xml 與 json 等套件,但是這樣的學習路徑有些漫長,對於初學者來說是比較吃力又不討好的。
不過在 Pandas 的表格式資料載入功能中,read_html 是一個能夠從 HTML 文件中將 <table></table> 標記中的資料以 DataFrame 類別擷取出來的函式,在不清楚請求資料與解析資料的狀況下,使用這個函式是完成某些網頁爬蟲需求的一個替代方案。
盤中零股交易
以往台灣股市的零股交易是屬於盤後交易,在每個交易日的下午 1 點 40 分到 2 點半進行,並於下午 2 點半集合競價撮合,成交機會只有一次;而盤中零股交易在 2020 年 10 月 26 日正式上路,未來在盤中時段上午 9 點到下午 1 點半都可以進行零股交易,盤後零股交易的機制也維持運作。
想要開始挑選標的進行盤中零股交易嗎?Yahoo! 奇摩股市提供不少關於基本面的資訊,這些資訊都是記錄在 HTML 文件的 <table></table> 標記之中,使用 Pandas 中的 read_html 函式可以在網頁爬蟲零基礎的前提下快速獲得這些資訊。
以上市行情類排行榜:單日成交價排行的頁面為例,只需要將網址輸入 pd.read_html 函式就能夠將 HTML 文件中所有的表格都擷取出來。
rank_url = "https://tw.stock.yahoo.com/d/i/rank.php?t=pri&e=TAI&n=100"
html_tables = pd.read_html(rank_url, encoding='big5')
print(len(html_tables)) # 頁面中有幾組 <table></table> 標記
值得注意的地方是,HTML 文件中的 <table></table> 標記不一定只有一組,所以 read_html 函式所回傳的輸出會將多個 DataFrame 存在一個 list 之中,而每個 DataFrame 就各自對應一組 <table></table> 標記,運用 len 函式檢視,找出所需要的資料框。
html_tables[4] # 所需要的資料框
再以個股基本營收盈餘的頁面為例,只需要將網址輸入 pd.read_html 函式就能夠將 HTML 文件中所有的表格都擷取出來。
earnings_url = "https://tw.stock.yahoo.com/d/s/earning_2330.html"
html_tables = pd.read_html(earnings_url, encoding='big5')
print(len(html_tables)) # 頁面中有幾組 <table></table> 標記
同樣由於有多組 <table></table> 標記,使用索引值將所需要的資料框找出。
html_tables[4] # 所需要的資料框
html_tables[7] # 所需要的資料框
html_tables[10] # 所需要的資料框
專案簡介
在這個專案中,我們打算使用 Pandas 中的函式 read_html 將 HTML 文件中的 <table></table> 資料擷取成為 DataFrame,以 Yahoo! 奇摩股市的兩個頁面為例。點選連結可以在瀏覽器開啟互動 Jupyter Notebook 查看完整程式碼以及專案細節:https://mybinder.org/v2/gh/datainpoint/project-web-scraping-with-pandas/master?filepath=project-web-scraping-with-pandas.ipynb
如果希望多寫哪些題材,留言和我說👇