Python

TwitterAPIでツイートを全件取得する方法【Python】

今回はPythonでTwitterAPIを使って特定のユーザーの投稿をすべて取得する方法について解説します。
使用するライブラリはTweepyというライブラリです。

TwitterDeveloperのアカウントさえ取得できれば、非常に簡単にTwitterAPIを使うことができるので、ぜひチャレンジしてみてください!

もくじ

  1. TwitterAPIを使うための準備
  2. Pythonの実行環境の準備
  3. ソースコード
  4. TwitterAPIでユーザーの全投稿を取得する
  5. 配列をTextファイルに書き込む
  6. まとめ

TwitterAPIを使うための準備

PythonでTwitterAPIを使ってデータを抽出するためには、必要なものが3つあります。

1.TwitterAPIのアクセスキーとアクセストークン
2.Pythonの実行環境
3.TwitterAPIを操作するためのライブラリ

TwitterAPIのアクセスキーとアクセストークンは、Twitter Developerに登録すると取得できます。
ただ、年々規約が厳しくなっており、取得の審査にある程度の日数も必要なので注意が必要です。

登録方法がマイナーチェンジを繰り返していることもあり、混乱をさけるためにも今回はTwitterDeveloperの登録方法については割愛します。
ぜひその時点で最新の記事を参考にしていただければと思います。

今だとこちらの記事が参考になります。
Twitter API 登録 (アカウント申請方法) から承認されるまでの手順まとめ 

Pythonの実行環境の準備

今回のコードを動かすにあたって使用した環境は以下の通りです。

Python3.7.3
tweepy==3.8.0

Pythonの環境構築の方法はいくつか種類があります。

Windowsであれば、最近公開されたMicrosoftStore版のPythonや、全部入りのAnacondaなどがおすすめです。

ソースコード

細かい解説は後回しにして、先にコードを貼っておきますね。

こちらのプログラムを動かすと、@yuki_kashiwabaという、僕のTwitterアカウントの投稿を最大2200件取得してくれます。

import tweepy

Consumer_key = 'TwitterAPI登録申請して取得した API key'
Consumer_secret = 'TwitterAPI登録申請して取得したConsumer_secret'
Access_token = 'TwitterAPI登録申請して取得したAccess_token'
Access_secret = 'TwitterAPI登録申請して取得したAccess_secret'

# OAuth認証
auth = tweepy.OAuthHandler(Consumer_key, Consumer_secret)
auth.set_access_token(Access_token, Access_secret)
api = tweepy.API(auth)

#ツイート取得
data = []

#最大2200件のツイートを取得するためのページ
pages = [1,2,3,4,5,6,7,8,9,10,11]

for page in pages:
    results = api.user_timeline(screen_name="yuki_kashiwaba", count=200, page=page)
	for r in results:
		#r.textで、投稿の本文のみ取得する
        data.append(r.text)

line = ''.join(data)
with open("text.txt", 'wt') as f:
    f.write(line)

TwitterAPIでユーザーの全投稿を取得する

では、コードを見てみましょう。

各種トークンさえ用意できれば、後はたったの一行、下のコードを書くだけで投稿を取得できる、・・・はずでした。

#IDが@yuki_kashiwabaというユーザーの投稿を取得
api.user_timeline(screen_name="yuki_kashiwaba")

残念ながら、api.user_timelineというメソッドは、投稿の取得上限が200に制限されているそうです。

あるみ
あるみ
僕のツイート数は2033!全然足りないよ!

もちろん回避策がありました。
この取得制限は、api.user_timelineというメソッドに対する制限なので、Pageの数を増やすことで対応可能です。
Tweepyは、投稿の取得のためにPageという仕組みを用いており、取得上限200というのは、このPageに対する制限のようです。

2020年6月14日 修正

上記の内容に誤りがあり、修正しました。

つまり、Pageの値を指定してあげれば、最大で 200×Pageの数 のツイートを取得できるようになるわけです。

#ツイート取得
data = []

#最大2200件のツイートを取得するためのページ
pages = [1,2,3,4,5,6,7,8,9,10,11]

for page in pages:
    results = api.user_timeline(screen_name="yuki_kashiwaba", count=200, page=page)
    for r in results:
        data.append(r.text)

上のコードでは、僕の2033件のツイートをすべて取得するために、11ページまで参照するように指定していますね。

これで全ツイートを取得することができました!

配列をTextファイルに書き込む

これはおまけです。

取得したツイートを、テキストマイニングなどに使えるようにファイルに保存しましょう。
今回はTextファイルに保存することにします。

line = ''.join(data)
with open("text.txt", 'wt') as f:
    f.write(line)

できました。
Pythonはべんり。

まとめ

今回は、取得したTweetを用いてテキストマイニングを行って、オリジナルのWordcloudを作ろうという企画の一環でした。

今回取得した投稿一覧のTextファイルを使ってWordcloudを作成します。

実はこのプログラムは、WordCloudで自分のツイートをビジュアライズする一環で作ったものでした。

WordCloudの作り方はこちらの記事にまとめてありますので、ぜひ読んでみてください。
Pythonで自分のツイートを分析して、WordCloudをつくる方法

POSTED COMMENT

  1. perilla より:

    こんにちは。
    かしわばゆきさんのソースコードを
    アクセスキーとアクセストークンのみ変更し、実行してみたのですが、
    tweepy.error.TweepError: [{‘code’: 32, ‘message’: ‘Could not authenticate you.’}]
    と出てきます。
    お忙しい中、大変恐れ入りますが、
    アドバイスをして頂けると大変嬉しいです。
    よろしくお願いいたします。

    • Kashiwaba Yuki より:

      コメントありがとうございます。
      回答が大変遅くなり申し訳ありません。

      エラーメッセージを見る限り認証がうまくいっていないようですね…。
      アクセスキーとアクセストークンが正しいかどうか一度確認しみてください。
      もしかしたら、古いトークンを利用している可能性もあるので、TwitterDeveloperからトークンの再発行をしてみると解決するかもしれません。

  2. Moto より:

    こんにちは。
    本記事を参考にさせていただきました。
    おかげさまで、3000件超ものツイートを取得できました。ありがとうございます。

    ところが、過去180日のツイートしか取得できない事象に苛まれており、
    TwitterAPI上の制限?とは睨んでいるのですが、公式のリソースも見つからず・・・。

    お手数おかけしますが、アドバイスを頂戴できると幸いです。
    よろしくお願いいたします。

    • Kashiwaba Yuki より:

      Motoさん、コメントありがとうございます!
      ちなみに本件、どのメソッドをご利用されているでしょうか??
      こちらの記事を見ると、TwitterAPIの無料プランでは7日前まで、有料プランでも180日前までとのことで、こちらが関係あるのではと推察しております。
      https://gaaaon.jp/blog/twitterapi

  3. nekozawa より:

    こんにちは。
    先日ようやくAPI申請が通りましたので、Python練習の為に本記事を参考にさせて頂きました。
    実際にコードを実行してみたところ、
    f.write(line)
    この部分で下記のエラーが表示されしまい解決することが出来ず困っております。。。
    UnicodeEncodeError: ‘ascii’ codec can’t encode characters in position 16-17: ordinal not in range(128)

    無知で申し訳ないのですがご教示頂けますと幸甚です。
    よろしくお願いいたします。m(_ _)m

    • Kashiwaba Yuki より:

      コメントありがとうございます!

      f.write(line)
      ですが、ファイルに line 変数内の文字列を書き込む処理かと存じます。
      このエラーは、文字コードに関連して発生しているエラーですが、 line に格納された文字列の 16-17 番目の文字が日本語などのマルチバイト文字列として解釈されてしまっている可能性が考えられます。
      そのため、ファイル側か文字列側のエンコーディングをUTF-8などに変更すると、問題が解消されるかもしれません。

  4. nekozawa より:

    度々すみません。。
    どうやら何故がpython2を使用してしまっておりましたことが原因のようでした。
    お騒がせしましたm(_ _)m

  5. なんなん より:

    こんにちは。

    大学の研究でツイートを取得するため、本記事を参考に取得をしてみました。
    実行されるのですがファイルには書き込まれていない状況です。

    お手数おかけしますが、アドバイスを頂戴できると幸いです。
    よろしくお願いいたします。

    • Kashiwaba Yuki より:

      コメントありがとうございます。
      ファイルに書き込みがされないということは、ファイルオプションか書き込み関数に問題がある可能性が考えられますね。
      もしよろしければファイル操作を行っている部分の関数のソースコードを教えていただけますと幸いです。
      コメントか、Twitter(@yuki_kashiwaba)までお願いします!

  6. vezel より:

    こんにちは。
    本記事を参考にさせていただきツイートを取得できました。ありがとうございます。

    質問があります。
    収集したツイートから、余分な情報『@~』や『https:~』や改行などを以下の記事を参考『https://hacknote.jp/archives/19937/』に削除しようと思ったのですが、できませんでした。どのようにしたらいいのか、アドバイスを頂きたいです。

  7. vezel より:

    こんにちは。
    本記事を参考にツイートを取得することができました。

    しかし、取得したツイートから余分な文字を削除したいのですが、上手くいきません。以下を参考に行っています。
    https://hacknote.jp/archives/19937/

    お手数おかけしてしまい、大変申し訳ありませんが、ご教授いただければ幸いです。

    • Kashiwaba Yuki より:

      コメントありがとうございます!
      ご参照いただいているページは正規表現を利用して不要な文字を削除する方法なので、上手くいかない場合は正規表現が間違っている可能性がありますね。
      もし不要な文字が特定の文字の場合は、正規表現を使うよりもreplaceを使った方が簡単にできるかもしれません。

      例えばこんな感じで不要な文字を取り除くことができます。
      s = “helXXXlo”
      s.replace(‘XXX’, ”)
      print(s) # hello

      https://note.nkmk.me/python-str-replace-translate-re-sub/

COMMENT

メールアドレスが公開されることはありません。