2012/11/23

Fantasy Basketball

最近受到朋友邀約,迷上了一款叫做 Yahoo! Sports Fantasy Basketball 的遊戲,大致的遊戲進行方式就是找幾個擁有 Yahoo 帳號的朋友加入你創造的聯盟,訂立一個選秀日期,日期到的時候大家都要登入參加選秀,採 S 型的方式挑選自己心儀的球員,選秀過程就像 NBA 一樣順位高的先選,不同的是 NBA 的選秀賭的是一個未來性,但 Fantasy 選的是既有的球員,所以事前的情資一定要完備,才不至於選秀時手忙腳亂,每個人只有 60 秒的時間抉擇,所以沒有先做一下功課到時候選進來的球員素質就看天了。

這個遊戲行之有年了,所以其實官方的介面跟功能滿強大的,查詢資料或者是選擇球員等等功能都十分容易上手,不過有一個部份官方沒有做,同一時間你只能看每週你跟你對手交戰的數據,不過比賽時間很長,隨時都必須要觀察一下其他組合的戰況,補強優點替除缺點,不知道為什麼官方沒有一個總表的形式,於是我萌生了自己抓取並整理資料的想法。

一開始不知道聯盟資料可以設定成 public,所以要突破模擬登入後抓資料,找了網路上幾個範例,成功的模擬了 Yahoo 登入模式,也抓到了資料,但沒有多久就無法使用了,我猜 Yahoo 有防堵模擬登入的機制,我還因此收到了異常登入的簡訊,在知道可以設定 public 無須登入便可以看到資訊之後,順利寫出一隻蒐集資料的工具。

方法介紹

首先查出 Yahoo 方面拉出資料的邏輯,確定了要抓取資料的頁面 url,利用 cURL 的方式將所有頁面抓回來,再使用 PHP Simple HTML DOM Parser 這個 class 剖析重組我要的 table 字串,一開始遇到的困難就是 Yahoo 傳回來的文字內容相當驚人,他們沒有把 css 跟 javascript 做外部連結,所以光一個頁面的文字就高達 30 幾萬個,塞到 Parser 直接當給你看,所以多寫了一隻 function 過濾除了 table 元素以外的標籤,組合出 table 以後,再寫入分數判斷以及 ajax 更新就大功告成啦。

// strip all tag but table
function strip_html_tags($text) {
$text = preg_replace(
        array(
            '@<style[^>]*?>.*?</style>@siu',
            '@<script[^>]*?.*?</script>@siu'
        ),
        array(
            '',
            ''
        ),
        $text
    );

    return strip_tags($text, '<table><tr><td>');
}

功能介紹

  • 可設定切換查詢的週數
  • 抓取所有 match 資料合併為一個 table
  • 將所有欄位最佳的分數標上特殊顏色
  • 遇到比賽時,可以選擇開啟 ajax 更新功能,系統會自動刷新即時數據
  • 可拖曳排列順序方便比較

沒有留言: