一般我們利用 Python 語言作網頁爬蟲工作都會利用套件或程式庫工具,如 BeautifulSoup。但是在某些出現表格形式的資料中,我們可以利用 Python 裡的 DataFrame 來讀取資料。
1. 事前準備
首先我們先找 台灣銀行。要找匯率,按下右上方的 匯率利率
2. 先觀察資料
import pandas as pd
dfs=pd.DataFrame.read_html('rate.bot.com.tw/xrt?Lang=zh-TW')
我們來看這個傳回值的型態和個數:
print('type of dfs: ',type(dfs))
print('length of dfs: ',len(dfs))
傳回來的是
型態是 List,個數只有一個。
取用資料只能用 [0] 來取
先用這兩行指令,來看一下內容:
currency=dfs[0]
print(currency)
最後顯示
這筆資料有 19 列(row) ,每列有 17行(column)
也可以用 .info() 來詳細檢測這筆資料
有 19 筆資料,索引值是 0 到 18
再往下看,資料過多,也有空值(0 non-null)出現
就爬資料的目的來看,每一列(row)我們只要前面 4 行(column) 的資料就夠了,其他的可以不用抓。
3. 程式碼讀取工作
只要前面 4 行,程式寫成:
currency=currency.iloc[:,0:5]
DataFrame 的資料讀取很特別:使用iloc[]。
可以使用列與行來指定我們需要抓取的範圍
目前來看,每一列資料都要,列 用 : 就可以了!
行的範圍只有前面 4 行,要用 0:4
可是再看一下表格內容:
第0行是 幣別,雖然不是資料,還是要抓
匯率分成 現金匯率 和 即期匯率,每筆都有 2個
一共是4個。4 + 1 是 5 個,因此每一列要取 5 行
索引值是 0 到 4 ,最後要多加 1 ,要寫成 0:5
看一下目前抓到的結果:
還可以;但仔細看一下行標題的部分
unnamed: 出現代表有些欄位是空的,這對資料輸出不大好。
如果有資料是空的,那就要強迫輸資料進去。
幸運的是,DataFrame 裡面對欄位輸資料很簡單,用
columns=[]
那我們想一下要輸入什麼資料:
第一行是 匯率,第二行是 現金匯率+買入,第三行是 現金匯率+賣出
第四行是 即期匯率+買入,第五行是 即期匯率+賣出
另一個重點是:輸入的是中文,還是設定成 Unicode 編碼。
在 Python 裡很簡單,字串前加 u 就可以了。
程式寫成:
currency.columns=[u'幣別',u'現金匯率買入',u'現金匯率賣出',u'即期匯率買入',u'即期匯率賣出']
結果是
4. 幣別內容的調整
看一下幣別資料:單一貨幣重複了2次?!
如果想要利用出現的文字來代表,該如何作?
這裡可以用 正規表示法(regular expression)
只要出現一個以上的英文字母,就取代原來內容。
currency[u'幣別'] 是取得 幣別行的內容
.str 是將內容轉為字串型態
.extract() 是對字串內容作掃描和判斷
對於一個以上的英文字母,用 w+ 就可以讀取
如果還要加上 左右括號,要再加上 \
整體就是 '\((\w+)\)'
最後程式寫成
currency[u'幣別']=currency[u'幣別'].str.extract('\((\w+)\)')
內容取代後是
5. 最後的存檔
看最後的結果,在最左邊有一組數字是原來資料裡不存在的,稱為隱性索引。存檔時不需要這個數字,因此可以下
index=0 這個參數。
還有,內容裡面有中文,存檔時需要存成 utf-8-sig
最後程式寫成
pd.DataFrame.to_csv(currency, 'currency.csv',encoding='utf-8-sig',index=0)
留言列表