CodeForces爬蟲工具 用PHP寫爬蟲抓題目

CodeForces爬蟲工具 用PHP寫爬蟲抓題目

 

剛開始學寫程式的時候,都會聽過,程序等於算法加數據結構。但因為我不是CS出生,而是Finance,一開始看到這句話也沒什麼感覺,直到我寫的東西越來越多,而且發現實現一個功能,很多人的寫法都不一樣,而且自己的常常是又長又沒效率,於是就決定開始關注算法了。

可以練習算法的地方

  • TopCoder – 來自美國,常常舉辦比賽,有Client進行算法的驗證(Judge)和進行比賽。
    每次比賽的題目也都會有留下算法題目給大家看。
  • CodeForces – 來自俄羅斯(介面支持俄羅斯語和英文),基於Web的服務,每週都有算法比賽,因為他支持PHP的Judge,所以我主要都是在codeForces上玩….畢竟我目前只會PHP和Objective-C。
    也會留下每次比賽的算法題目,隨時可以看,也可以進行Judege.
    上面有位來自俄羅斯的Google員工Peter聽說為人低調又非常厲害
  • 其實各個地區都會有很多學校有算法題目的收集和線上Judge的功能,網上搜索還滿多的。

CFTool-PHP小爬蟲,抓取CodeForces的題目

寫這個工具的一些情況:

  • 選擇CodeForces,因為它支持PHP的Judge,我才能做題目。
  • 用PHP寫爬蟲,因為PHP支持本地讀寫文件,我可以通過正則表達式,抓取我要的部分,然後在本地保存成htm文件,方便瀏覽(一開始我打算寫個iOS的客戶端用UIWebView來瀏覽)。
  • CodeForces有API,但是API沒有提供題目的正文,只是題目的ID、Index、題目名字之類的。

CFTool的運行方式

  • CodeForces每個題目都有個固定的網誌格式例如:http://codeforces.com/problemset/problem/507/E
    數字應該就是第幾次的比賽,英文字母表示難度的不同(應該吧…)。
  • 通過CodeForces的API下載他的題目列表,
  • 讀出所有的題目ID,Index,根據固定網址/ID/Index就可以讀取所有題目的html文件了
  • 利用正則表達式(RegularExpress)抓取自己要的內容,包括正文圖片在本地保存。

CFTool的實現

首先,通過他的API下載CodeForces的題目列表 (http://codeforces.com/api/problemset.problems)
(當然也可以利用工具裡面的isNeedUpdate()去下….哈

CFProblems是一個類,裡面寫了些方法可能有尚未使用到的

  • isNeedUpdate() -先判斷本地有沒有CFProblemsList.JSON這個文件,
    存在則比較題目的數量是否相同。
    不存在,則通過API地址下載。
  • getProblemList()-就是下載CFProblemList.JSON
  • getProblem()-就是根據ID和Index來瀏覽Problem的html,裡面就有具體抓取我要的正文方法。
  • css文件我是手動下載的….每個題目用到的css文件相同,我放在Problems資料夾下(style.css)。
  • 程序class CFProblems以外的內容是我自己的調用。
 

CFTool的缺陷(我是邊學邊做所以沒完善…)

  1. 題目下載後沒有進行資料夾的劃分,以至於2000多個題目都放在一個資料夾裡面。
  2. 圖片和上面情況一樣,不過圖片沒那麼多。
  3. 一些手動的事情其實也可以寫到CFProblems這個類裡面,比如CSS的下載等。
  4. 少寫個功能,可以把這些功能結合起來,只要外部執行checkUpdate()然後就自動去判斷是否需要下載CSS檔、JSON檔案等等。
    我沒有這麼做還有個原因,就是因為我沒來(懶)得(的)及(去)查PHP的多線程用法,如果每次一直行他就開始跑了…那要下好久阿=_________=…於是我乾脆手動設定要下載幾個這樣…

寫CFTool過程有上的網站

有關PHP怎麼創建Class,怎麼調用Class方法之類的,我就是下載個有這功能的php檔案,然後依樣畫葫蘆就學好了,PHP很簡單…


最後,這篇文章只是我自己記錄用的,因為工具算是一次性的嘗試,所以我就…隨心一點了。

所有的代碼以及2000多個題目都放在GitHub上了。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *