質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
86.12%
Twitter

Twitterは、140文字以内の「ツイート」と呼ばれる短文を投稿できるサービスです。Twitter上のほぼ全ての機能に対応するAPIが存在し、その関連サービスが多く公開されています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

解決済

TwitterのAPIを使ってツイートを取得するときのKeyErrorの解決方法を教えていただきたいです。

kaki.k
kaki.k

総合スコア19

Twitter

Twitterは、140文字以内の「ツイート」と呼ばれる短文を投稿できるサービスです。Twitter上のほぼ全ての機能に対応するAPIが存在し、その関連サービスが多く公開されています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

2回答

0グッド

0クリップ

4746閲覧

投稿2019/04/11 02:15

TwitterのAPIを使って特定の単語が含まれるツイートを入手し、txtファイルで保存したいのですが、ある程度のツイートを取得した後、結果で以下のようなエラーが出ます。

1114878911777628160 橋本環奈はやっぱりかわいいなぁ… Sun Apr 07 13:13:40 +0000 2019 ------------------------------------------------------------------ 1114878819909820418 RT @722731: Twitterやってる人の中で春から橋本環奈だよ!って人いないかな? 春から橋本環奈になる人はリツイートお願いします(&gt;_&lt;;) #春から橋本環奈 #橋本環奈と繋がりたい Sun Apr 07 13:13:18 +0000 2019 (一部略) Traceback (most recent call last): File "0410word2vec_twitter.py", line 50, in <module> data = response.json()['statuses'] KeyError: 'statuses'

エラーから検索して解決策を探しましたが、上手く処理できませんでした。
(APIの回数制限の問題と捉えて良いでしょうか?)
KeyErrorを出さないための解決策や、そこまで取得したツイートを保存できるようなやり方がもしあるなら教えていただきたいです。
コードは以下のようになります。
よろしくお願いします。

Python

1# -*- coding: utf-8 -*- 2from requests_oauthlib import OAuth1Session, OAuth1 3import json 4import requests 5import urllib 6import sys 7import io 8 9#検索文字列設定 10word = "橋本環奈" 11# デフォルト文字コードをutf8に変更 12sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8') 13args = sys.argv 14 15#apiキー情報設定 16consumer_key = "X" 17consumer_key_secret = "X" 18access_token = "X" 19access_token_secret = "X" 20 21#twitterAPIアクセス 22url = "https://api.twitter.com/1.1/search/tweets.json?count=100&lang=ja&q=" + word 23auth = OAuth1(consumer_key, consumer_key_secret, access_token, access_token_secret) 24response = requests.get(url, auth = auth) 25data = response.json()['statuses'] 26 27Tweet = [] 28 29#データ表示 30cnt = 0 31while True: 32 for tweet in data: 33 print("------------------------------------------------------------------") 34 print(tweet["id"])#ツイートID 35 print(tweet["text"])#ツイート内容 36 print(tweet["created_at"])#ツイート日時 37 cnt += 1 38 maxid = int(tweet["id"]) - 1 39 Tweet.append(tweet["text"]) 40 41 #ツイートがない場合ループ終了 42 if len(data) == 0: 43 break 44 45 url = "https://api.twitter.com/1.1/search/tweets.json?count=100&lang=ja&q=" + word + "&max_id=" + str(maxid) 46 auth = OAuth1(consumer_key, consumer_key_secret, access_token, access_token_secret) 47 response = requests.get(url, auth = auth) 48 data = response.json()['statuses'] 49 50print("ツイート数:" + str(cnt)) 51 52with open('0410tweet_hasimotokannna.txt', "w",encoding="utf-8") as f: 53 f.writelines(Tweet)

以下のような質問にはグッドを送りましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

グッドが多くついた質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

回答2

1

ベストアンサー

推察の通りRate limitにひっかかっています。
とりあえず、ひっかかっている場合にはJSONデータに`'statuses'キーがないのを利用して以下のようにキーチェックをすればエラーは回避できます。
なお、ちゃんとやるならTwitterAPI でツイートを大量に取得。サーバー側エラーも考慮(pythonで)を参考にしてください。

# 略 response = requests.get(url, auth = auth) data = response.json() if not 'statuses' in data: print(data)# {'errors': [{'message': 'Rate limit exceeded', 'code': 88}]} sys.exit() # あるいはちゃんとSleepする data = data['statuses'] # 略 response = requests.get(url, auth = auth) data = response.json() if not 'statuses' in data: print(data)# {'errors': [{'message': 'Rate limit exceeded', 'code': 88}]} break # あるいはちゃんとSleepする data = data['statuses']

投稿2019/04/11 03:31

can110

総合スコア36188

kaki.k👍を押しています

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

kaki.k

2019/04/11 03:54

ありがとうございます。エラーなく実行できました。 サイトも参考にさせていただきます。

1

ツイッターAPIの公式ドキュメントを読みましょう。エラーコードが書いてないわけがないのですから。

https://developer.twitter.com/en/docs/basics/response-codes

使っているライブラリの公式ドキュメントを読みましょう。HTTPのステータスコードを理解しましょう。

http://docs.python-requests.org/en/master/api/#requests.Response.ok

(追記)
すみません。リンクに This is not a check to see if the response code is 200 OK. と書いてありますね。status_code をチェックしてください。

http://docs.python-requests.org/en/master/api/#requests.Response.status_code

こちらですね。


response = requests.get(url, auth = auth)の直後でreponseのステータスとエラーコードの確認をしましょう。
例えば

python

1if response.status_code == requests.codes.ok: 2 # ここは正常なケース 3 pass 4else: 5 json_data = response.json() 6 if 'errors' in json_data and len(json_data['errors']) > 0: 7 errcode = json_data['errors'][0].get('code', 0) 8 # ここでerrcodeにしたがって適切に処理する 9 # 例えば 88 (Rate limit exceeded)ならRate limitを取得して回復するまでsleepするとか 10 else: 11 # ステータスが異常なのにエラーコードが入っていない異常なケース 12 # たぶん異常終了してよいが自分で考えること 13 raise RuntimeError

のようにエラーを取り出します。
エラーに対してどうプログラムが振る舞えばいいかは作成者が決めなければなりません。

投稿2019/04/11 03:18

編集2019/04/11 03:33
quickquip

総合スコア10419

kaki.k👍を押しています

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

kaki.k

2019/04/11 03:55

詳しくありがとうございます。 エラーに対する姿勢を改めるよう精進します。

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
86.12%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

Twitter

Twitterは、140文字以内の「ツイート」と呼ばれる短文を投稿できるサービスです。Twitter上のほぼ全ての機能に対応するAPIが存在し、その関連サービスが多く公開されています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。