【コピペするだけ!】Pythonでツイート情報を取得する方法【初心者でも簡単】

pythonでtwitter情報を取得

目次目次[閉じる]

この記事の目的

この記事は、PythonでTwitterの分析をすることを目的としています。

この内容は4部構成となっていて、今回は2番目の内容となっています。

全体の流れ
  1. Twitter APIの利用申請
  2. Tweepyでツイートを取得
  3. 定期実行でツイートの大量取得
  4. データの加工、分析・可視化

ツイートの流れ

Twitter APIの申請

ツイート情報を取得するためにTwitter APIを使用します。

コードの中で以下の4つを用意する必要がありますが、これには事前申請が必要です。

  • APIキー
  • APIシークレット
  • アクセスキー
  • アクセスシークレット

事前申請の方法については以下の記事でまとめているので、こちらから設定をしてください。

今回取得するデータ

今回Twitterから取得する情報は以下の「ツイート情報」と「ユーザ情報」の2つです。

ツイートの情報
  • ツイートのID
  • ツイートした時刻
  • いいねされた数
  • リツイートされた数
  • ツイート内容
ユーザーの情報
  • ID
  • ユーザー名
  • アカウント名
  • 自己紹介文
  • フォロー数
  • フォロワー数
  • アカウント作成日時
  • 自分がフォローしているか?
  • アイコン画像のURL
  • ヘッダー画像のURL
  • WEBサイト

これらの情報をツイートごとに取得し、最終的にはCSVファイルに出力します。

パパ
これだけの情報があればかなり分析できそう!

それでは、コードを見てきましょう!

全体コード構成(コピペOK)

まずは、全体のコードです。コピペで動きます。

#ライブラリのインポート
import tweepy
from datetime import datetime,timezone
import pytz
import pandas as pd


#Twitterの認証
api_key = "****************************"
api_secret = "*************************"
access_key = "*************************"
access_secret = "**********************"

auth = tweepy.OAuthHandler(api_key, api_secret)
auth.set_access_token(access_key, access_secret)
api = tweepy.API(auth)      

#検索条件の設定
searchkey = 'プログラミング'
item_num = 10

#検索条件を元にツイートを抽出
tweets = tweepy.Cursor(api.search,q=searchkey,lang='ja').items(item_num)


#関数: UTCをJSTに変換する
def change_time_JST(u_time):

    #イギリスのtimezoneを設定するために再定義する
    utc_time = datetime(u_time.year, u_time.month,u_time.day, \
    u_time.hour,u_time.minute,u_time.second, tzinfo=timezone.utc)

    #タイムゾーンを日本時刻に変換
    jst_time = utc_time.astimezone(pytz.timezone("Asia/Tokyo"))

    # 文字列で返す
    str_time = jst_time.strftime("%Y-%m-%d_%H:%M:%S")

    return str_time

#抽出したデータから必要な情報を取り出す
#取得したツイートを一つずつ取り出して必要な情報をtweet_dataに格納する
tweet_data = []
for tweet in tweets:

    #ツイート時刻とユーザのアカウント作成時刻を日本時刻にする
    tweet_time = change_time_JST(tweet.created_at)
    create_account_time = change_time_JST(tweet.user.created_at)

    #tweet_dataの配列に取得したい情報を入れていく
    tweet_data.append([
        tweet.id,
        tweet_time,
        tweet.text,
        tweet.favorite_count, 
        tweet.retweet_count, 
        tweet.user.id, 
        tweet.user.screen_name,
        tweet.user.name,
        tweet.user.description,
        tweet.user.friends_count,
        tweet.user.followers_count,
        create_account_time,
        tweet.user.following,
        tweet.user.profile_image_url,
        tweet.user.profile_background_image_url,
        tweet.user.url
                       ])

#取り出したデータをpandasのDataFrameに変換
#CSVファイルに出力するときの列の名前を定義
labels=[
    'ツイートID',
    'ツイート時刻',
    'ツイート内容',
    'いいね数',
    'リツイート数',
    'ID',
    'ユーザID',
    'アカウント名',
    '自己紹介文',
    'フォロー数',
    'フォロワー数',
    'アカウント作成日時',
    '自分がフォローしているか?',
    'アイコン画像URL',
    'ヘッダー画像URL',
    'WEBサイト'
    ]

#tweet_dataのリストをpandasのDataFrameに変換
df = pd.DataFrame(tweet_data,columns=labels)

#CSVファイルに出力する
#CSVファイルの名前を決める
file_name='tweet_data.csv'

#CSVファイルを出力する
df.to_csv(file_name,encoding='utf-8-sig',index=False)

コードの全体的な構成は以下のようになっています。

  1. ライブラリのインポート
  2. Twitter APIの認証
  3. 検索条件の設定、ツイート取得
  4. 必要な情報の抽出
  5. pandasのDataFrameに変換
  6. CSVファイルに出力
パパ
それぞれのパートを説明していくよ!

コードの説明

ライブラリのインポート

import tweepy
from datetime import datetime,timezone
import pytz
import os
import pandas as pd

今回のメインとなるライブラリが「tweepy」です。 このライブラリを使えば、ツイート情報をたった数行のコードで取得できちゃいます!

「pip install tweepy」でインストールしておいてください。 他のライブラリの以下の目的でインポートしています。

  • datetime => 時刻を扱う
  • pytz => タイムゾーンの変更
  • os => フォルダの位置取得
  • pandas => 取得データの加工

Twitterの認証設定

api_key = "****************************"
api_secret = "*************************"
access_key = "*************************"
access_secret = "**********************"

auth = tweepy.OAuthHandler(api_key, api_secret)
auth.set_access_token(access_key, access_secret)
api = tweepy.API(auth)

ここでは、Twitter APIの認証を行います。

何をやっているかざっくり言うと、

パパ
先日、APIの申請をした〇〇です!API使わせてください!

というイメージです。

コード自体の理解は不要なので、「※※※※」の部分に、事前に取得したキーを入力してください。

これでTwitter APIを使う準備は完了です。

検索条件の設定、ツイート取得

#検索条件の設定
searchkey = 'プログラミング'
item_num = 10

#検索条件を元にツイートを抽出
tweets = tweepy.Cursor(api.search,q=searchkey,lang='ja').items(item_num)

なんと、たったこの数行でツイートを取得したことになります。

あこ
こんな短いコードで...

検索条件として以下の2つを入力してください。

  • searchkey = “検索したいキーワード”
  • item_num = 取得したいツイート数

ただし、一度に取得できるツイートは最大900件までです。

また、取り出せるツイートの累計数も15分ごとに制限があります

制限を超えてしまった場合は、15分でまたリセットされます。

制限についての詳細はこちらの公式ドキュメントを参照ください。

設定した条件で取り出されたツイートは「tweets」という変数に代入しています。

必要な情報の抽出

#取得したツイートを一つずつ取り出して必要な情報をtweet_dataに格納する
tweet_data = []
for tweet in tweets:

    #ツイート時刻とユーザのアカウント作成時刻を日本時刻にする
    tweet_time = change_time_JST(tweet.created_at)
    create_account_time = change_time_JST(tweet.user.created_at)

    #tweet_dataの配列に取得したい情報を入れていく
    tweet_data.append([
        tweet.id,
        tweet_time,
        tweet.text,
        tweet.favorite_count, 
        tweet.retweet_count, 
        tweet.user.id, 
        tweet.user.screen_name,
        tweet.user.name,
        tweet.user.description,
        tweet.user.friends_count,
        tweet.user.followers_count,
        create_account_time,
        tweet.user.following,
        tweet.user.profile_image_url,
        tweet.user.profile_background_image_url,
        tweet.user.url
                       ])

先ほど取得した「tweets」から必要な情報を取り出していきます。

変数「tweets」には複数のツイートの情報が入っているので、これをfor文で一つずつ取り出して「tweet」という変数にして、情報を取り出します。

変数「tweet」からの情報の取り出し方は、主に以下の2通りです。

  • tweet.〇〇 => ツイートの情報を取得
  • tweet.user.〇〇 => 投稿者の情報を取得

それぞれ例を挙げると

  • tweet.text => ツイート内容を取得
  • tweet.user.name => ユーザーのアカウント名を取得

というように情報が取得できます。

パパ
とっても簡単ですね!

取り出した情報を「tweet_data」という名前の配列に入れていきます。

以下のような表をイメージしていただければOKです。

2次元配列のイメージ

注意:時刻はイギリス時刻になっている

今回取得するデータのうち以下の2つの時刻はイギリス時間(UTC)になっています。

  • ツイート時刻
  • アカウント作成時刻

これらは日本時間(JST)に直してあげる必要があります。

今回のコードには日本時間に直す「change_time_JST」という関数を作ってあります。

def change_time_JST(u_time):  

    #イギリスのtimezoneを設定するために再定義する
    utc_time = datetime(u_time.year, u_time.month,u_time.day, \
    u_time.hour,u_time.minute,u_time.second, tzinfo=timezone.utc)

    #タイムゾーンを日本時刻に変換
    jst_time = utc_time.astimezone(pytz.timezone("Asia/Tokyo"))

    # 文字列で返す
    str_time = jst_time.strftime("%Y-%m-%d_%H:%M:%S")

    return str_time

関数の説明は、ここでは説明しませんが、UTCをJSTに変換する装置だと思ってもらえればOKです。

関数の説明

以下の2行で、ツイート時刻とアカウント作成日時を日本時間に変更しています。

tweet_time = change_time_JST(tweet.created_at)
create_account_time = change_time_JST(tweet.user.created_at)

pandasのDataFrameに変換

#CSVファイルに出力するときの列の名前を定義
labels=[
    'ツイートID',
    'ツイート時刻',
    'ツイート内容',
    'いいね数',
    'リツイート数',
    'ID',
    'ユーザID',
    'アカウント名',
    '自己紹介文',
    'フォロー数',
    'フォロワー数',
    'アカウント作成日時',
    '自分がフォローしているか?',
    'アイコン画像URL',
    'ヘッダー画像URL',
    'WEBサイト'
    ]

#tweet_dataのリストをpandasのDataFrameに変換
df = pd.DataFrame(tweet_data,columns=labels)

最初に扱った「tweet_data」はPythonの「リスト」という形式です。

これをpandasの「DataFrame」という形式に変えていきます。

パパ
どちらも先ほど見た「表」のようなものです。

このDataFrameに変換することで、後々加工が便利になります。

データ加工の例
  • データの結合
  • ユーザーごとに集計
  • 不要な行の削除

リストからDataFrameへの変換は以下の1行で完了です。

df = pd.DataFrame(tweet_data,columns=labels)

「columns = labels」を入れることによって1行目に列名を挿入しています。

csvファイルに出力

ここまできたらあとはCSVファイルに出力して完了です!

以下の1行でCSVファイルに出力できます。

df.to_csv(file_name,encoding='utf-8-sig',index=False)

CSVファイルはこのPythonファイルがある場所と同じところに保存されます。

to_csv()の括弧の中 の意味はそれぞれ以下の通りです。

  • file_name => 保存するファイル名
  • encoding=‘utf-8_sig => 日本語の文字化けを防ぐ
  • index = False => CSVファイルの1列目にインデックスを入れない

私はMacを利用していますが、windowsなどパソコンが違うと文字化けしてしまうケースがあるようです。

その場合は「encoding = ’Shift jis’」や「encoding = ‘utf-8’」を試してみてください。

最後に

いかがでしたでしょうか?

あこ
結構簡単にできるんだね!
パパ
そうそう、コード自体はシンプルなんだ

次の行程は

次回
定期実行でツイートの大量取得

です。今回のコードを定期実行して大量のツイートを取得しましょう!

それでは!