Clojureでスクレイピングしてみる - 並列ver.

前回の並列化ver.が思いの外簡単にできたので。


参加者の一覧を取得した後、並列でtwitterのURLを取得する(parallel-get-twitter-url*1の部分)ように変更。
他はprintlnの場所を変えただけ。

(ns hoge.core
  (:use [net.cgrand.enlive-html]))
(import 'java.net.URL)

(defn get-members
  "ATNDのイベントidを引数に参加者のプロフィールURLのリストを返す"
  [eid]
  (map #(str "http://atnd.org" (get-in % [:attrs :href]))
       (-> (str "http://atnd.org/events/" eid) URL.
           html-resource (select [:section#members-join :a]))))

(defn get-twitter-url
  "ATNDプロフィールURLを引数にtwitterのURLを取得(無ければnil)して印字"
  [p-url]
  (println
   (get-in (first (filter #(-> % :attrs :href (.startsWith "http://twitter.com"))
                          (-> p-url URL.
                              html-resource (select [:div#users-show-info :a]))))
           [:attrs :href])))

(defn parallel-get-twitter-url
  "並列でget-twitter-urlを呼び出す"
  [urls]
  (let [threads (doall (map #(future (get-twitter-url %)) urls))]
    (doall (map deref threads))))

(defn -main
  "ATNDのイベント番号を引数に参加者のtwitterのURLを表示する"
  [event-id]
  (parallel-get-twitter-url (get-members event-id))
  (System/exit 0))


実行する。

$ lein run 27149
http://twitter.com/bouzuya
http://twitter.com/emanon001
http://twitter.com/ponkore
http://twitter.com/keiskS
http://twitter.com/camomileo
http://twitter.com/nomnel
http://twitter.com/manjilab
nil
http://twitter.com/mid_f
http://twitter.com/farvel
http://twitter.com/d_e_k_o_p_o_n
http://twitter.com/taki__taki__
http://twitter.com/rika_t
http://twitter.com/sawam___
http://twitter.com/toshi_a
http://twitter.com/memememomo
http://twitter.com/nitro_idiot
http://twitter.com/murase_syuka
http://twitter.com/_yuu_k
http://twitter.com/Kuchitama

早い…!圧倒的…!
nilも入っちゃったけど、まぁ。

*1:ひどい名前