光介紹語法使用不大有趣,實作個可用的網站來試試。
之前曾發展過 中文隨機姓名+亂數假文的 script,
是用 shell script 再加上 sinatra 的簡單實作,
在此全改用 ruby 來重寫一下抓取的方式。
先從 CLI 來實作,成功後再與 sinatra 結合。
這次以 夢幻筆名產生器 為例,
因所產生的筆名,都嵌入 html 的頁面裡,
要存取內容稍有不便,
這次目標是可以利用 sinatra,
成為做成可以提供夢幻筆名的API,
提供 CSV 及 JSON 格式。
由於原網站是以 big5 的編碼,
在此做一個把抓取到的big5的頁面轉成utf8:
# -*- encoding: utf-8 -*-
require 'net/http'
require 'open-uri'
def get_utf8_body(url)
uri = URI.parse(url)
res = Net::HTTP.start(uri.host, uri.port) {|http|
http.get(uri.path)
}
#body = Iconv.iconv("UTF-8//IGNORE","BIG5//IGNORE",res.body)
body = res.body.force_encoding('big5').encode('UTF-8')
return body
end
在程式裡只要用這
body = get_utf8_body('http://www.richyli.com/name/novel.asp')
就可獲該頁的 utf8 格式,然後再做解析的動作。
觀察一下該網頁的結構,
用這樣子就可把夢幻筆名給解析出來,
並且都放到陣列中:
names = (body.split("\r\n")[52]).strip.gsub(/。/,'').split('、')
#但為了後續的考量,寫成這個樣子:
def more_novel_name
url = "http://www.richyli.com/name/novel.asp"
body = get_utf8_body(url)
names = (body.split("\r\n")[52]).strip.gsub(/。/,'').split('、')
return names
end
在sinatra,為了能夠指定畫出不同的格式,
做個簡單的function,依所給的延伸檔案,
畫出不同的格式:
def myformat(data,format=false)
format = format
if format == 'json'
data.to_json
elsif format == 'yml'
data.to_yaml
else
data.join(',')
end
end
而 sinatra 的路徑及寫法可以這麼簡單:
get '/rand/novel.?:format?' do
names = more_novel_name
myformat(names, params[:format])
end
示範跑出來的結果網址為:
(CSV)http://i5.tagbible.net/rand/novel
(JSON)http://i5.tagbible.net/rand/novel.json
此時執行這個 sinatra 的完整檔案內容貼在:
https://gist.github.com/3887386