最近某位教授覺得大家竟然不知道希特勒是誰,覺得大家都沒國際觀,台灣未來一定超沒競爭力,大家都只能領22K。
他還提供了一個網站 國際觀檢測網

每次點進去都會出現10道題目,例如尼克森、翁山蘇姬是哪國人、做過什麼事,並提供詳解

老實說我覺得這樣太沒效率了,一次只有10題不小心還會重複,豈不是浪費應考人的時間!? 因此我就做了一份增進國際觀大補帖,把網站的題庫全部拉出來,讓大家題目可以一看再看,準備完了再上線考試,就像考駕照一樣。
相信有了這份大補帖,一定能幫大家有效的提升國際觀,讓台灣人才競爭力逆風高灰超英趕美。

概念其實不難,就跟之前做的東西一樣,我是用python2.7 來實作,著眼點是它的lxml 套件,不過python2.7 對utf-8 的支援沒那麼好, script 開始前要把default encoding 設定為utf-8,不然常會印出亂碼。

reload(sys)
sys.setdefaultencoding('utf-8')

首先用urllib2把網頁抓下來,因為這個網頁會cache 要求過的內容,因此要在 header 裡面加上 no-cache,讓HTTP proxy server不要cache 回傳的資料。

request = urllib2.Request(TARGET)
request.add_header("Pragma", "no-cache")
response = urllib2.build_opener().open(request)

再來用lxml把裡面問題和答案的部分給挖出來,填到一個python dictionary 即可,每抓一次都會比對不要抓到重複的東西。

content = response.read().decode('utf-8')
root = lxml.html.fromstring(content)

table = root.xpath("//table[@id='report']")[0]
entries = table.xpath("//tr")
question = []
answer = []
for q, a in zip(entries[1::2], entries[2::2]):
    if q[0].text is not None and a[0].text is not None:
        qtext = q[0].text.strip()
        atext = a[0].text.strip()
        question.append(qtext[3:].strip())
        answer.append(atext)

因為爬蟲有時候會遇到網頁錯誤,因此一定要把爬過的東西先存下來,不然跑一跑壞掉了,重跑又要重抓資料,會哭的; 幸好在python 上面有pickle 的支援,serialize 資料算相當方便,只要在開始的時候,先用pickle 讀入一個字典檔,沒有的話就回一個空的:

def openPickle():
    try:
        return pickle.load(open(picklefile, "rb"))
    except (EOFError, IOError):
        return {}

存檔也很簡單,一行就解決了:

pickle.dump(data, open("global", "wb"))

再來就是一直跑一直跑一直跑,題目就會如洪水般湧進來,老實說挖出來的東西比我想得還要多…好多,wc 一下有1500多行,估計大約就是750 題左右吧。
Well 至於我爬出來的東西,我就無償公開好了,反正這種東西你它的網站一直按F5 也可以抓全,我只是請機器人幫我抓,原始碼跟大補帖放在這裡:

其實我對這個題…沒什麼意見啦,不過我還是不樂見有人真的把這個拿來背(是…應該不會有人這麼蠢吧…應該啦……), 畢竟與其死背希特勒是哪國人,還不如去了解他崛起的背景,與其多看大補帖還不如念念「希特勒回來了」。

不過自從我把大補帖公平出來之後,受到各方熱烈的回應,在此僅節錄幾則:

  • 使用者評價一:自從用了國際觀大補帖,頭腦就靈光了很多,考試都考87分呢!
  • 使用者評價二:上學的時候我國際相關的東西都答不出來,自從用國際觀大補帖,成績突飛猛進,現在已經準備要考托福跟日檢N1了。
  • 使用者評價三:原本人生一片黑暗,直到遇到國際觀大補帖,和家人關係變好不說,上周不但交到了女友,老闆還幫我加薪25元呢。
  • 使用者評價四:看國際觀大補帖,平常和朋友聊天信手拈來就是一堆國際知識,朋友們都改用欽佩的眼光看我,覺得我人生從此都不一樣了。
  • 使用者評價五:之前男朋友都看不起我,自從把國際觀大補帖印下來帶在身邊,除了平時閱讀增進國際知識,男朋友欺負我的時候還可以用厚重的大補帖打他的臉,被沉重的歷史感打到一定很痛!
  • 使用者評價六:難得一見的好書,我把每一題都記得滾瓜爛熟,上周考汽車駕照一次就通過了,謝謝你,國際觀大補帖。

Ps. 其實這篇寫程式的時間遠不及寫上面那堆嘴砲文的時間lol