使用 scrubyt 爬網頁
ruby, scrap, web at June 1st, 2009 by 小影
看見 Findbook 和 Moosh (和類似的網站) 會覺得很高興,它們除了把各個商戶的網站資料結合之外,還有更快更好用的介面。究竟怎樣才能把不同的網站資料到手呢?其實也不一定很困難,比如使用今天介紹的 Ruby Library scrubyt。
首先我們設定今日的目標:找出某一場電影的座位表現在的狀態。
要達到這目標你需要準備 Firebug (用來尋找 XPath) 和 Ruby。
首先安裝 scrubyt,在 command line 輸入以下指令:
gem install scrubyt
接著建立一個新檔案 show.rb:
執行這段程式碼,就會輸出以下資料:
哈,我想你大概已明白 scrubyt 怎樣使用了?
1. Scrubyt::Extractor.define 開始定義了一個 Extractor, extractor 是 scrubyt 用來分析網頁的程式。
2. fetch 命令叫 scrubyt 打開指定的網頁,你可以試著在 browser 打開這頁看看座位表是怎樣的樣子 (URL 裡的 id 過幾天可能會過時了… 請自行找適當的一頁)
3. 接著的就是魔法:在 scrubyt 裡只要沒有被定義的關鍵字都會自動變成一個 node 的 definition。也就是說 extractor 會試著依我們指定的 XPath 去建立一個叫 schedule 的 node。”//table[2]” 是個 Xpath 的 expression ,scrubyt 會找出這個 expression 並在裡面繼續找 cinema, house … 等資料
4. 最後一句是把資料轉成 XML再把 big 5 轉成 utf-8 。
以上還沒有座位資料,要加也不是太難…
5. 這是利用 firebug 分析網頁後,發現未售的座位都是 seat_A 的 class ,因此只要找 seat_A 就可找到未售座位了。
最後我們想要得出一個數字:有多少未售的座位?這裡我使用 Nokogiri ,一個 Ruby 的 XML Library :
在得出原本的 XML 後,我們計算一下 seatplan 下有多少個 seat 的 node ,這就是可售座位的數目了,把這加入原本的 XML 下,再把無用的 seatplan 移除,結果如下:
不錯,對不?你也許會說這只是找到一場電影的資料罷了… 但用這思維要找今天有甚麼電影也不難,以下是我的 schedule.rb:
執行的結果:
Scrubyt 是個很神奇 (雖然很實驗性) 的程式庫,只要運用得宜可以用很簡短簡潔的方法把任何網頁變成可用的 XML !它還有很多神奇的功能,但這要留給大家到它的 wiki 慢慢研究了。