TweepyでフォロワーのIDを全て取得してみた
はじめに
あるTwitterユーザのフォロワーを取得しようと思うと、API制限の壁にぶち当たりました。
例えば、1回あたり5000人分のフォロワーのidを取得できるAPIは15分につき15回なので、5000×15=75000人以上のフォロワーがいるユーザに対して全フォロワーのidを取得することが出来ません。ロッチの中岡さんのアカウントには2016年11月10日現在で101587ユーザのフォロワーがいるのですが、API制限により全フォロワーのidを取得できないのです。twitter.com
で、あれこれ調べていたら、tweepyでAPIインスタンスを生成する際に、wait_on_rate_limit = True
とすると済むらしい(簡単かよ…)ということが分かったので、それについてメモ。
実装
手順
今回は、フォロワーのidを取ってくるAPIであるAPI.followers_ids(id/screen_name/user_id)
を使う。このAPIの概要&注意事項は以下の3点。
- idで指定されたユーザのフォロワーのユーザidを、一度に最大5000件取得する。
- 15分につき15回まで呼び出し可能である。
- Cursorを使って逐次的にフォロワーidを取得する。
つまり、75000人以上フォロワーが存在する場合、75000人の取得につき15分ほどAPIの利用を待機しないといけない。
そこで、APIのインスタンスを生成する際に
api = tweepy.API(auth, wait_on_rate_limit = True)
とすると、「APIの利用制限に引っかかった時に、必要時間だけ待機してくれる」という設定になる。
今回使うAPIは15分につき15回という制限が存在するので、75000人取得する毎に15分待機することになる。
コード
ぐだぐだ言うよりコードを書いた方が早いかもしれない。
# -*- coding:utf-8 -*- # followers.py import tweepy def getApiInstance(): consumer_key, consumer_secret = "xxxxx", "xxxxx" access_token_key, access_token = "xxxxx", "xxxxx" auth = tweepy.API(consumer_key, consumer_secret) auth.set_access_token(access_token_key, access_token_secret) #利用制限にひっかかた時に必要時間待機する api = tweepy.API(auth, wait_on_rate_limit = True) return api #Idで指定されたユーザの全フォロワーを取得する #Id ... ユーザidでもスクリーンネームでもok def getFollowers_ids(Api, Id): #Cursorを使ってフォロワーのidを逐次的に取得 followers_ids = tweepy.Cursor(Api.followers_ids, id = Id, cursor = -1).items() followers_ids_list = [] try: for followers_id in followers_ids: followers_ids_list.append(followers_id) except tweepy.error.TweepError as e: print e.reason return followers_ids_list if __name__ == "__main__": screen_name = "lottiso1" #ロッチの中岡さんのアカウントをスクリーンネームで指定する api = getApiInstance() f_list = getFollowers_ids(Api = api, Id = screen_name) print len(f_list) #数で確認してみる
Cursorのチュートリアルは原文を要確認です。 http://docs.tweepy.org/en/v3.5.0/cursor_tutorial.html
最後に
今回はAPI.followers_ids(id/screen_name/user_id/)
を使ったけど、Cursorに対応しているAPIであれば何でも大丈夫(例:API.followers
、API.friedns_ids
、などなど)。
wait_on_rate_limit = True
としておけばそれぞれのAPIに合わせて待機時間を変更する(だろう)。
時間はかかる傾向にあるけど、ひとまずこれにて解決。
以上!
PythonからIBM Personality Insights Service APIを叩いてみた
はじめに
IBMが開発しているIBM Personality Insights Service APIは、テキストを入力すると、人格特性(Big-five、Value、Needs)のスコアを出力してくれるというAPIです。
どういうこと?と思う方は以下のリンクから試してみましょう。
Personality Insights
性格診断のちゃんとしたやつ、みたいなイメージですね。入力できる言語は英語、スペイン語、日本語、アラビア語に対応しています。
今回は、このAPIをPython 2.7から叩く方法を紹介します(おそらく3.x系でも同じ)。
手順
手順1:API資格情報の取得
- IBM Bluemix - Next-Generation Cloud App Development Platformにアクセス。アカウントを作成後、ログインする。
- ダッシュボードにアクセスし、スペースを作成する。スペースとは、いわゆる開発環境のことです。データセンターを「米国南部」「シドニー」「英国」から選択するよう要求されますが、(APIを叩くだけなら)気にせずデフォルトのままで大丈夫です。
- スペースの作成後、メニューが表示される。
- その中から、「サービス&API」を選択する。こんな画面が表示される。 この画面の中から、「Personality Insights」を選択。
- Personality Insightsの画面から、スペース名やアプリ名を入力するように要求される。適当に名前を付けて「作成」をクリック。
- 「ダッシュボード」からPerosnality Insightsが利用できるようになる。ダッシュボードからPersonality Insightsにアクセスし、左のメニューバーから「サービス資格情報」をクリック。
- すると以下のような画面が表示される。 ここに表示されているpasswordとusernameの値(赤で隠されているところ)はAPIを叩く際の資格情報となる。後ほどサンプルコードでも出てくる。これにて資格情報の取得は完了!!
手順2:Pythonコードの実装
Requestsというライブラリを使うので、インストールしておく。
pip install requests
以下のようなコードを作成する。
#watson_api.py # -*- coding:utf-8 -*- import json import requests from requests.auth import HTTPBasicAuth #input: plain text (string) --> output: bigfive, needs, and values def get_personality(Text): #endpoint url api_url = "https://gateway.watsonplatform.net/personality-insights/api/v2/profile" #username and pssword for this api api_username = "XXXXX" #手順1で取得したusername api_password = "YYYYY" #手順1で取得したpassword #set query query = { "include_raw": "false", "headers": "false" } #set header headers = { "Content-Type": "text/plain", #入力テキストの形式.今回はstringのテキストを渡す設定. "Content-Language": "en", #入力言語モードの設定.jaとすると日本語の入力を受け付ける. "Accept": "application/json", #応答ファイルの形式.今回はjson形式で受け取る. "Accept-Language": "en", #処理言語モードの設定.jaとすると日本語として処理する. "include_raw": "false" } #set body body = Text #post response = requests.post( api_url, auth = HTTPBasicAuth(api_username, api_password), params = query, headers = headers, data = body ) return response if __name__ == "__main__": #input text text = "sample text. at least 600 words." #統計的に信頼できる値を獲得する場合には最低でも600単語必要. #get personality pers = get_personality(text) j_pers = pers.json() #json format print json.dumps(j_pers, indent = 4)
エンドポイントURLは、手順1で取得した資格情報の"url"とは別物であることに注意しましょう(末尾に /v2/profile が追加されています)。
APIの詳細な設定について知りたい人は、公式のAPIトライアウトページにアクセス!
Personality Insights v2 API Explorer
エラーコードまで丁寧に解説されています。
さて、実行。
python watson_api.py
こんな感じで値が表示されたらOK。
{ "warnings": [], "tree": { "children": [ { "children": [ { "category": "personality", "percentage": 0.9972301565213472, "children": [ { "category": "personality", "name": "Openness", "sampling_error": 0.0597829776, "id": "Openness", "percentage": 0.9972301565213472, "children": [ { "category": "personality", "percentage": 0.9032241090941042, "id": "Adventurousness", "sampling_error": 0.05072314, "name": "Adventurousness" }, { "category": "personality", "percentage": 0.863707003271354, "id": "Artistic interests", "sampling_error": 0.1034981212, "name": "Artistic interests" }, { "category": "personality", "percentage": 0.16516298671132595, "id": "Emotionality", "sampling_error": 0.0474305476, "name": "Emotionality" }, { "category": "personality", "percentage": 0.8630065982824178, "id": "Imagination", "sampling_error": 0.06374967, "name": "Imagination" }, { "category": "personality", "percentage": 0.9741200782232922, "id": "Intellect", "sampling_error": 0.055623082000000004, "name": "Intellect" }, { "category": "personality", "percentage": 0.9999380670028959, "id": "Liberalism", "sampling_error": 0.0831092496, "name": "Authority-challenging" } ] }, { "category": "personality", "name": "Conscientiousness", "sampling_error": 0.07542104720000001, "id": "Conscientiousness", "percentage": 0.271517171388969, "children": [ { "category": "personality", "percentage": 0.8392060674139132, "id": "Achievement striving", "sampling_error": 0.0979948704, "name": "Achievement striving" }, ... }
Big-Five personalityはOpenness、Conscientiousness、Extraversion、Agreeableness、Neuroticism(俗にOCEANと呼ばれたり呼ばれなかったりする)から構成される人格特性です。
返ってきたjson形式のファイルの中で、それぞれの名前が付いたidが含まれるオブジェクト内のpercentageの値が、そのidの人格特性のスコアです。
上の例でいうと、Openness=0.9972301565213472、Conscientiousness=0.271517171388969てな感じですね。
おわりに
このAPIは、最初の30日間は無料トライアル可能で、以降は、月100回までは無料で利用でき、100回を超えると料金が発生します(Bluemixから料金設定は確認できます)。
また、クレジットカード情報を登録した場合、その瞬間に無料トライアル期間は強制的に終了してしまうそうです( ̄エ ̄;)。
たくさん使いたい人は、クレジットカードを登録せずに最初の30日間で使いまくりましょう。
以上!