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

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

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

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

Q&A

解決済

1回答

816閲覧

pythonでリツイート情報を件数、期間の制限なく取得したい

aki_CJ

総合スコア2

Python

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

0グッド

0クリップ

投稿2020/11/04 08:57

pythonでリツイート情報を件数、期間の制限なく取得したいのですが、下記のコードですと直近の10件しか取得できません。
原因がわからないので分かる方がいましたら教えていただきたいです。

python

1#coding:utf-8 2#!/usr/bin/env Python 3from requests_oauthlib import OAuth1Session 4import json 5import csv 6import collections as cl 7import datetime,sys,time 8''' 9OAuth認証 10''' 11def request_authorization (**url_and_params): 12 twitter = OAuth1Session(url_and_params['ck'], url_and_params['cs'], url_and_params['at'], url_and_params['ats']) 13 if('params' in url_and_params): 14 request_result = twitter.get(url_and_params['request_url'],params=url_and_params['params']) 15 else: 16 request_result = twitter.get(url_and_params['request_url']) 17 return request_result 18''' 19API制限をチェックし、制限解除までスリープ 20''' 21def sleep_until_api_limit(api_response): 22 sec = int(api_response.headers['X-Rate-Limit-Reset']) - time.mktime(datetime.datetime.now().timetuple()) #UTCを秒数に変換 23 sec += 60.0#念のため1分追加 24 print(str(sec)+"秒待機") 25 time.sleep(sec) 26#取得した4つのkeyをここに差し込みます。 27CK = "XXXXXXXXXXXXXXXXXXXXXX" #Consumer key 28CS = "XXXXXXXXXXXXXXXXXXXXXX" #Consumer secret 29AT = "XXXXXXXXXXXXXXXXXXXXXX" #Access token 30AS = "XXXXXXXXXXXXXXXXXXXXXX" #Access token secret 31global twitter#メソッド内で再認証を行うため 32twitter = OAuth1Session(CK, CS, AT, AS)#認証処理。数時間すると認証が切れる。 33# ツイート情報取得用エンドポイントURL 34request_status_url = "https://api.twitter.com/1.1/statuses/retweets/:id.json" 35''' 36情報を取得したいTweetIDをリストに格納 37''' 38tweet_id_list = ["XXXXX","XXXXX","XXXXX"] #リツイート情報を取得したい TweetID をここに差し込みます。 39tweet_id_list.sort() 40total_requests_number = len(tweet_id_list) 41print("--------"+"送信するリクエスト数合計:" + str(total_requests_number)+"-------------") 42''' 43TwitterからUserID情報の取得開始 44''' 45sched_requests_number = 0 #リクエストしたtweet_idの数 46should_get_requests_limit = True #API上限数を取得するためのスイッチ 47i_plus = 1 #API上限数を取得するためのスイッチ 48requests_count = 0 #「API上限までリクエストを送る」を実行するのは何回目かカウントする用 49error_count = 0 #エラーを返された回数をカウントする用 50output_csv_file_name = 'retweet_info.csv' #取得した値を格納ファイル名 51''' 52ループ開始前にカラムへ書き込み 53''' 54with open(output_csv_file_name,'a') as f: 55 writer = csv.writer(f, lineterminator='\n') 56 header = ['tweet_id', 'retweet_id', 'user_id', 'created_at'] 57 writer.writerow(header) 58''' 59ループ開始。retweet_idの書き込み。 60''' 61for i in range(0,total_requests_number,i_plus): 62 if(should_get_requests_limit == True): 63 api_response = request_authorization(request_url=request_status_url, ck=CK, cs=CS, at=AT, ats=AS) 64 requests_limit = api_response.headers['x-rate-limit-remaining']#リクエスト可能残数の取得 65 requests_limit = int(requests_limit)#limitが文字列なのでキャスト 66 requests_count += 1 67 print("--------"+str(requests_count)+"回目。今回送信するリクエスト数:" + str(requests_limit)+"--------------------") 68 sched_requests_number += requests_limit 69 should_get_requests_limit = False 70 if(requests_limit != 0): 71 i_plus = 1 72 print(str(i) + ":リクエストしたtweetID:" + str(tweet_id_list[i])+"---------") 73 request_url = "https://api.twitter.com/1.1/statuses/retweets/"+str(tweet_id_list[i])+".json?count=10&trim_user=false" 74 params = {'tweet_id':tweet_id_list[i]} 75 request_result = request_authorization(request_url=request_url, ck=CK, cs=CS, at=AT, ats=AS, params=params) 76 if request_result.status_code == 200: 77 tweetinfo = json.loads(request_result.text)#JSON形式で読み込む 78 for j in range(0,len(tweetinfo)): 79 print(str(i)+":"+str(j)+":"+"リツイートID" + str(tweetinfo[j]['id'])) 80 followerdata = {'tweet_id':tweet_id_list[i], 81 'retweet_id':tweetinfo[j]['id'], 82 'user_id':tweetinfo[j]['user']['id'], 83 'created_at':tweetinfo[j]['created_at']} 84 with open(output_csv_file_name, 'a') as f: 85 writer = csv.writer(f, lineterminator='\n') 86 writer.writerow(followerdata.values()) 87 else: 88 print ("Error: %d" % request_result.status_code) 89 error_count += 1 90 print("Error数:"+str(error_count)) 91 else: 92 i_plus = 0 #limitが0のままiが1増えてしまうと実行されないTweeetIDが発生するので、0入れて増やさない。 93 if(i == sched_requests_number): 94 print("--------"+"残りリクエスト数" + str(total_requests_number-requests_limit) + "-------------") 95 sleep_until_api_limit(api_response) 96 should_get_requests_limit = True

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

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

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

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

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

guest

回答1

0

ベストアンサー

countパラメータを100にします。
具体的には、

request_url = "https://api.twitter.com/1.1/statuses/retweets/"+str(tweet_id_list[i])+".json?count=10&trim_user=false"

request_url = "https://api.twitter.com/1.1/statuses/retweets/"+str(tweet_id_list[i])+".json?count=100&trim_user=false"

とします。

なお、Twitter APIの仕様上、最大で100件までしか取得できません。(https://developer.twitter.com/en/docs/twitter-api/v1/tweets/post-and-engage/api-reference/get-statuses-retweets-id)

投稿2020/11/04 10:36

編集2020/11/04 10:37
sfdust

総合スコア1137

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

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

aki_CJ

2020/11/05 01:26

返信ありがとうございます。 教えて頂いた箇所を修正することで解決しました。 100件が上限なんですね、了解しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問