@jurikikuhara0903

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

pythonを用いたtwitterスクレイピングについて

Pythonを使ってtwitterテキストマイニングをするため、スクレイピングをしようとしています。書籍「python最速データ収集術」を参考にしながらコードを書こうとしているのですが、エラーが発生しました。解決方法を教えてください。

基本的な環境
Python3とanacondaとjupyterを使用
Twitter APIのAcademic取得済み
OAuth認証済み
Conda とdateutilとpytzをインストール済み

以下のコードは「イーロンマスク」の単語を含むツイートについて50個取得しようとしたもの

入力1:

qiita.rb
import json
from requests_oauthlib import OAuth1Session
from dateutil import parser
from pytz import timezone
import datetime
import csv

入力2:

qiita.rb
API_KEY = "自分のAPIキー"
API_SECRET_KEY = "自分のAPIシークレットキー"
ACCESS_TOKEN = "自分のアクセストークン"
ACCESS_TOKEN_SECRET = "自分のアクセストークンシークレット"
   #Twitter APIの利用申請時に確認したキーとトークンを設定

入力3:

qiita.rb
tweet_count = 50 #Standard sarch APIのパラメーターの内、必要なものを変数に設定
result_type = "recent"
search_keyword = "イーロンマスク"
params = {"count": tweet_count,"result_type":result_type,"q":search_keyword} #キーと値(ここでは変数に格納)を元に全てのパラメーターを辞書型で変数paramsに格納

入力4:

qiita.rb
url = " https://api.twitter.com/2/tweets "

twitter = OAuth1Session(API_KEY,API_SECRET_KEY,ACCESS_TOKEN,ACCESS_TOKEN_SECRET) #キーとトークンを元にAPIに接続
response = twitter.get(url, params=params) #URLとパラメーターを元に検索結果を取得
twitter_data = json.loads(response.text)

入力5:

qiita.rb
twitter_data

出力:

JSONDecodeError Traceback (most recent call last)
Cell In[4], line 5
3 twitter = OAuth1Session(API_KEY,API_SECRET_KEY,ACCESS_TOKEN,ACCESS_TOKEN_SECRET) #キーとトークンを元にAPIに接続
4 response = twitter.get(url, params=params) #URLとパラメーターを元に検索結果を取得
----> 5 twitter_data = json.loads(response.text)

File ~\anaconda3\lib\json_init_.py:346, in loads(s, cls, object_hook, parse_float, parse_int, parse_constant, object_pairs_hook, **kw)
341 s = s.decode(detect_encoding(s), 'surrogatepass')
343 if (cls is None and object_hook is None and
344 parse_int is None and parse_float is None and
345 parse_constant is None and object_pairs_hook is None and not kw):
--> 346 return _default_decoder.decode(s)
347 if cls is None:
348 cls = JSONDecoder

File ~\anaconda3\lib\json\decoder.py:337, in JSONDecoder.decode(self, s, _w)
332 def decode(self, s, _w=WHITESPACE.match):
333 """Return the Python representation of s (a str instance
334 containing a JSON document).
335
336 """
--> 337 obj, end = self.raw_decode(s, idx=_w(s, 0).end())
338 end = _w(s, end).end()
339 if end != len(s):

File ~\anaconda3\lib\json\decoder.py:355, in JSONDecoder.raw_decode(self, s, idx)
353 obj, end = self.scan_once(s, idx)
354 except StopIteration as err:
--> 355 raise JSONDecodeError("Expecting value", s, err.value) from None
356 return obj, end

JSONDecodeError: Expecting value: line 1 column 1 (char 0)

最初は出力5を実行すると
{'errors': [{'parameters': {'ids': []},
'message': 'The ids query parameter can not be empty'},
{'parameters': {'count': ['5']},
'message': 'The query parameter [count] is not one of [ids,expansions,tweet.fields,media.fields,poll.fields,place.fields,user.fields]'},
{'parameters': {'result_type': ['recent']},
'message': 'The query parameter [result_type] is not one of [ids,expansions,tweet.fields,media.fields,poll.fields,place.fields,user.fields]'},
{'parameters': {'q': ['イーロンマスク']},
'message': 'The query parameter [q] is not one of [ids,expansions,tweet.fields,media.fields,poll.fields,place.fields,user.fields]'}],
'title': 'Invalid Request',
'detail': 'One or more parameters to your request was invalid.',
'type': 'https://api.twitter.com/2/problems/invalid-request'}

のエラーが出ていましたが、しばらく経ってから同様の実行をすると出力4の段階で上記の「出力:」のようなエラーが出ました。卒業論文を書くため、プログラミング初心者として試行錯誤を続けているのですが、行き詰まって困り果てています。どなたか助けていただけると幸いです。よろしくお願いします。

0 likes

1Answer

回答の前にまず2点、質問を投稿する際においてのアドバイスです。

1、コードを記述する際はコードブロックを使用してください。
https://qiita.com/Qiita/items/c686397e4a0f4f11683d#code---%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AE%E6%8C%BF%E5%85%A5
コードを記述する際はこちらの記事を参考にして頂き、下記のような表示になるようにお願いいたします。

twitter_data = json.loads(response.text)

2、API に接続するための情報は載せないようにしてください
ACCESS_TOKEN などそのまま記載されてしまっておりますが、これらの情報は API に接続する際の ID・パスワードのようなものです。
これらを公開してしまうと誰でも自由に貴方の接続情報で API 利用が出来てしまうため非常に危険です。
API 経由でツイート投稿や削除も出来るはずなので、貴方のアカウントで自由に投稿・削除ができるようになってしまうのではないでしょうか?

以下は質問に対する回答です。

エラー文に 'title': 'Invalid Request', とございましたのでリクエスト文の作り方が間違っているのかなと思い、API の仕様を確認してみました。
https://developer.twitter.com/en/docs/twitter-api/tweets/search/migrate/standard-to-twitter-api-v2
接続先 URL やパラメータの指定が異なるようなので入力 3, 4 の params, url 部分を下記のように変更していただくと良いかと思われます。

# params = {"count": tweet_count,"result_type":result_type,"q":search_keyword} #キーと値(ここでは変数に格納)を元に全てのパラメーターを辞書型で変数paramsに格納
# ↓
params = {"max_results": tweet_count, "query": search_keyword}

# url = " https://api.twitter.com/2/tweets "
# ↓
url = "https://api.twitter.com/2/tweets/search/recent"
2Like

Comments

  1. この通り訂正したら上手くいきました。質問の投稿の仕方やキーの扱い方など、基本的なところからコードの内容まで丁寧に回答していただけてありがとうございました!

Your answer might help someone💌