芋の独り言

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

PythonでTwitterからキーワード検索でツイート文を収集する

kusoimox.hatenablog.jp 前記事では,毎時(秒かな?それとももっと短い間隔かもしれないが...)ランダムにツイート文を収集するスクリプトでした.今回はキーワード検索で得られるツイート文を一週間程度 遡って収集するスクリプトになります.キーワード検索のキーワードは,通常クエリと言われます(たぶん...情報検索の分野で一般に用いられる用語です).実は前回のスクリプトの前に書いたもので, ”アベンジャーズ エンドゲーム”の反応を見れないかなーと思って書いたものでした.しかし,一週間程度遡るのに,キーワードによっては数日程度,配列に入っているキーワード全てやるなら一週間以上かかってしまうので, データ収集としてはちょっと使えんかなーと思いました.とはいっても,使い道があるかもしれないので,本記事では紹介します.以下スクリプトですー.

#-*- 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",
                "reply_id",
                "language"
                ] # ヘッダー
            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.in_reply_to_status_id,
                tweet.lang
                ]
            
            writer.writerow(body) # を書き込む

def search(api,word,lang):
    now = datetime.datetime.now()
    file_name = 'result_{0}_{1}.csv'.format(word,now.strftime('%Y-%m-%d_%H-%M'))    
    mc = make_csv(file_name)
    try:
        tweet_data = api.search(q=word, count=100, lang=lang)
    except tweepy.error.TweepError as tweeperror:
        print(tweeperror)
        
    for tweet in tweet_data:
        mc.make(tweet)
    next_max_id = tweet_data[-1].id
    i = 1
    sleep(1)
    while True:
        i += 1
        print('検索ページ:' + str(i))
        try:
            tweet_data = api.search(q=word, count=100, max_id=next_max_id-1, lang=lang)
        except tweepy.error.TweepError as tweeperror:
            print(tweeperror)
            sleep(60)
            continue
        try:da
            next_max_id = tweet_data[-1].id
            post_date = tweet_data[-1].created_at + datetime.timedelta(hours=+9)
        except IndexError as ie:
            print(ie)
            break
        for tweet in tweet_data:
            mc.make(tweet)
            
        if (post_date - now) > datetime.timedelta(days=10):
            break
        else:
            sleep(1)

def __init__():
    place = api.geo_search()
    

consumer_key    = 'Twitter API申請して取得したConsumer_key'
consumer_secret = 'Twitter API申請して取得したConsumer_secret'
access_token   = 'witter 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)


wordlist=[
    'アベンジャーズ',
    'エンドゲーム',
    'キャプテンアメリカ',
    'ブラックウィドウ',
    'アイアンマン',
    'ハルク',
    'ウォーマシン',
    'ネビュラ',
    'ロケットラクーン',
    'アントマン',
    'ローニン',
    'ホークアイ',
    'ソー',
    'サノス'
    ]
for word in wordlist:
    search(api,word,lang='ja')


wordlist=[
    'Avengers',
    'endgame',
    'captain america',
    'black widow',
    'iron man',
    'hulk',
    'war machine',
    'nebula',
    'rocket raccon',
    'ant-man',
    'ronin',
    'hawkeye',
    'thor',
    'thanos'
    ]
for word in wordlist:
    search(api=api,word=word,lang='en')

各々で配列wordlistの中身を変えてくだされば,変えた内容のキーワード検索でツイート文を収集できます.変数langも変更すれば,取得できる言語も変わりますよー.結果は前記事と同じくcsvファイルで出力されます. 何か改善点があればコメントの方で指摘してくださると助かりますー.

参考サイト

  1. Twitterのつぶやきを一度に大量取得する - Qiita
  2. スタバのTwitterデータをpythonで大量に取得し、データ分析を試みる その1 - Qiita
  3. tweepyでツイッターのキーワード検索して、結果をエクセルに書き込む - Qiita
  4. Twitter APIをpythonで使うと〇〇ができる。 - どん底から這い上がるまでの記録
  5. Twitterのトレンドを取得する際に指定できる日本の都市 - Qiita
  6. GetOldTweets-python 1週間以上前の過去ツイートを取得しちゃう#2 - Qiita
  7. ツイッターで指定ユーザーの過去の全ツイートを取得 · GitHub