close

0_TWBank.png

 

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

 

1. 事前準備

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

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

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))


傳回來的是

1_4_ret_list_1.png

 

型態是 List,個數只有一個。
取用資料只能用 [0] 來取
先用這兩行指令,來看一下內容:
currency=dfs[0]
print(currency)

1_5_1_content.png

 

最後顯示

1_5_2_19_17.png

 

這筆資料有 19 列(row) ,每列有 17行(column)

也可以用 .info() 來詳細檢測這筆資料

1_6_1_info_Column.png

有 19 筆資料,索引值是 0 到 18

1_6_2_info_Column.png

 

再往下看,資料過多,也有空值(0 non-null)出現
就爬資料的目的來看,每一列(row)我們只要前面 4 行(column) 的資料就夠了,其他的可以不用抓。


3. 程式碼讀取工作

只要前面 4 行,程式寫成:
currency=currency.iloc[:,0:5]

DataFrame 的資料讀取很特別:使用iloc[]。
可以使用列與行來指定我們需要抓取的範圍

目前來看,每一列資料都要,列 用 : 就可以了!
行的範圍只有前面 4 行,要用 0:4
可是再看一下表格內容:

1_2_NewPage.png

第0行是 幣別,雖然不是資料,還是要抓
匯率分成 現金匯率 和 即期匯率,每筆都有 2個
一共是4個。4 + 1 是 5 個,因此每一列要取 5 行
索引值是 0 到 4 ,最後要多加 1 ,要寫成 0:5

看一下目前抓到的結果:
1_7_1_iloc_0_5.png

 

還可以;但仔細看一下行標題的部分

1_7_1_iloc_0_5_circles.png

unnamed: 出現代表有些欄位是空的,這對資料輸出不大好。
如果有資料是空的,那就要強迫輸資料進去。
幸運的是,DataFrame 裡面對欄位輸資料很簡單,用
columns=[]

那我們想一下要輸入什麼資料:
第一行是 匯率,第二行是 現金匯率+買入,第三行是 現金匯率+賣出
第四行是 即期匯率+買入,第五行是 即期匯率+賣出

另一個重點是:輸入的是中文,還是設定成 Unicode 編碼。
在  Python 裡很簡單,字串前加 u 就可以了。

程式寫成:
currency.columns=[u'幣別',u'現金匯率買入',u'現金匯率賣出',u'即期匯率買入',u'即期匯率賣出']

結果是
1_8_1_columnText.png

 

4. 幣別內容的調整

看一下幣別資料:單一貨幣重複了2次?!
如果想要利用出現的文字來代表,該如何作?
這裡可以用 正規表示法(regular expression)
只要出現一個以上的英文字母,就取代原來內容。

currency[u'幣別'] 是取得 幣別行的內容
.str 是將內容轉為字串型態
.extract() 是對字串內容作掃描和判斷
對於一個以上的英文字母,用 w+ 就可以讀取
如果還要加上 左右括號,要再加上 \
整體就是 '\((\w+)\)'
最後程式寫成
currency[u'幣別']=currency[u'幣別'].str.extract('\((\w+)\)')

內容取代後是

1_9_1_DollarContent.png

5. 最後的存檔

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

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

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

    小木屋

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