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

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

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

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

Python

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

Q&A

解決済

2回答

5702閲覧

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

kaki.k

総合スコア19

Twitter

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

Python

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

0グッド

0クリップ

投稿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)

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

推察の通り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

総合スコア38256

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kaki.k

2019/04/11 03:54

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

0

ツイッター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

総合スコア11038

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kaki.k

2019/04/11 03:55

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問