Tweepyで「いいね」○○件超えのツイートをExcelに出力する方法

2020年10月26日

Python
Tools

Twitter APIとPython + Tweepyで「いいね」○○件超えのツイートをExcelに出力してみた!!

どうも、テック備忘LOGのYuki(@tech_bibo_log)です!!

前回のWebスクレイピングで取得したYahoo 天気!の情報をTwitter APIを使用して自動ツイートしてみた記事の続きとして、 ツイッター分析を行うデータを集めるためのPythonプラグラムを作成してみました!!


▽▽▽ Twitter Botを作成した時のお話し ▽▽▽



今回はTwitter認証の部分から、少しだけ詳しくかみ砕いて説明していきたいと思います。

Yuki

この記事で分かること

  • 簡単なTwitter APIの仕様について
  • Pythonで大量のツイートを取得する方法
  • PythonでExcelファイルを生成する方法


実行環境があれば手順通りの作業であなたも実装できますので、お試しあれ!!
もっと良いコードの書き方がありましたら、ご教授頂けると泣いて喜びます!
Pythonもっと詳しくなりたい!

では、始めましょう!!

[ 目次 (開く) ]

まずは環境を整える

今回使用した環境は次の通りです:
1. ConoHa VPS(CentOS8)
2. python 3.6.8
3. pip 20.0.2 (from /usr/local/lib/python3.6/site-packages/pip (python 3.6))
4. django-environ 0.4.5
5. pandas 1.1.3 6. tweepy 3.9.0

まだLinux環境が無い方は、次の記事を参考にしてください。

▽▽▽ サーバーを用意した時のお話し ▽▽▽



1.tweepyなど各種モジュールをインストールしよう!!

まずは、後々Twitter APIからツイートをする際に使用するtweepyやその他必要なモジュールをインストールしておきます。

pandasには取得したツイートを変換してExcelに出力してもらいます。
次のコマンドを実行しましょう。

# pip install tweepy
# pip install pandas
# pip install django-environ

バージョンの確認方法は次のようにします。

# pip show tweepy
# pip show pandas
# pip show django-environ

Twitter APIの認証処理を実装

Twitterにて外部からツイートを取得したりする場合、Twitter APIを使用しますが、 その際には必ずAPIにてツイッターのアカウント認証を行う必要があります。


アカウントにログインするのと同じようなものですね。
認証が成功したらAPIをコールすることが出来るようになります。


処理の流れは次のようになります。

Twitter APIでツイートを取得するまでの流れ

  • TwitterのAPIアカウント認証
  • ツイートを取得する



1.Tweepyを使用する準備をしよう!

それでは早速、APIのアカウント認証部分を実装していきます。
まず、Tweepyを使用するのでimport tweepyとしましょう。

次にTwitter APIで認証する為に必要な4つのキーを変数に入れておきます。
environを使用して、シークレットキーなどを環境変数から取り出します。

.envファイルをプロジェクト直下に作成します。

# cd /hoge/FamousTweetGetter
# touch .env


以下の内容を入力して保存。

FamousTweetGetter/.env
import tweepy
 
# Twitter APIを使用するためのConsumerキー、アクセストークン設定
CONSUMER_KEY=AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
CONSUMER_SECRET=BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
ACCESS_TOKEN=CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
ACCESS_SECRET=DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD


2.APIのアカウント認証処理を実装しよう!

認証部分の処理を実装していきます。
モジュールを使用しているため、とても簡潔に書くことが出来ます。
書き方は決まっているので、深く理解する必要はないですが、興味があればOAuthHandlerAPI関数の中身を覗いてみてください。

まずはConsumer_keyとConsumer_secretを渡してOAuthHandlerインスタンスを作成します。
次にOAuthHandlerにAccess_tokenとAccess_secretをセットし、API制限に引っかかった時の為にwait_on_rate_limitwait_on_rate_limit_notifyを設定してます。

get_famous_tweets.py
import tweepy
import environ
 
########################################
##  環境変数の.envファイルを読み込み    ##
########################################
BASE_DIR = environ.Path(__file__) - 1
env = environ.Env()
env_file = str(BASE_DIR.path('.env'))
env.read_env(env_file)
 
########################################
## Twitter API                        ##
## Consumerキー、アクセストークン設定   ##
########################################
CONSUMER_KEY = env('CONSUMER_KEY')
CONSUMER_SECRET = env('CONSUMER_SECRET')
ACCESS_TOKEN = env('ACCESS_TOKEN')
ACCESS_SECRET = env('ACCESS_SECRET')
 
def twitter_auth():
    """Twitter 認証
    Return Tweepy: api
    """
    # 各種 認証用のKeyをセットし、セッションを生成
    auth = tweepy.OAuthHandler(Consumer_key, Consumer_secret)
    auth.set_access_token(Access_token, Access_secret)
    api = tweepy.API(auth, wait_on_rate_limit=True, wait_on_rate_limit_notify=True)
 
    return api



Twitter APIで大量のツイートを取得する処理を実装

これからツイート取得部分の実装をしていきます。
API制限を考慮しながらコーディングしていきます。

1.API制限について

Twitter APIでは各種プランや使用制限が設けられており、APIを使用できる回数が制限されています。
15分に1回リセットされますので、大量のツイートを取得する場合はインターバルを設ける必要があります。


2.ツイートを取得する処理を実装しよう!(準備編)

今回私が作成したプログラムでは以下のセッティングが必要ですので、コーディングしていきます。
1 - GET_TWEET_CNT:取得するツイート数
2 - RANGE_CNT:ループ回数
   GET_TWEET_CNT × RANGE_CNT = 処理するツイート総数
3 - SET_FAV_CNT:「いいね」の条件値を設定

また、import timeimport datetimeも使用するので追記します。
更に、Excelのヘッダー情報をセットします。

get_famous_tweets.py
import tweepy
import environ
 
import logging
import time
import datetime
 
 
########################################
##  環境変数の.envファイルを読み込み    ##
########################################
BASE_DIR = environ.Path(__file__) - 1
env = environ.Env()
env_file = str(BASE_DIR.path('.env'))
env.read_env(env_file)
 
########################################
##    ロガーを呼出し、ファイル出力      ##
########################################
logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)
h = logging.FileHandler('FamousTweetGetter.log')
logger.addHandler(h)
 
########################################
## Twitter API                        ##
## Consumerキー、アクセストークン設定   ##
########################################
CONSUMER_KEY = env('CONSUMER_KEY')
CONSUMER_SECRET = env('CONSUMER_SECRET')
ACCESS_TOKEN = env('ACCESS_TOKEN')
ACCESS_SECRET = env('ACCESS_SECRET')
 
# 処理実行日
now_date = datetime.datetime.now()
now_date_str = now_date.strftime("%Y_%m_%d_%H%M")
 
# エクセルのヘッダーカラム名を定義
COLUMNS_NAME = ['ツイート時間', 'ツイート内容', 'いいね数', 'リツイート', 'ユーザー名', 'ユーザーID', 'フォロー数', 'フォロワー数']
 
# 取得するツイート数
GET_TWEET_CNT = 5000
 
# ループ回数
RANGE_CNT = 50
 
# 取得する「いいね」数の条件
SET_FAV_CNT = 100
 
 
def twitter_auth():
    """Twitter 認証
    Return Tweepy: api
    """
    # 各種 認証用のKeyをセットし、セッションを生成
    auth = tweepy.OAuthHandler(Consumer_key, Consumer_secret)
    auth.set_access_token(Access_token, Access_secret)
    api = tweepy.API(auth, wait_on_rate_limit=True, wait_on_rate_limit_notify=True)
 
    return api



3.ツイートを取得する処理を実装しよう!(取得編 その1)

それでは実際にツイートを取得していきます。 処理の流れは次の通りです。

Twitter APIでツイートを取得するまでの流れ

  • search_wordに検索するワードを入れておきます。
  • over_100_favには「いいね」100件越えのツイートデータを格納していきます。
  • for loop in range(RANGE_CNT):を使用して何周も回していきます。
  • 変数max_idを0で初期化しておきます。※各ループ開始時と終了時に更新する
    ※max_idを使って、max_idより新しいツイートを取得することで重複データの取得を回避します。
  • 関数limit_handledでリストのデータを処理していきます。
  • list(tweet.text)[:4] != ['R', 'T', ' ', '@']でリツイートを除外
  • tweet.favorite_count >= 100で「いいね」100件以上のみに絞る
  • 該当するデータのみover_100_favにappendして格納
  • pandasover_100_favをデータフレーム型に変換
  • to_excel関数でExcelに出力


あとはget_tweetsっという関数名でツイート取得処理を実装していきます。
詳細は上述した通りですので、コメント文を参考にしていただければと思います。

get_famous_tweets.py
import tweepy
import pandas as pd
import environ
 
import logging
import time
import datetime
 
 
########################################
##  環境変数の.envファイルを読み込み    ##
########################################
BASE_DIR = environ.Path(__file__) - 1
env = environ.Env()
env_file = str(BASE_DIR.path('.env'))
env.read_env(env_file)
 
########################################
##    ロガーを呼出し、ファイル出力      ##
########################################
logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)
h = logging.FileHandler('FamousTweetGetter.log')
logger.addHandler(h)
 
########################################
## Twitter API                        ##
## Consumerキー、アクセストークン設定   ##
########################################
CONSUMER_KEY = env('CONSUMER_KEY')
CONSUMER_SECRET = env('CONSUMER_SECRET')
ACCESS_TOKEN = env('ACCESS_TOKEN')
ACCESS_SECRET = env('ACCESS_SECRET')
 
# 処理実行日
now_date = datetime.datetime.now()
now_date_str = now_date.strftime("%Y_%m_%d_%H%M")
 
# エクセルのヘッダーカラム名を定義
COLUMNS_NAME = ['ツイート時間', 'ツイート内容', 'いいね数', 'リツイート', 'ユーザー名', 'ユーザーID', 'フォロー数', 'フォロワー数']
 
# 取得するツイート数
GET_TWEET_CNT = 5000
 
# ループ回数
RANGE_CNT = 50
 
# 取得する「いいね」数の条件
SET_FAV_CNT = 100
 
 
def twitter_auth():
    """Twitter 認証
    Return Tweepy: api
    """
    # 各種 認証用のKeyをセットし、セッションを生成
    auth = tweepy.OAuthHandler(Consumer_key, Consumer_secret)
    auth.set_access_token(Access_token, Access_secret)
    api = tweepy.API(auth, wait_on_rate_limit=True, wait_on_rate_limit_notify=True)
 
    return api
 
 
def get_tweets(api):
    """ツイートデータ取得"""
    search_word = 'プログラミング'
    over_100_fav = []
    max_id = 0
 
    def limit_handled(cursor):
        while range(GET_TWEET_CNT):
            try:
                yield next(cursor)
            except tweepy.RateLimitError:
                time.sleep(15 * 60)
            except Exception as e:
                print(e)
                logger.debug(e)
                break
 
    for loop in range(RANGE_CNT):
        print(f"----------{loop + 1}周目 max_id: {max_id}----------")
        i = 0
        for tweet in limit_handled(
                tweepy.Cursor(api.search, q=search_word, exclude_replies=True, max_id=max_id - 1).items(GET_TWEET_CNT)):
            print(i)
            if max_id == 0 or i == (GET_TWEET_CNT - 1):
                max_id = tweet.id
                print(f"max_id更新: {max_id}")

            if list(tweet.text)[:4] != ['R', 'T', ' ', '@'] and tweet.favorite_count >= SET_FAV_CNT:
                print(str(i) + ":  " + tweet.text.replace('\n', ''))
                # ['ツイート時間', 'ツイート内容', 'いいね数', 'リツイート', 'ユーザー名', 'ユーザーID', 'フォロー数', 'フォロワー数']
                over_100_fav.append([tweet.created_at,
                         tweet.text.replace('\n', ''),
                         tweet.favorite_count,
                         tweet.retweet_count,
                         tweet.user.name,
                         tweet.user.screen_name,
                         tweet.user.friends_count,
                         tweet.user.followers_count,
                         ])

            if i == (GET_TWEET_CNT - 1):
                i = 0
                break

            i += 1

        # pandasで[over_100_fav]をデータフレーム型に変換 ⇒ [df]に格納
        df = pd.DataFrame(over_100_fav, columns=COLUMNS_NAME)

        # pandasで[df]をExcelに出力
        df.to_excel(f'いいね100超ツイート分析データ_{now_date_str}.xlsx', sheet_name='Sheet1')
        logger.debug('ツイートを取得しました。')



################################
##         処理を行う          ##
################################
if __name__ == '__main__':
    start = time.time()
    logger.debug(f'---------- 処理開始 ----------')

    api = twitter_auth()

    get_tweets(api)

    logger.debug('処理時間:' + str(time.time() - start))
                 



以上で実装は終了です。実行してみましょう!

Yuki



まとめ

これで「Tweepyで「いいね」○○件超えのツイートをExcelに出力する方法」の説明は以上です。
いかがでしたでしょうか?!

前回の「Twitter Bot」同様、実際にやっていることはシンプルなので、ゆっくりと理解していただければと思います!!
公開できるほどのPython使いではないので、ロジック周りは改善するところがたくさんありそうですが、ひとまず目的は達成することが出来ました!
凄腕プログラマーさんの実装したプログラムを読んでみたいな~と切実に思います。笑

それでもやっぱりPythonは初心者にはやさしい言語なので、挑戦してみて欲しいですし、 いっぱい書いて書きまくって腕を上げていきましょう!!

初心者の方は是非、一度上記のコードをコピペして動かしてみて、さらに一つ一つ理解しながらリタイピングしてみてくださいね!!
ご指摘や質問があれば(@tech_bibo_log)までお願い致します。
※私もPythonは勉強中なのでもっと良い書き方があればぜひ教えてください!よろしくお願いします。

Yuki



では、最後にもう手順を一度おさらいしましょう。

Twitter APIでツイートを取得するまでの流れ

  • `search_word`に検索するワードを入れておきます。
  • `over_100_fav`には「いいね」100件越えのツイートデータを格納していきます。
  • `for loop in range(RANGE_CNT):`を使用して何周も回していきます。
  • 変数`max_id`を0で初期化しておきます。※各ループ開始時と終了時に更新する
    ※max_idを使って、max_idより新しいツイートを取得することで重複データの取得を回避します。
  • 関数`limit_handled`でリストのデータを処理していきます。
  • `list(tweet.text)[:4] != ['R', 'T', ' ', '@']`でリツイートを除外
  • `tweet.favorite_count >= 100`で「いいね」100件以上のみに絞る
  • 該当するデータのみ`over_100_fav`にappendして格納
  • `pandas`で`over_100_fav`をデータフレーム型に変換
  • `to_excel`関数でExcelに出力



私にやってみて欲しいネタとかあれば、(@tech_bibo_log)までDMお待ちしております!!
それでは、ありがとうございました!