LoginSignup
4
2

More than 1 year has passed since last update.

tweepyを使って特定のワードの入ったツイートを取得する

Posted at

おはこんばんちわ。

大まかな流れと準備

最終目標

「特定のワードを指定したツイートを取得して、csv形式で保存する。」

裏テーマ「金曜ロードショー放送中のみんなのリアクションが見たい。」

方法

1.Pythonでtweepyを利用し、ツイートデータを取得。
2.欲しいデータのみ抽出。
→今回はツイート本文とツイート時間を取得。
3.データの加工、整理。
4.結果をcsv形式で出力。

準備

・TwitterAPI(v2)のデベロッパーアカウントを取得する。
・Pythonを実行できる環境を用意する。

今回のコードの注意点

・時間指定
→元々のタイムゾーンがutcなので日本時間から-9時間しなければならない。
→TwitterAPIの機能で一週間前までしか遡ることができない。
・検索ワードのAND,ORなど
→できると思いますが、今回は割愛します。

コード

import tweepy
import pandas as pd
import datetime as dt
import time
from datetime import timedelta

# 認証 
api_key = '自分のtwitterAPIのコード'
api_key_secret = '自分のtwitterAPIのコード'
access_token = '自分のtwitterAPIのコード'
access_token_secret = '自分のtwitterAPIのコード'
bearer_token = '自分のtwitterAPIのコード'

# 接続
client = tweepy.Client(
    consumer_key=api_key,
    consumer_secret=api_key_secret,
    access_token=access_token,
    access_token_secret=access_token_secret,
    bearer_token=bearer_token)
# 関数化を行った
# 変数には検索ワード、保存するcsvの名前,時間を入力する。
def comment_log(tag,name,year=2022,month=11,day=26,hour_s=12,hour_e=15,minute=00,second=00):
    movie_text =[]
    movie_time =[]
    dt_s = dt.datetime(year,month,day,hour_s,minute,second)
    dt_e = dt.datetime(year,month,day,hour_e,minute,second)
    dt_s_str = dt.datetime.strftime(dt_s,"%Y-%m-%dT%H:%M:%SZ")
    dt_e_str = dt.datetime.strftime(dt_e,"%Y-%m-%dT%H:%M:%SZ")
    first_flg = True
    while True:
        #このお休みが大事
        time.sleep(1)
        #1周目
        if first_flg == True:
            tweets = client.search_recent_tweets(query=tag + ' - 視聴認定バッジ',
                                        max_results=100,
                                        tweet_fields=["created_at"],
                                        start_time = dt_s_str,
                                        end_time = dt_e_str)
            first_flg = False
        # 2周目以降
        else:
            tweets = client.search_recent_tweets(query=tag + ' - 視聴認定バッジ',
                                        max_results=100,
                                        tweet_fields=["created_at"],
                                        pagination_token=next_token,
                                        start_time = dt_s_str,
                                        end_time = dt_e_str)

        # 本文と時間のリストにそれぞれ追加していく
        if tweets is not None:
            for tweet in tweets[0]:
                movie_text.append(tweet.text)
                movie_time.append(tweet.created_at)

        # ここで次の100件を取得するためのトークンを取得
        try:
            next_token = tweets.meta['next_token']
        except KeyError:
            break

    # DataFrameを作成しつつ、タイムゾーンを日本に変更
    df = pd.DataFrame(data={'時間':movie_time})
    df['時間'] = df['時間'].dt.tz_convert('Asia/Tokyo')
    df['本文'] = movie_text
    # csv形式で保存
    df.to_csv(name+'.csv')

参考


自分で試行錯誤してコードを完成させること自体はじめてに近い経験だったので、
承認欲求のようなものが生まれて今回この話題で書かせてもらいました。
自分の中に落とし込むことも難しかったのに、見えない人に対して文字で説明することは考えていたよりも不自由で困難でしたが、良い経験になったと思います。
この投稿の内容自体やコードの内容にも色々と不備あると思いますが、
どうか生暖かい目で見てやってください。
あざした。

4
2
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
2