很多朋友常常到日本去玩,換匯肯定都是要精打細算,挑選個良辰吉日匯點低的時候換匯,但常常因為忙碌就會忘記這件事情,所以我們今天來寫個關於匯率的主題。
匯率的換匯每個人都有自己的習慣和眉角,那我們就先定義一下我想換匯的條件,若目前這個匯率是 14 天以來最低點匯率點,那我應該就會行動,若不是,那麼就通知我目前匯率多少就好了。
想到換匯,我第一個就想到臺灣銀行的牌告匯率,接著看到臺灣銀行有提供日幣的歷史價格,我只需要比對這邊資料的最近七天,然後判斷今天是不是這七天的最低點,就能達成我們的目標了。
我們會將這隻爬蟲分解成二個動作:
單純的 get request,可以很順利的取得資料。不過這邊有個有趣的狀況,因為這個頁面有歷史線圖和歷史價格 table,所以抓取七天資料可以有兩種做法,一個是直接使用歷史線圖,他的資料來源是 js,所以要用 jsdon 來模擬 js 的執行來取得。另一種是從 table 下手,由 dom 爬取資料。
我們這邊選用 dom parser table 來取得資料,那就來驗證一下是否能順利取得,同時試試看今天是不是今天的最低價格。
發送 get request 並且將結果丟給 callback。
function getData(callback){
request('http://rate.bot.com.tw/xrt/quote/ltm/JPY', (err, res, body)=>{
callback(body)
})
}
取得七天的賣出價格,使用 filter 去取出條件為「本行賣出」和七天內的資料。然後再去取得最這七天的最低匯率點,若是等於今天的匯率點,那麼 gotoBackRightNow 就等於 true,反之等於 false。
var rate = $('.rate-content-cash.text-right.print_table-cell')
.filter((index)=>{
return index%2 && index<14
})
.map((index, obj)=>{
return $(obj).text()
})
.get()
var lowest = Math.min(...rate)
var gotoBackRightNow = (lowest == rate[0])? true: false
const request = require('request');
const cheerio = require('cheerio');
getData((body) => {
var $ = cheerio.load(body)
var rate = $('.rate-content-cash.text-right.print_table-cell')
.filter((index) => {
return index % 2 && index < 14
})
.map((index, obj) => {
return $(obj).text()
})
.get()
var lowest = Math.min(...rate)
var gotoBackRightNow = (lowest == rate[0]) ? true : false
console.log(gotoBackRightNow);
})
function getData(callback) {
request('http://rate.bot.com.tw/xrt/quote/ltm/JPY', (err, res, body) => {
callback(body)
})
}
除了日幣以外,任何跟匯率有關的都能抓取,像是比特幣、黃金、期貨...等。每個人都能自己去抓取資料用自己的方法做分析,不過在網路上,其實有很多熱心的人已經做好這些 api,有些收費,有些免費,不過免費的大都會有限制,端看你的使用情況和使用量來決定你要用什麼方式來取得這些資料。
對很多網路上的服務來說,其實難的都不是在技術本身,而是在於當你有了這些資料之後,你會怎麼應用?而不同的人應用的方式不同,就會產生不同的成效,也因為如此 open data 才會如此重要。