前回は100件しか取れなかったので、根こそぎとれるようにソースコードを思いつくままに変更しました。
とりあえずちゃんと取れるようになったので、BigQueryにcsvファイルをつっこんでみたら・・・
ひたすらエラーを吐く!!!
エラーの原因は"(ダブルクォーテーション)がしっかりと閉じられていないから。
で、実際のデータを見てみると
screen name
こいつに改行が入っているユーザーがいる。
そのせいでエラーを吐いていた。
メンドクサイのでscreen nameを入れないようにしました。
BigQueryに入れることに成功したよ!やったね!タエちゃん!
*追記
実はtextにも改行(\r) が入ってました。
ソースコード
ソースコードむっちゃ汚いんでアレ(誰かリファクタリング・・・
あと、#zanmaiのデータ取るのむっちゃ時間かかる( ◔ิω◔ิ)
(ns tweet-bigdata-clj.core
(:import [twitter4j TwitterFactory Query QueryResult])
(:require [clojure-csv.core :as csv]
[clojure.java.io :as io]))
(declare twitter get-tweets tweets-to-map to-csvfile to-csv make-csv get-all-tweets)
(def twitter (.getInstance (TwitterFactory.)))
(defn get-tweets [hash-tag]
"tweet取得"
(let [query (doto (Query.)
(.setQuery hash-tag)
(.setCount 100)
(.setSince "2014-11-03")
(.setUntil "2014-11-04"))]
(->> (.search twitter query))))
(defn tweets-to-map [tweets]
"tweetsをmap形式に変換する"
(map #(zipmap [:screenName
:name
:text
:createdAt]
[(.. % getUser getScreenName)
(.. % getUser getName)
(clojure.string/replace (.getText %) #"\n" " ")
(.. % getCreatedAt toString)]) tweets))
(defn to-csvfile [text]
"csvファイルを作成"
(with-open [out-file (io/writer "out-file.csv" :encoding "utf-8" :append true)]
(.write out-file (apply str text))))
(defn to-csv [{text :text name :name screen-name :screenName created-at :createdAt}]
"カンマ分割"
(csv/write-csv [[screen-name text created-at]]))
(defn make-csv [query]
(->> query
(.getTweets)
(tweets-to-map)
(map #(to-csv %))
(to-csvfile)))
(defn get-all-tweets [#^QueryResult query]
(loop [q query]
(when (.hasNext q)
(Thread/sleep 5000)
(let [nq (doto (.nextQuery q)
(.setCount 100))
nqr (.search twitter nq)]
(make-csv nqr)
(recur nqr)))))
(defn get-first-page [query]
(let [q (.search twitter query)]
(dosync(alter result-list conj q))
q))
(defn -main[]
(let [first-tweets (get-tweets "#zanmai")]
(make-csv first-tweets)
(get-all-tweets first-tweets)))
RT数で並べた
(※tweetの取得に時間かかりすぎて、全量じゃないです。)