LoginSignup
4
4

More than 5 years have passed since last update.

BigQueryに放り込む用のCSVファイル生成(Twitter)その2

Last updated at Posted at 2014-11-08

前回は100件しか取れなかったので、根こそぎとれるようにソースコードを思いつくままに変更しました。

とりあえずちゃんと取れるようになったので、BigQueryにcsvファイルをつっこんでみたら・・・

ひたすらエラーを吐く!!!

エラーの原因は"(ダブルクォーテーション)がしっかりと閉じられていないから。

で、実際のデータを見てみると

screen name

こいつに改行が入っているユーザーがいる。

そのせいでエラーを吐いていた。 :sweat:

メンドクサイので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の取得に時間かかりすぎて、全量じゃないです。)

zanmai.png

結果

大事件です
https://www.youtube.com/watch?v=_RufZecxXKQ

4
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4