Pythonで今更ながらtwitterAPIをいじって世界のトレンドを取得してみた(コード付)

世界のトレンドを知るべく各国のトレンドキーワードをpythonで取得してみた。
実行結果のサンプルはこんな感じ(3月9日 12:30am現在)
(tweet volume がNoneで返ってきたものは0と表記しています)

アフリカも南米もUKも、全然違う国なのに女性の日関連のツイートが多いですね。
では、ここで我らが日本を見てみましょう。

安定ですね。

以下が今回のコードの実行環境と実行のための前提条件・情報です。

【環境】
OS: Ubuntu16.04LTS (windows10での動作確認済)
Python 3.6.7

【前提条件】
TwitterAPIへの登録が完了していること
oauthlib、requests-oauthlibモジュールのインストール

【前提情報】
twitterAPIが約50カ国分の情報しか提供していない
トレンドを取得するためには各国のWOEIDを事前に取得しておく必要がある
※woeidとは各ロケーションに割り振られたユニークな数字のこと

以下にコードを記載しますが、飽くまでサンプルであり、APIへの認証キーデータの準備や、woeidの情報を自分で取得・成形する必要がございます。また、twitterAPIの登録方法や公式APIサイトの使い方などの説明は書いておりませんので予めご了承ください。

import json
from requests_oauthlib import OAuth1Session
import config

CK = config.CONSUMER_KEY
CS = config.CONSUMER_SECRET
AT = config.ACCESS_TOKEN
ATS = config.ACCESS_TOKEN_SECRET

twitter = OAuth1Session(CK, CS, AT, ATS)
url = "https://api.twitter.com/1.1/trends/place.json"

with open("woeid.json") as f:
 woeid_json = json.load(f)

#・・・続く・・・

1.必要モジュールのインポート

import json 
from requests_oauthlib import OAuth1Session
import config

当python(trend_get.pyとします)ファイルと同一階層にconfig.pyというpythonファイルを作成します。
作成するファイル名の"config"の部分は任意です。例えば
"authkey.py"というファイル名で作成した場合は "import authkey"としてください。
config.pyの中身は以下。

CONSUMER_KEY = "********************"
CONSUMER_SECRET = "***************"
ACCESS_TOKEN = "*********************"
ACCESS_TOKEN_SECRET = "*********"

twitterAPIを取得した際に表示される各種キーを*に入れてください。

2.トレンドを取得するためのAPIエンドポイントの取得

CK = config.CONSUMER_KEY
CS = config.CONSUMER_SECRET
AT = config.ACCESS_TOKEN
ATS = config.ACCESS_TOKEN_SECRET

config.pyで定義した変数をtrend_get.pyにてそれぞれ新たな変数に代入します。

twitter = OAuth1Session(CK, CS, AT, ATS)
url = "https://api.twitter.com/1.1/trends/place.json"

OAuth1Session()と、定義したキーデータを利用して、twitterAPIへアクセスします。
トレンドツイートのjsonデータを提供してくれているエンドポイントをurlに代入します。

3.各国のwoeidが記載されているjsonファイル(自作)の読み込み

with open("woeid.json") as f:
 woeid_json = json.load(f)

trend_get.pyと同一階層にwoeid.jsonファイルを作成しておき、それを取得します。
各国のwoeidは Yahoo woeid lookup にて調べることができます。
やほおのAPIに登録すれば各国のwoeidを取得することができるそうですが
私は面倒くさかったので、約200カ国分自力で調べることにしました。
しかし、それもひとつひとつ手打ちで調べるのは面倒くさいのでseleniumとbeautifulsoupを使って、自動取得・jsonファイル生成プログラミングを作りました。
ご要望があれば、そちらのコードも別投稿にて載せます。
以下woeid.jsonの中身サンプル

[{"country": "Algeria", "id": "23424740"}, {"country": "Argentina", "id": "23424747"}, .....]

4.各国のトレンドツイートの取得・出力(コードにコメント記載)

#・・・続き・・・

#処理時間を短縮するためにappendfor外に出す
world_trend = []
append_w = world_trend.append
for s in woeid_json:
 #自作したwoeid.jsonのkey, "id"のvalue(国のwoeid)を代入 
 params ={'id' : s["id"]}
 
 #各国のトレンドツイートjsonデータを提供しているapiエンドポイントを取得 
 res = twitter.get(url, params=params)
 
 #APIに正常アクセスできたら、jsonテキストデータを取得
 if res.status_code == 200:
  world_info = json.loads(res.text)
 else:
  #res_codeが404の時はAPIが存在しない。429のときはrate limit中
  print(s["country"] + " Failed: %d" % res.status_code)
  continue

 #[{"trends":[{key: value},{}...{}]}]という形で返ってくるので"trends"のvalueを取得
 world_info_list = world_info[0]["trends"]
 
 for t in world_info_list:
  #後でsortするとき用にtweet数”None”を0にしておく
  if t["tweet_volume"] == None:
   t["tweet_volume"] = 0
 
  #tweet数をkeyにして、トレンドツイートを降順に並び替える
  descending_list = sorted(world_info_list, key=lambda x: x["tweet_volume"], reverse=True)
 
  #クライアントに渡す時用のデータ成形
  trend_and_volume = [{"name": t["name"], "volume": t["tweet_volume"]} for t in descending_list]
  append_w({s["country"]: trend_and_volume})

  #結果を出力
  print(s["country"] + "\n")
  for t in descending_list:
   print(t["name"] + " tweet number: " + str(t["tweet_volume"]))

これで冒頭で見せたサンプルと同じ結果が得られるはずです。


この記事が気に入ったらサポートをしてみませんか?