PythonによるTwitter過去ツイートの検索方法

PythonによるTwitter過去ツイートの検索方法 データ分析

「Twitterの過去ツイートを検索したい」
「特定のキーワードを含む過去1年分ツイートを取得したい」
「TwitterのAPIを使わずにPythonでツイートを収集したい」

このような場合には、この記事が参考となるでしょう。
この記事では、Twitter過去ツイートを検索する方法を解説しています。
もちろん、Pythonを用いてデータ収集するための方法です。

本記事の内容

  • TwitterのAPIを使わずに検索する
  • 【サンプルコード】Twitter過去ツイートの検索

それでは、上記に沿って解説していきます。

TwitterのAPIを使わずに検索する

TwitterのAPIは、制限が多すぎて使い物になりません。
特にデータ収集を行う上では、全く使えません。

そこで、スクレイピングをしようと考えがちです。
実際、私も過去にそのようにしています。

ただ、スクレイピングは動き続ける保証がありません。
デザイン変更されたら、その時点でアウトになる可能性があります。

上記記事のコードが、動くかどうかも怪しいです。
そのこともあり、スクレイピングのコードは使い捨ての気持ちで書いています。

そんな状況において、スクレイピングよりも安定感のある方法があると聞いたらどう思いますか?
もちろん、その方法を採用したいと思います。

その方法は、非公式のTwitter APIを利用するという方法です。
そして、その非公式のAPIを便利に使えるライブラリが存在しています。

そのライブラリは、stweetと言います。
stweetについては、次の記事で詳細を解説しています。

stweetのインストールが完了したら、実際に過去ツイートを検索しましょう。

【サンプルコード】Twitter過去ツイートの検索

過去ツイートを検索するコードは、以下。

import stweet as st
import arrow

# キーワード(複数の場合は半角スペースで区切る) 
KEYWORD = "広瀬 アリス すず"


def try_search(keyword, since, until):
    # ファイル名 
    file_name = since.format('YYYYMMDDHH') + "-" + until.format('YYYYMMDDHH') + ".txt"
    # 検索条件 
    search_tweets_task = st.SearchTweetsTask(
        all_words=KEYWORD,
        since=since,
        until=until,
        language=st.Language.JAPANESE,
        replies_filter=st.RepliesFilter.ONLY_ORIGINAL
    )
    # 出力形式の設定 
    output_jl_tweets = st.JsonLineFileRawOutput(file_name)
    output_print = st.PrintRawOutput()
    # 処理実行 
    st.TweetSearchRunner(search_tweets_task=search_tweets_task,
                         tweet_raw_data_outputs=[output_print, output_jl_tweets],
                         user_raw_data_outputs=[]).run()


if __name__ == '__main__':
    # 対象日時 
    from_datetime = arrow.Arrow(2020, 10, 1, 00, 00, 00)
    to_datetime = from_datetime.shift(hours=+1)
    try_search(KEYWORD, from_datetime, to_datetime)

上記を実行すると、20201001-20201002.txtという名前のファイルが作成されます。
そのファイルには、現時点では約10件のツイート情報が保存されています。

では、コードを説明していきます。

# キーワード(複数の場合は半角スペースで区切る) 
KEYWORD = "広瀬 アリス すず"

検索したいキーワードを設定します。
コメントにあるように、半角スペースで区切ります。

そして、次がこのコードでは最もポイントになります。
ツイートを検索(取得)する上での、考え方のポイントです。

    # 対象日時 
    from_datetime = arrow.Arrow(2020, 10, 1, 00, 00, 00) 
    to_datetime = from_datetime.shift(hours=+1) 
    try_search(KEYWORD, from_datetime, to_datetime)

Arrowを用いて日時を設定しています。
Arrowについては、次の記事で説明しています。

開始日時と終了日時を用意しています。
stweetでは、最大で100前後のツイートが取得できます。
おそらく、それは非公式APIの仕様でもあるのでしょう。

そのため、サンプルコードでは1時間単位で刻むように検索するようにしています。
1時間で刻めば、余程のビッグワードでない限り漏らさずに取得できるはずです。

1時間でも100個以上を超えるなら、10分間隔に設定すればいいでしょう。
ツイートが多い時間帯は、細かく刻むという具合ですね。

最後に、次の部分を説明しておきます。

  # 検索条件 
    search_tweets_task = st.SearchTweetsTask( 
        all_words=KEYWORD, 
        since=since, 
        until=until, 
        language=st.Language.JAPANESE, 
        replies_filter=st.RepliesFilter.ONLY_ORIGINAL 
    )

以下は、AND条件の検索を示しています。

all_words=KEYWORD

今回のキーワードでは、「広瀬 and アリス and すず」ということです。
すべてのワードが入っているツイートを対象にすることになります。

それとは異なり、OR条件で検索する場合は以下のように記述します。
「広瀬 or アリス or すず」で検索する場合ですね。

any_word=KEYWORD

あと、一つ次の指定方法が存在します。

exact_words=KEYWORD

「広瀬 →アリス→すず」
この順番通りにすべてのワードが存在するツイートを検索します。
なかなか、使う機会はないと思いますけどね。

なお、今回は言語を日本語に絞って検索しています。
全言語を対象にするなら、次の指定は不要となります。

language=st.Language.JAPANESE,

また、リプライは除去して検索しています。

replies_filter=st.RepliesFilter.ONLY_ORIGINAL

逆にリプライだけにしたい場合は、「ONLY_REPLIES」を選びます。
すべて対象にするなら、「replies_filter」自体を指定しません。

ここまでの説明が理解できれば、サンプルコードを使うことが可能です。
このコードを活用して、Twitter過去ツイートをガンガンと取得していきましょう。

以上、サンプルコードを用いてTwitter過去ツイートの検索について説明しました。

タイトルとURLをコピーしました