Twitterから声優のtweetをひたすら収集するプログラム。
昔やったときは直近200tweetしか取れない、と思っていたら、ID指定でそこからさかのぼれることが判明した。というわけでIDごとにループするようになっている。
連続で取得しすぎるとAPIで弾かれるらしいから、適当な時間だけ待機してアクセスするようになっている。これで最大3200tweetくらいまでとれる。
前に作成した声優アカウント一覧について取得する。エラーで止まったとき用に、いままで取得した場合は取得する一覧から削除する仕様ということで。
20時間くらいかかった。
# 一回の取得tweet数と、それを何回繰り返すか niter = 16 n_tweet = 200 # APIの待機時間 query_per_sec = 15*60/180.0 # データフォルダ。1ファイルが1声優になるように。 wd = "/tweet/" # tweetフォルダ内の、既に取得されている声優一覧 comp_cv = map(lambda x: re.sub(".tsv", "", x), os.listdir(wd)) # 前にやったアカウント一覧を取得する。 g = open("twitter_cv_list.txt", "rU") cv = [d.split(",")[0] for d in g] # 既に取得している声優は省く。 cv = list(set(cv).difference(set(comp_cv))) for i in cv: # 各声優ごとにファイルを吐き出す。 w0 = codecs.open(wd + i + ".tsv", "w", "utf-8") print("Procesing " + i + " (" + str(cv.index(i)+1) + "/" + str(len(cv)) + ")") for j in range(niter): try: # タイムラインの取得 if j == 0: user_timeline = twitter.get_user_timeline(screen_name=i, count=n_tweet) last_id = user_timeline[-1]["id"] time.sleep(query_per_sec) else : user_timeline = twitter.get_user_timeline(screen_name=i, count=n_tweet, max_id=last_id) last_id = user_timeline[-1]["id"] time.sleep(query_per_sec) except: print("error") # よくわからないんだけど。 for tweet in user_timeline[1:]: sub_text = re.sub("\n", "", tweet['text']) # 改行コードは削除しないと tsv が乱れる。 created_at = tweet["created_at"] w0.write(i + "\t" + sub_text + "\t" + created_at + "\t" + str(tweet["id"]) + "\n") # 書き込み w0.close()