爬蟲 API 感想文

連結

網站程式碼

動機

有一次,我想查查台灣的收視率。正好XKM潤利艾克曼有自己的收視率調查網頁。只是...那個日期選擇有點難用。所以我想自己爬蟲試試。

爬蟲概念

大多數的爬蟲過程都一樣:抓網頁→分析原始檔的網頁結構→按照網頁結構取得需要的資訊。

爬蟲的難易度,取決於結構寫法是否整齊、語意化;還有資料來源是否有序——潤利艾克曼的寫法沒用上先進的語意化,但表格呈現得夠整齊、網頁也夠有序,所以抓資訊沒有那麼困難。

過程:請求 URL

先從 URL 說起吧:收視率調查網頁的格式大致上為:http://www1.xkm.com.tw/hr/DATA/HR190426.htm——仔細觀察的話,會發現只有 190426 那個字串會變:後來發現變法為前兩位為年份的最後面、後面四位分別月和日。因此 190426 的意思為: 20190426日。

過程:編碼

知道後再試著抓取,卻有個問題:編碼。起初抓網頁時,rails 抓取失敗:錯誤代碼為 Encoding::UndefinedConversionError ("\xA7" from ASCII-8BIT to UTF-8),所以我猜這網頁的編碼有問題。查了一下果然發現,這網頁的編碼是 Big5,而 UTF-8 的 rails 吃不了。所以我需要用點什麼辦法,把編碼轉為 UTF-8。我接著發現了兩個很有參考價值的網頁:

才發現 Ruby 有轉換編碼的方法 encodeencode 第一個參數為目標編碼、第二個則是原始編碼:有點不合直覺,但無所謂。

但當我發現 nokogiri 有請求網頁的方法、而且編碼早就處理好時,這編碼問題就沒用了。

過程:nokogiri 與 API

來說說 nokogiri 吧:這是一個可以解析 HTML 語法的套件。

網頁說起來,因為不太語意化,需要的資訊都夾在一起,所以只能用 .css("td") 抓取,再用 Ruby 語法去整理資料。好在都不難。再用 render :json => {} 建立物件、傳出 API 後,就是前端渲染的事情啦。

P.S. 其實我挺想知道為什麼這軟體要命名為ノコギリ...

過程:PostgreSQL

雖然這專案用不到資料庫,但佈署到 Heroku 時就是出問題,看了資料才發現是 sqlite3 作怪:Heroku 不支援 SQLite

那要怎麼辦?Heroku 給的辦法,是直接在開發環境使用 PostgreSQL

我目前用 Mac。在 Mac 用 PostgreSQL 的話,要安裝 Postgres.app 來用。接著要啟動的話,要去點選 Postgres.app 的圖標。

不需要去終端機開啟!<br /> 不需要去終端機開啟!<br /> 不需要去終端機開啟!

因為很重要所以講三次。

免責聲明

本人不是XKM潤利艾克曼公司的員工、從 xkm.com.tw 抓取的原始資料為XKM潤利艾克曼公司所有。