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

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

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

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Twitter

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

Python

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

Q&A

解決済

2回答

5104閲覧

Python tweepyを使ったプログラムの処理速度をあげたい

Biginner0131

総合スコア5

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Twitter

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

Python

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

0グッド

0クリップ

投稿2019/08/29 06:45

前提・実現したいこと

Python tweepyを使ったtwitterフォロワー情報抽出の処理速度をあげたいです。

任意のアカウントのフォロワーについて、以下の情報をCSVに書き出したいと考え、
検索して出てきたものを利用して作成いたしました。

・@以下のID
・アカウント名
・フォロー数
・フォロワー数
・アカウント開設日時
・プロフィールテキスト

無事情報をCSVに書き出すことが出来たのですが、処理速度が遅く、
目標としている100万~200万規模のフォロワー情報を得るには、
10日以上時間がかかる想定です。
遅くとも終日、可能であれば12時間以内に処理を済ませたいと
考えております。

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

前述の通りエラーは発生していませんが、処理速度が遅く困っています。
作成中のCSVを確認したところ、4000件/1h くらいの速度になっています。

エラーメッセージはありません。

該当のソースコード

Python

1import tweepy 2import csv 3 4target_id = "xxxxxxxx" 5 6CONSUMER_KEY = "xxxxxxxx" 7CONSUMER_SECRET = "xxxxxxxx" 8ACCESS_TOKEN = "xxxxxxxx" 9ACCESS_TOKEN_SECRET = "xxxxxxxx" 10auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET) 11auth.set_access_token(ACCESS_TOKEN, ACCESS_TOKEN_SECRET) 12api = tweepy.API(auth ,wait_on_rate_limit = True) 13 14followers_ids = tweepy.Cursor(api.followers_ids, id = target_id, cursor = -1).items() 15followers_ids_list = [] 16for followers_id in followers_ids: 17 followers_ids_list.append(followers_id) 18 19with open('xxxxxxxx.csv', 'a', newline="", encoding='utf-8_sig') as f: 20 writer = csv.writer(f) 21 22 for followerId in followers_ids_list: 23 followers_detail = [] 24 25 try: 26 user = api.get_user(followerId) 27 userid = user.screen_name 28 username = user.name 29 friend_num = str(user.friends_count) 30 follower_num = str(user.followers_count) 31 start_date = str(user.created_at) 32 descript = user.description 33 # recent_tweet = api.user_timeline(followerId)[0].text 34 followers_detail.extend([userid, username, friend_num, follower_num, start_date, descript]) 35 writer.writerow(followers_detail) 36 37 except Exception as e: 38 continue 39

試したこと

人数によって単位時間あたりの処理件数が変わるかと思い、1万~30万規模まで
試行しましたが、殆ど変わりませんでした。
また、取得情報が多いのかと考え、アカウント名のみで試しましたが、
これも変わりませんでした。
CSVに出力するのをプログラムの外側に出したりもしたのですが、特に効果を
実感することは出来ませんでした。

補足情報(FW/ツールのバージョンなど)

Pythonはver.3.7.4と記載されたものをインストールしています。

当方は学生時代に研究手段として少しRubyをかじった程度の知識しかなく、
Pythonについては殆ど知識がない状態です。
易しく教えて頂けますと幸いです。

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

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

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

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

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

guest

回答2

0

ベストアンサー

https://developer.twitter.com/en/docs/accounts-and-users/follow-search-get-users/api-reference/get-users-show

Requests / 15-min window (user auth) 900

Twitter API が15分に900回までしか受け付けないのでそれが上限です。


コメントに対して

質問のソースの

python

1followers_ids = tweepy.Cursor(api.followers_ids, id = target_id, cursor = -1).items() 2 3for followers_id in followers_ids:

この部分(=followers/ids)に対する実行の制限が「15分に15回」で「API実行1回につき5,000件」までです。 APIリファレンス

target_idで指定されたアカウントのフォロワーが5,000より多い時に、この部分でAPIが複数回実行されます。


たとえば

python

1 2with open('xxxxxxxx.followers.txt', 'a') as f: 3 for user_id in tweepy.Cursor(api.followers_ids, id=target_id, cursor=-1).items(): 4 print(user_id, file=f)

のようにすれば「15分間に5000件を15回、最大75,000件、IDのみを獲得」になりますね。

投稿2019/08/29 06:58

編集2019/08/29 09:11
quickquip

総合スコア11038

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

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

Biginner0131

2019/08/29 07:28

ご回答いただきましてありがとうございます。 確かにご指摘の通り、ユーザー情報を取るには15分につき 900件となっていることが確認できました。 追加でお伺いさせていただきたいのですが、よろしいでしょうか。 ネット上の情報を確認すると、同様のフォロワーの情報の取得について、 15分間に5000件を15回、計75,000件獲得できる、という記載が ちらほら見受けられるのですが、これはどのようなことでしょうか。 下記のURLの情報がそうではないかと思いました。 https://developer.twitter.com/en/docs/accounts-and-users/follow-search-get-users/api-reference/get-followers-ids 取得情報をIDのみにすることで時間効率を上げることが出来るのであれば、 その方法でIDだけでも取得したいと考えています。 しかし、上記のコードのwith以下のID以外に関するところを削除しても、 時間効率を上げることは出来ませんでした。 その場合の不備をお教えいただくことは出来ないでしょうか。 よろしくお願いいたします。
quickquip

2019/08/29 08:14 編集

> 不備をお教えいただくことは出来ないでしょうか 修正したコードが示されないかぎり不備の指摘はできません。
Biginner0131

2019/08/29 08:49

ご回答いただきましてありがとうございます。 上記追記頂いたもので理解することが出来ました。 "api.followers_ids" と"api.get_user"の2種類がある中で、 より回数制限の重い後者が優先され、前者の回数に沿わなかったと いうことですね。 頂いたコードを参考にさせていただき、idのみを高速で処理できる コードを組み、実行させていただきます。 それで再び質問させていただきたい事項が出て参りましたら、 その際にはコードも添えて質問させていただく様に致します。 ご対応いただきまして、誠にありがとうございました。
quickquip

2019/08/29 09:10

ちょっと勘違いがありました。 修正したというコードで何が起こっていたのかは想像できませんが、誤解がないように回答を訂正しました。
Biginner0131

2019/09/02 05:48

細部までご対応いただきましてありがとうございました。 無事100万人以上のフォロワーIDを抽出することが出来ました。
guest

0

プログラムのどの部分の処理に時間がかかっているのでしょうか?

ざっくり見た感じでは、データの取得に時間がかかっていると思われますが、tweepy が利用している Twitter API には、レート制限があるので、あまり早くすることはできないと思います。(早くしたとしても Twitter API が、エラーになってデータを取得できないので無駄な待機時間が増えると思われます。)

Rate Limiting 参照。

投稿2019/08/29 06:57

編集2019/08/29 06:59
CHERRY

総合スコア25171

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

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

Biginner0131

2019/08/29 07:38

ご回答いただきましてありがとうございます。 tweepyでは詳細情報まで取ると、あまり早くすることが出来ない旨、承知いたしました。 Python以外では、PHPで同様のコードがネット上で多数公開されていたのですが、 それを使えばより速く処理を進めることが出来るのでしょうか。 後学のため、ご回答いただけますと幸いです。 よろしくお願いいたします。
CHERRY

2019/08/29 09:31

tweepy ではなくて、Twitter のサーバー側での制限ですので、何を使っても同じです。
Biginner0131

2019/08/30 02:48

ご回答いただきましてありがとうございます。 承知いたしました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問