爬蟲 API 感想文
連結
動機
有一次,我想查查台灣的收視率。正好XKM潤利艾克曼有自己的收視率調查網頁。只是...那個日期選擇有點難用。所以我想自己爬蟲試試。
爬蟲概念
大多數的爬蟲過程都一樣:抓網頁→分析原始檔的網頁結構→按照網頁結構取得需要的資訊。
爬蟲的難易度,取決於結構寫法是否整齊、語意化;還有資料來源是否有序——潤利艾克曼的寫法沒用上先進的語意化,但表格呈現得夠整齊、網頁也夠有序,所以抓資訊沒有那麼困難。
過程:請求 URL
先從 URL 說起吧:收視率調查網頁的格式大致上為:http://www1.xkm.com.tw/hr/DATA/HR190426.htm
——仔細觀察的話,會發現只有 190426
那個字串會變:後來發現變法為前兩位為年份的最後面、後面四位分別月和日。因此 190426
的意思為: 2019年04月26日。
過程:編碼
知道後再試著抓取,卻有個問題:編碼。起初抓網頁時,rails 抓取失敗:錯誤代碼為 Encoding::UndefinedConversionError ("\xA7" from ASCII-8BIT to UTF-8)
,所以我猜這網頁的編碼有問題。查了一下果然發現,這網頁的編碼是 Big5,而 UTF-8 的 rails 吃不了。所以我需要用點什麼辦法,把編碼轉為 UTF-8。我接著發現了兩個很有參考價值的網頁:
才發現 Ruby 有轉換編碼的方法 encode
。encode 第一個參數為目標編碼、第二個則是原始編碼:有點不合直覺,但無所謂。
但當我發現 nokogiri 有請求網頁的方法、而且編碼早就處理好時,這編碼問題就沒用了。
過程:nokogiri 與 API
來說說 nokogiri 吧:這是一個可以解析 HTML 語法的套件。
網頁說起來,因為不太語意化,需要的資訊都夾在一起,所以只能用 .css("td")
抓取,再用 Ruby 語法去整理資料。好在都不難。再用 render :json => {}
建立物件、傳出 API 後,就是前端渲染的事情啦。
過程:PostgreSQL
雖然這專案用不到資料庫,但佈署到 Heroku 時就是出問題,看了資料才發現是 sqlite3 作怪:Heroku 不支援 SQLite。
那要怎麼辦?Heroku 給的辦法,是直接在開發環境使用 PostgreSQL。
我目前用 Mac。在 Mac 用 PostgreSQL 的話,要安裝 Postgres.app 來用。接著要啟動的話,要去點選 Postgres.app 的圖標。
不需要去終端機開啟!<br /> 不需要去終端機開啟!<br /> 不需要去終端機開啟!
因為很重要所以講三次。
免責聲明
本人不是XKM潤利艾克曼公司的員工、從 xkm.com.tw 抓取的原始資料為XKM潤利艾克曼公司所有。