芋の独り言

当ブログへのアクセスは当ブログのプライバシーポリシーに同意したものとみなします.

TwitterをPythonで24時間観察てきな?

前提条件として,consumer_keyとかは各自で用意してください.あと,Python環境とtweepyのインストールも. 以下のスクリプトで,毎時ランダムにツイートを取得します.ランダムなので,言語や場所は様々.ツイートを取得した後で, 言語を指定してフィルターにかける感じです.ここらへんは参考サイト
Twitter APIをpythonで使うと〇〇ができる。 - どん底から這い上がるまでの記録
を見てください.
あとは,取得したツイートをcsv形式で保存します.というより,毎時上書きしていく感じです.何故csvファイルなのか?と思うかもしれませんが, csvファイルだと後でpandasを用いて処理しやすいと思ったからです.
ちなみに,

指定するもの 取得できる言語
ja 日本語
en 英語
in インド系?
und 絵文字などUnicodeErrorが起きるような文字

という感じで,これを指定することで,欲しい言語のツイートだけを取得できるわけですねー.あと,csvファイルはこのスクリプトが保存されているディレクトリに作成されますよー.
マークダウン記法で表を書くのに,どうやるのか忘れたので,以下を参考にしました.また,表の前後には改行を入れとかないと認識しないっぽいですねー.
Markdown記法 チートシート · GitHub

#-*- coding:utf-8 -*-
import tweepy
import datetime
import csv
from time import sleep

class make_csv:
    
    def __init__(self,filename):
        self.filename=filename
        # csvファイルの作成とヘッダーの書き込み
        with open(self.filename,mode="w",encoding="utf-8") as file:
            writer=csv.writer(file) # writerオブジェクトを作成
            header=[
                "RT",
                "text",
                "tweet_id",
                "post_date",
                "retweet",
                "favorite",
                "user",
                "screen_name",
                "location",
                "reply_id",
                "language",
                "place"
                ] # ヘッダー
            writer.writerow(header) # ヘッダーを書き込む
            
    def make(self,tweet):
        # csvファイルの作成とヘッダーの書き込み
        with open(self.filename,mode="a",encoding="utf-8") as file:
            writer=csv.writer(file) # writerオブジェクトを作成

            if 'RT' in tweet.text:
                RT=True
            else:
                RT=False
            text = str(tweet.text).replace('\n','')
            if text.find(','):
                text.replace(',',',')

            body=[
                RT,
                text,
                tweet.id,
                tweet.created_at + datetime.timedelta(hours=+9),
                tweet.retweet_count,
                tweet.favorite_count,
                tweet.user.name,
                tweet.user.screen_name,
                tweet.user.location,
                tweet.in_reply_to_status_id,
                tweet.lang,
                tweet.place
                ]
            
            writer.writerow(body) # を書き込む


class MyStreamingListener(tweepy.StreamListener):

    def on_status(self, status):
        if status.lang == 'ja':
            # statusが手に入れたツイート
            print(status.lang)
            mc_ja.make(status)
        elif status.lang == 'en':
            print(status.lang)
            mc_en.make(status)
        elif status.lang == 'und':
            print(status.lang)
            mc_und.make(status)
        else:
            print(status.lang)
    
    def on_error(self, status_code):
        if status_code == 420:
            return False
    

consumer_key    = 'Twitter API申請して取得したConsumer_key'
consumer_secret = 'Twitter API申請して取得したConsumer_secret'
access_token   = 'Twitter API申請して取得したAccess_token'
access_token_secret  = 'Twitter API申請して取得したAccess_secret'
auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_token, access_token_secret)

api = tweepy.API(auth, wait_on_rate_limit = True)

listener = MyStreamingListener()
stream = tweepy.Stream(auth, listener)

now = datetime.datetime.now()
file_name_ja = 'result_sample_from_{0}_ja.csv'.format(now.strftime('%Y-%m-%d_%H-%M')) 
mc_ja = make_csv(file_name_ja)
file_name_en = 'result_sample_from_{0}_en.csv'.format(now.strftime('%Y-%m-%d_%H-%M')) 
mc_en = make_csv(file_name_en)
file_name_und = 'result_sample_from_{0}_und.csv'.format(now.strftime('%Y-%m-%d_%H-%M')) 
mc_und = make_csv(file_name_und)

while True:
    try:
        stream.sample()
    except KeyboardInterrupt:
        stream.disconnect()
        break
    except Exception as e:
        stream.disconnect()
        print(e)