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:ひどい名前