放射線醫學會的網站上其實有個學術活動的日曆,但總覺得每次要連上去看有點麻煩,想把它整合到平時就有在用的 Google Calendar 裡,曾經問過學會有沒有提供 Google Calendar 的格式,說是沒有,後來也是不了了之,所以乾脆自己做了一個 crawler,把資料爬下來後再丟上 Google Calendar,有需要的人歡迎自取。
新增日曆
訂閱這個日曆的方法可以參考 Google Calendar 的說明,「利用連結新增日曆」的部份。而本日曆的 iCal 網址是
https://calendar.google.com/calendar/ical/trs-event-crawler%40fluted-torus-161807.iam.gserviceaccount.com/public/basic.ics
限制和可能問題
無法完全同步
目前會把最近三個月的活動撈下來,基本上是單向的從學會網站抓一次資料,如果曾經抓過的就省點事,不再下載一遍,所以如果學會把一些活動取消或是改期了,舊資料還是會出現,正式活動資訊,還是以學會網站上公佈的為主。
標題過長
(我猜)當初學會沒有直接用 Google Calendar 而是用自己做的系統,其中一個原因說不定也是標題過長,在 Google Calendar 裡除了用「天」的模式可以完整顯示外,其他都只能顯示前面幾個字就被截斷了,我已經把標題的 ”北區研討會” 簡略為 “北區” 了,但還是沒太大幫助就是了。
▲ 學會網站上的日曆樣式,雖然版面有點 over,但起碼可以完整顯示標題
▲ 因為 Google Calendar 每個 event 只會佔用一列,過長的標題就會被截斷而不知所云
▲ 以「天」的模式才有機會完整顯示標題
事件過多
▲ 其實學會的活動不少,同時顯示的話,會有版面被佔滿的壓迫感
因為一般人多半不會跨區參加活動,或許可以考慮把北、中、南、東…不同區的再拆分成幾個 sub 日曆。
技術心得
這次實作選的是 python,除了想趁機練習一下外,本來是打算把以前寫過的爬蟲拿來改一改就可以,不過最後還是差不多等於重寫了。
從 Perl 的時代開始,我都是用 mechanize 來爬網頁資料,不過現在好像比較流行 requests,
看了一下 demo code,真的比較簡潔,而且也用不到 mechanize 的互動功能,所以就拿來練習一下。
▲ 學會網站用的是舊的 TLS 1.0 protocol
一開始遇到學會網站用的 SSL 太舊的問題,試過改 HTTPAdapter 用 TLSv1(可見學會的 server 似乎沒在 update),也改過用早期 DES 的 cipher,但搞了半天還是解決不了,幸好他們還可以用未加密的 http 來連,這關就先跳過。
把資料爬下來後,先存一份到本地的 db,主要是想 cache 哪些 event 已經撈過,不用重撈,新的資料用 Google Calendar API 丟上去,只有做到單次撈資料,而且目前不會去比對活動日期和內容是不是有修改,可能導致和學會網頁 mismatch 的現象,這部分可能等後續實際遇到狀況時再來修了。
Google Calendar 裡的 all-day event 日期格式直接用 yyyy-mm-dd
就好,不過 end.date 要比 start.date 多一天,一開始我設為同一天也是可以新增 event,不過點進 event 內會有錯誤的警告,但多日 event 算錯日期就不太妙了。
剛剛看學會網站上也有新聞的部份,改天也來寫個小工具把它轉成 RSS feed 好了。
Yi-Chang Chen
2017/03/20TLS 1.0也太orz了…
tsaiid
2017/03/20不過其實要不是 crawler 會噴 SSL Error,我倒是也不會發現這個
Pingback: 放射線醫學會新聞活動的 RSS Feed | I-Ta Tsai's Blog