python
crawler
爬取台灣銀行匯率網頁(https://rate.bot.com.tw/xrt?Lang=zh-TW),將所有幣別的匯率存成CSV檔案。
find()
、find_all()
等等)來取得目標資料。模組名稱 | 說明 |
---|---|
bs4 | BeautifulSoup網頁解析模組 |
lxml | 網頁解析器 |
requests | HTTP模組,用來直接透過網路讀取網頁資料 |
csv | 操作CSV檔案格式模組 |
time | 取得時間 |
response
物件中的text
屬性就是我們需要的網頁原始碼,另外存到新的變數html_doc
中後再交給BeautifulSoup
來解析。如果不另外存到新的變數,也可以直接形成一行如下:
取出匯率資訊網頁內的table內的tbody標籤,因為匯率網頁的第一個table就是匯率資訊,所以直接使用find()
方法找出第一個table標籤即可。
因為每一筆匯率都被一個tr標籤包圍,因此透過find_all()
方法取得每一個tr標籤。
因為每一個欄位(column)內都有data-table屬性來標示該欄位的資料標題(例如:幣別),因此透過該屬性可以針對不同欄位來做特殊處理。
attrs
為每個soup的屬性,透過指定的標籤的屬性名稱,可以用來對應的屬性值。
這裡用了一個小技巧,因為幣別的tr標籤內有多個div標籤,而大部分都是我們不要的資訊,剛好最後一個div標籤內有我們需要的幣別(例如:美金USD),所以透過for-in
迴圈的列舉特性,更新事先宣告好的變數,當一個什麼事都不做的for-in
迴圈結束後,該變數內就會是最後被列舉(iterator)出來的div標籤。
透過string
屬性取得的文字因為前後都多了一些「換行」與「空白」字元,所以使用Pythonstring
物件本身提供的方法strip()
來去掉。
time
模組內提供了strftime()
方法可以用來自訂日期顯示的格式,參數說明如下:
參數 | 說明 |
---|---|
%Y | %Y 四位数的年份表示(000-9999) |
%m | 月份(01-12) |
%d | 月内中的一天(1-31) |
%H | 24小時制的時(0-23) |
%M | 分鐘數(00-59) |
%S | 秒(00-59) |
使用 with
開啟檔案時,會將開啟的檔案放在 csvfile
變數中,但是這個 csvfile
只有在這個 with
的範圍內才可以使用,離開這個範圍後, csvfile
就會自動被關閉,並回收相關的資源,好處就是,避免忘記呼叫close()
方法而造成檔案使用完畢卻沒有釋放資源,造成記憶體浪費或是檔案無法再次被開啟(open)的問題。
透過Python提供的csv模組的writer
物件,呼叫writerow()
方法可以寫入一列,參數為一個stirng
的list
,而writerows()
(注意方法翠後面多了一個s),則需要提供一個list
的list
物件,這個list
內的每一筆資料都是一個list
,代表一列資料。