一般我們利用 Python 語言作網頁爬蟲工作都會利用套件或程式庫工具,如 BeautifulSoup。但是在某些出現表格形式的資料中,我們可以利用 Python 裡的 DataFrame 來讀取資料。

 

1. 事前準備

在網頁爬蟲工作哩,Chrome 網頁瀏覽器是一個很好的工具。

首先我們先找 台灣銀行。要找匯率,按下右上方的 匯率利率
 
 
在畫面中按下中間的 牌告匯率
 
就看見 匯率畫面
 

2. 先觀察資料

這裡利用 Python 裡的 DataFrame 來讀取網頁資料。

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. 最後的存檔

由網路上抓到資料後,也清理出有用的資訊,最後應該要存成檔案。幸運的是,在 Python DataFrame 裡面可用 to_csv() 來儲存資料。

看最後的結果,在最左邊有一組數字是原來資料裡不存在的,稱為隱性索引。存檔時不需要這個數字,因此可以下
index=0 這個參數。

還有,內容裡面有中文,存檔時需要存成 utf-8-sig
最後程式寫成
pd.DataFrame.to_csv(currency, 'currency.csv',encoding='utf-8-sig',index=0)
 
文章標籤
全站熱搜
創作者介紹
創作者 小木屋 的頭像
小木屋

小木屋

小木屋 發表在 痞客邦 留言(0) 人氣(919)