LoginSignup
1
2

More than 5 years have passed since last update.

Pythonでtwitterグラフ化 メモ

Last updated at Posted at 2016-05-21

背景・実行環境

このあんちべさんによる記事をみて、
・Python3(3.5.1)
・Windows10(64bits)
anacondaでpythonインストール
の環境で同じことをしようとした。
※anacondaはかなりたくさんの科学計算に関連したパッケージがセットになっているので便利ですね。condaとpythonだけの小さなパッケージもあります。
※anacondaをインストールしないと、networkxだとか、python-twitter以外にインストールしないといけないパッケージが複数になるので、けっこう面倒です。

追加で参照:
http://www.slideshare.net/pika_shi/pythontwittertwitter
http://d.hatena.ne.jp/hangyo22/20120430/1335786712
http://blog.kzfmix.com/entry/1206780815
ネットで有益な情報を公開してくれる方々に感謝。

Python-twitterのバージョン

とりあえず、2016/06/11にグラフを描くところまで行ったときに、使っているバージョンは、3.1です。API制限にひっかかりまくるので、3.1のソースを一部変更して、利用しました。

ソース(一部)

基本は、あんちべさんのページを参照してください。
以下は、少し変更を加えているところです。

api = twitter.Api(consumer_key='***',  #your_consumer_key,
        consumer_secret='***',  #your_consumer_secret,
        access_token_key='***',  #your_access_token_key,
        access_token_secret='***',  #your_access_token_secret,
        input_encoding = "utf-8",
        sleep_on_rate_limit=True)

まず、Python-twitterをインストール。

anacondaでインストールしているので、condaでやりたかったが、python-twitterの2016/05現在の最新版 3.0rc1(Python v3に対応するよう変更が加えられているらしい)を入れられなかったので、pipを使う。
pip install python-twitter==3.0rc1
⇒2016/05/28現在、最新版は、3.1なので、
pip install python-twitter==3.1になります。
※パッケージのバージョンなどは、pip searchとか、conda searchとかを利用して確認しています。
※最新のバージョンについては、python-twitterのgithubのページでドキュメント読んだり、pip install python-twitter==4.0などと、存在しないことがGithubのドキュメントから事前にわかっているバージョンを入れてみることで表示されるメッセージで確認しています。
※python-twitterのバージョンは、https://python-twitter.readthedocs.io/en/latest/changelog.html
を見るのが早いですね。

conda list
でインストールされているパッケージ一覧が表示されるので、python-twitterがインストールされていることを確認。

python-twitterのバージョンが3.0rc1のときには、twitter.Api()の中で、input_encording='utf-8'があるとエラーになっていたが、バージョンが3.1になって解消された。

Python-twitterの機能概要(一部)

GetFriendsとかすると、100人といわず、全員の情報を収集する動作のようです。ソースの動作確認などで、あまりたくさんの情報がいらないときは、twitter.Api()の中に、'total_count='で、上限を設定するといい。

あと、timeout=(デフォルト60秒)とかの設定もあるので、回線が不安定だと設定を見なおしたほうがいいのかも。※よくわかっていません。

プログラムの実行

結果としては、グラフ描画まで完了。次はグラフから意味ある結果を導くこと。これはまだ。

twitter.error.TwitterError: [{'message': 'Rate limit exceeded', 'code': 88}]
が出た。その対応として、sleep_on_rate_limit = Trueにしようとするも、__init__でエラーだなんだとpython-twitter==3.0rc1では表示されていたが、2016/05/28現在最新の、3.1ではエラーが表示されなくなった。よって解決。

Python-twitterの、_RequestUrl()の中のtime.sleepする秒数の算出のところで、int()で小数点以下切り捨てになっているので、ここに余剰の数値を足して動作確認したが、ここだけの変更ではAPI呼び出し制限にひっかかることを回避できないので、あまり関係なさそう。

API制限を避けるために最終的に実施したのは、python-twitterのソースの一部変更。API残数0にちょうどなったときにsleepしている処理を、API残数 2以下になったらsleepするように変更した。

いまのところグラフ描画できているものの、結果に意味を見いだせないグラフになっている。理由としては、いろんな分野の方をフォローしすぎなのか、ネットワークグラフを描くときのアルゴリズムに一工夫必要なのか、いろいろ考えられるが現時点では不明。継続確認することとする。

実行結果から得られたAPIリミットの避け方(概要)

・python-twitterのapi.pyを編集する。
 -(これは効果がない可能性あり)time.sleep(int(...)+数秒)
 -APIのremaining==0のときのみ、sleepするところのif文の条件をかえて、例えば2以下でsleepするようにする。

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2