iT邦幫忙

DAY 6
4

光介紹語法使用不大有趣,實作個可用的網站來試試。
之前曾發展過 中文隨機姓名+亂數假文的 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

系列文章列表


上一篇
簡單的 Sinatra 與 Rails 使用對照
下一篇
在 Sinatra 使用 template engine
系列文
建立API為中心的輕量級網站30

1 則留言

我要留言

立即登入留言