iMind Developers Blog

iMind開発者ブログ

PythonでTwitterの検索とタイムラインの取得

概要

PythonからTwitter APIを利用して下記を行います。

  1. 検索結果にヒットしたツイートの取得
  2. 指定ユーザーのツイートの取得
  3. タイムラインの取得

とても面倒だということで名高いAPIのアカウント申請についてはここでは取り扱いません。

バージョン情報

  • Python 3.7.4
  • python-twitter==3.5

インストール

$ pip install python-twitter

検索してみる

python-twitterを利用した検索の実行。

検索APIのTwitter側の仕様は下記を参照。これを書いている時点では15分につき180回打てるらしい。

https://developer.twitter.com/en/docs/tweets/search/api-reference/get-search-tweets

まずはconsumer_keyやaccess_tokenを指定してtwitter.Apiインスタンスを取得。

CONSUMER_KEY = '{your consumer key}'
CONSUMER_SECRET = '{your consumer secret}'
ACCESS_TOKEN = '{access token}'
ACCESS_TOKEN_SECRET = '{access token secret}'

import twitter
api = twitter.Api(consumer_key=CONSUMER_KEY,
                  consumer_secret=CONSUMER_SECRET,
                  access_token_key=ACCESS_TOKEN,
                  access_token_secret=ACCESS_TOKEN_SECRET)

検索の実行。

from urllib.parse import urlencode
query = urlencode({
    'q': '大相撲',  # 検索ワード
    'result_type': 'recent',  # recent/popular/mixed
    'count': 100  # 取得するツイート数(100が最大)
})

result = api.GetSearch(raw_query=query)
for status in result:
    print(status)

戻り値は twitter.models.Status 型で返ってきます。

Statusから取得できる主な項目は下記。

# ツイート本文
status.text

# お気に入り数
status.favorite_count
    #=> 1

# retweet数
status.retweet_count
    #=> 0

# 投稿時間
status.created_at
    #=> 'Wed Nov 06 09:46:57 +0000 2019'

# 言語
status.lang
    #=> 'ja'

ツイートと一緒にユーザーの情報についても取れる。

# ユーザーID(数値)
status.user.id

# ユーザー名(メンションやURLの末尾とかに使われるやつ)
status.user.screen_name

# ユーザー名(表示名)
status.user.name

# ユーザーのフォロワー数
status.user.followers_count

# ユーザーのフォロー数
status.user.friends_count

# ユーザーのこれまでの記事投稿数
status.user.statuses_count

# ユーザーの事項紹介
status.user.description

検索のページネーション

上記のクエリでは最大で100件までしかツイートは取れない。

max_idを指定することで、そのID以前を取得することができる。

まずは先ほどのクエリの結果から1番小さいIDを取得する。

min_id = min([status.id for status in result])

取得したIDからをクエリパラメータの max_id に指定することで、1回目のクエリで取得したIDより以前のツイートだけ取得できる。

query = urlencode({
    'q': '大相撲',
    'result_type': 'recent',
    'count': 100,
    'max_id': min_id - 1
})

result2 = api.GetSearch(raw_query=query)
for status in result2:
    print(status)

指定ユーザーのタイムラインを取得する

result = api.GetUserTimeline(
    screen_name='取りたいユーザーのscreen name',
    count=100)

for status in result:
    print(status)

上記はscreen_name指定で取得しているが、intのuser_idを指定することもできる。

また検索と同じでmax_idでページングも可能。

改定履歴

Author: Masato Watanabe, Date: 2019-11-07, 記事投稿