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

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

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

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Twitter

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

Q&A

0回答

1575閲覧

PythonでTwitterの該当ツイートを取得できない

hir0ki112

総合スコア6

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Twitter

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

0グッド

0クリップ

投稿2017/08/24 04:50

###PythonでTwitterのテキストを取得する
Python初心者です。
Pythonで該当単語のツイートを取得しています。この際、以下の様なエラーコードが表示され取得できないことがあります(取得できるときもあります)。
取得できている理由や、エラー出る理由などを調べてみましたが自分には理解できませんでしたので教えていただけると助かります。

エラーコードを見る限り、Twitter側に何か問題があるのではと考えています。
また、このプログラムが動くPC以外の異なるPCで行った時は、1度もこのプログラムが動くことはありませんでした。

###発生している問題・エラーメッセージ

Traceback (most recent call last): File "\Python\Python36\site-packages\twitter\api.py", line 4883, in _ParseAndCheckTwitter data = json.loads(json_data) File "C:\Python\lib\json\__init__.py", line 354, in loads return _default_decoder.decode(s) File "C:\Python\lib\json\decoder.py", line 339, in decode obj, end = self.raw_decode(s, idx=_w(s, 0).end()) File "C:\Python\lib\json\decoder.py", line 357, in raw_decode raise JSONDecodeError("Expecting value", s, err.value) from None json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0) During handling of the above exception, another exception occurred: Traceback (most recent call last): File "-", line 94, in <module> sys.exit(main(argvs, argc)) File "-", line 76, in main for item in GetStreamFilter(api, track=track): File "-", line 51, in GetStreamFilter data = api._ParseAndCheckTwitter(line) File "-", line 4885, in _ParseAndCheckTwitter if "<title>Twitter / Over capacity</title>" in json_data: TypeError: a bytes-like object is required, not 'str'

###該当のソースコード

Python

1# -*- coding: utf-8 -*- 2import datetime 3import io 4import pytz 5import twitter 6import sys 7import dateutil.parser 8import pandas as pd 9from peewee import * 10 11 12db = SqliteDatabase('twitter_stream.sqlite') 13 14 15class Twitte(Model): 16 createAt = DateTimeField(index=True) 17 idStr = CharField(index=True) 18 contents = CharField() 19 20 class Meta: 21 database = db 22 23 24def GetStreamFilter(api, 25 follow=None, 26 track=None, 27 locations=None, 28 delimited=None, 29 stall_warnings=None): 30 31 if all((follow is None, track is None, locations is None)): 32 raise ValueError({'message': "No filter parameters specified."}) 33 url = '%s/statuses/filter.json' % api.stream_url 34 data = {} 35 if follow is not None: 36 data['follow'] = ','.join(follow) 37 if track is not None: 38 data['track'] = ','.join(track) 39 if locations is not None: 40 data['locations'] = ','.join(locations) 41 if delimited is not None: 42 data['delimited'] = str(delimited) 43 if stall_warnings is not None: 44 data['stall_warnings'] = str(stall_warnings) 45 46 json = api._RequestStream(url, 'POST', data=data) 47 for line in json.iter_lines(): 48 if line: 49 data = api._ParseAndCheckTwitter(line) 50 yield data 51 52def str_to_date_jp(str_date): 53 dts = datetime.datetime.strptime(str_date,'%a %b %d %H:%M:%S +0000 %Y') 54 return pytz.utc.localize(dts).astimezone(pytz.timezone('Asia/Tokyo')) 55 56def main(argvs, argc): 57 if argc != 6: 58 print ("Usage #python %s consumer_key consumer_secret access_token_key, access_token_secret, ああああ" % argvs[0]) 59 return 1 60 consumer_key = argvs[1] 61 consumer_secret = argvs[2] 62 access_token_key = argvs[3] 63 access_token_secret = argvs[4] 64 65 track = argvs[5].split(',') 66 67 db.create_tables([Twitte], True) 68 69 api = twitter.Api(base_url="https://api.twitter.com/1.1", 70 consumer_key='非公開', 71 consumer_secret='非公開', 72 access_token_key='非公開', 73 access_token_secret='非公開') 74 for item in GetStreamFilter(api, track=track): 75 print('---------------------') 76 if 'text' in item: 77 print(item['id_str']) 78 print(str_to_date_jp(item['created_at'])) 79 print(item['text']) 80 print(item['place']) 81 row = Twitte(createAt=str_to_date_jp(item['created_at']), 82 idStr=item['id_str'], 83 contents=item['text']) 84 row.save() 85 row = None 86 87if __name__ == '__main__': 88 sys.stdout = io.TextIOWrapper(sys.stdout.buffer,encoding='utf-8',errors='backslashplace') 89 argvs = sys.argv 90 argc = len(argvs) 91 sys.exit(main(argvs, argc)) 92

###試したこと
api._ParseAndCheckTwitter(line)
→api._ParseAndCheckTwitter(line.decode())
と変更してみましたが、特に何も変わりませんでした。
対応策すら分からない状態です。

アドバイスいただければ幸いです。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2017/08/26 10:32

HTTPのステータスコードはどうなっていますか? デバッガーを使って確認するか、適当なHTTPクライアント(requests)などを使って, 今このスクリプトで送っているパラメタで正常な結果が得られるのか確認が必要だと思います。
退会済みユーザー

退会済みユーザー

2017/08/26 10:39 編集

できればこのプログラムが動かないPC上でステータスコードやエラーメッセージ等の付帯情報を取得したほうが、問題解決につながると思います。
hir0ki112

2017/09/04 03:56

アドバイスありがとうございます。自分にはハードルが高そうですが、調べて試してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問