這部份為運用 Python 進行爬蟲抓取公開資訊觀測站的資料。模擬瀏覽器的行為抓取資料,再將資料依照格式和規格進行處理後,存成關聯式資料庫(SQL)。不過在表單的處理上,多了一些新技巧,以因應 Pandas 套件的改版。
課程名稱
用 Python 理財:打造小資族選股策略:https://bit.ly/2KXR1Nw
對於初學者而言,算是簡易的入門教材。由於 Python 本身的語言特性,相較於 JavaScript 是比較人性化的。外加上已內建不少好用的函式庫,對於資料分析的處理上,用 Python 入門算是滿不錯的。
課程相關文章
輔助套件安裝
隨著表格的欄位數量增加,內建的 Terminal 無法顯示如此多的欄位,這時可以使用 Jupyter Notebook 來協助。你可以在 Anaconda 的沙盒內安裝,並下載 VS Code 的 VS Code Jupyter Notebook Previewer 套件,你就可以在 VS Code 裡使用 Jupyter 的預覽模式,而不用打開特定瀏覽器。
指令
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
import requests import pandas as pd import sqlite3 from io import StringIO url = 'https://mops.twse.com.tw/nas/t21/sii/t21sc03_108_7_0.html' r = requests.get(url) r.encoding = 'big5' dfs = pd.read_html(StringIO(r.text)) # 取得的dfs資料,將 row 的長度介於 6~11 的合併,所以用 concat 擷取 # 運用 for in 方法瀏覽 dfs 裡頭的所有 df,將 df.shape[1] 的長度在 6~11 之內的 row,擷取並組合成一個 # 新的 df,再將這個結果命名為 df df = pd.concat([df for df in dfs if df.shape[1] <= 11 and df.shape[1] > 5]) # 設定欄位名稱 df.columns = df.columns.get_level_values(1) # 將 df 中的當月營收用 .to_numeric 轉成數字,其餘變成 NaN df['當月營收'] = pd.to_numeric(df['當月營收'], errors='coerce') # 將 當月營收欄位中有 NaN 的刪除 df = df[~df['當月營收'].isnull()] # 將 公司代號欄位中,不包含 "合計" 的重新組合成一個新的 dataFrame df = df[df['公司代號'] != '合計'] # 將 公司代號和公司名稱設為 index df = df.set_index(['公司代號', '公司名稱']) # 儲存成 csv 檔 """ df.to_csv('./python_learn/test.csv', encoding='utf_8_sig') """ # 讀取 csv 檔,並指定index 欄位名稱 """ df = pd.read_csv('./python_learn/test.csv', index_col=['公司代號', '公司名稱']) """ # 存取成 sqlite3 檔案 conn = sqlite3.connect('./python_learn/test.sqlite3') #連結資料庫路徑 df.to_sql('monthly_report', conn, if_exists='replace') df = pd.read_sql('select*from monthly_report', conn, index_col=['公司代號', '公司名稱']) print(df) |
參考資料
1. pandas.index.get_level_values 方法
2. pandas.concat() 方法