Help us understand the problem. What is going on with this article?

PythonでTwitterのデータを取得する

More than 1 year has passed since last update.

はじめに

今回はPythonで
Python Twitter Tools (https://github.com/sixohsix/twitter)
というものを使って、TwitterAPIにアクセスしてみたものを載せておきます。

Twitter Developerへの登録

https://syncer.jp/Web/API/Twitter/REST_API/
が参考になります。
というか普通にAPIを叩く場合はここを見ればいけそう

Python Twitter Tools

https://github.com/sixohsix/twitter
でダウンロードします。

python setup.py install

でインストールできます。

Twitterクラス

from twitter import Twitter, OAuth

でインポートした後に、

t = Twitter(auth=OAuth(
        <access token>,
        <access token secret>,
        <consumer key>,
        <consumer secret>
    ))

でTwitterクラスを作ります。
このクラスを使って色々とTwitterのデータを取ることができるようになります。

例えば

searchTweets = t.search.tweets(q = "Qiita")

で「Qiita」についてのTweetを取得することができます。

friends = t.friends.ids()

で「自分のアカウント」がフォローしてるユーザのID群を取得できます。

なお出力結果は大変長いため載せませんが
https://dev.twitter.com/rest/public/rate-limits
に全て書いてあります。

サンプル:自分のフォローしてる人の情報を取得

remain = True
next_cursor = 0
while remain:
    friendsInfo = t.friends.list(cursor=next_cursor)
    for user in friendsInfo['users']:
        friendsNameList.append({
                'NumberID':user['id'],
                'userID':user['screen_name'],
                'userName':user['name']
            })
    next_cursor = friendsInfo['next_cursor']
    if(next_cursor == 0):
        remain = False
        print('Finish search')

TwitterAPIは一度に大量のデータにアクセスできず、代わりにcursorという方法をとっています。これは端的に言えば、各々のアクセスの時に「どこからデータを取り始めるか」ということを示すものです。

つまりfriends.listのcursor引数は、データを取り始める場所を指定していることになります。各ユーザデータにはnext_cursorというデータが入っており、それを次の引き数に持ってくれば、次々と新しいデータを取り込んでくれます。

サンプル2 あるユーザのTweetを取ってくる

remain = True #ループ判定
userTweets = [] #tweetの格納先
max_id = <一番新しいtweetID>
remainNum = 0
numberOfTweets = 500 #取ってくるtweetの数
count = 200 #一度のアクセスで何件取ってくるか
while remain:
    aTimeLine = t.statuses.user_timeline(user_id = <誰かのTwitterID番号>, count=count, max_id=max_id)
    for tweet in aTimeLine:
        userTweets.append(tweet['text'])
    max_id = aTimeLine[-1]['id']-1
    remainNum = numberOfTweets - len(userTweets)
    count = remainNum
    if len(userTweets)+1 > numberOfTweets:
        print('finish search')
        remain = False

max_id というのは先程のcursorと同じような使い方です。一度の全部取ってこれないので、TweetのIDを参照して取る場所を指定します。ちなみにこのコードは500件キレイに取るための初心者コード丸出しです・・・。 あと500件以下しかtweetしてないアカウントの場合アウトですね。
一応勉強の経過として載せておきます。

終わりに

色々なデータがあるTwitterですが、APIの制限は結構きつかったりします。けど、そのやり方さえ覚えてしまえば、後はドキュメントを参照すればほしいデータは取れる気がします。

Python Twitter Tools Github
Twitter Developer ドキュメント
cursorの説明

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away