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

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

ただいまの
回答率

90.23%

Twitter APIを利用したツイートの取得が、途中でタイムアウトしてしまう

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 595

muteki

score 6

前提・実現したいこと

TwitterのAPIを用いて、ツイートをクローリングするプログラム作っています。
プログラムを実行することで、ある程度のツイートは取得できるのですが、途中でエラーが出て中断されてしまいます。

該当のソースコード

# coding="utf-8"

from time import sleep
import json, config #標準のjsonモジュールとconfig.pyの読み込み
from requests_oauthlib import OAuth1Session #OAuthのライブラリの読み込み

#config.pyには各キーを記載しています。

CK = config.CONSUMER_KEY
CS = config.CONSUMER_SECRET
AT = config.ACCESS_TOKEN
ATS = config.ACCESS_TOKEN_SECRET
twitter = OAuth1Session(CK, CS, AT, ATS) #認証処理

max_id = -1
url = 'https://api.twitter.com/1.1/search/tweets.json'
keyword = '任意の文字列'
count = 100
params = {'q' : keyword, 'count' : count, 'max_id' : max_id}
i=0

while(True):
    print(max_id)
    if (max_id != -1):
        params['max_id'] = max_id - 1
    req = twitter.get(url, params = params)

    if (req.status_code == 200): #正常に取得できていれば
        f=open("jp_tweet.txt","a",encoding="utf-8")
        search_TL = json.loads(req.text)

        if(search_TL['statuses'] == []):#検索結果を全て書き終わったら
            f.close()
            print('終了します')
            break

        for tweet in search_TL['statuses']:
            tweet_text = tweet['text']
            f.write(tweet_text + "\n")
            i=i+1

        f.close()
        max_id = search_TL['statuses'][-1]['id']

    else:#APIの取得制限
        print('Please wait 15minute.')
        print(i)
        sleep(15*60)

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

プログラムを実行すると、コマンドプロンプト上では以下のような出力が出ます。
エラーコードが出るまでは、ファイルへのtweetの書き込みができています。
C:\Users\user\Documents\twi>python search.py
-1
1094242865729814528
1094242865146806272
(以下IDの出力が続く)
1094242777242587136
1094242776764436480
Please wait 15minute.
17913
1094242776764436480
1094242776303071233
(以下IDの出力が続く)
1094242684447780864
1094242683978051584
1094242683420200960
Please wait 15minute.
35808
1094242683420200960
Traceback (most recent call last):
  File "C:\Users\user\AppData\Local\Programs\Python\Python37\lib\site-packages\urllib3\connectionpool.py", line 600, in urlopen
    chunked=chunked)
  File "C:\Users\user\AppData\Local\Programs\Python\Python37\lib\site-packages\urllib3\connectionpool.py", line 384, in _make_request
    six.raise_from(e, None)
  File "<string>", line 2, in raise_from
  File "C:\Users\user\AppData\Local\Programs\Python\Python37\lib\site-packages\urllib3\connectionpool.py", line 380, in _make_request
    httplib_response = conn.getresponse()
  File "C:\Users\user\AppData\Local\Programs\Python\Python37\lib\http\client.py", line 1321, in getresponse
    response.begin()
  File "C:\Users\user\AppData\Local\Programs\Python\Python37\lib\http\client.py", line 296, in begin
    version, status, reason = self._read_status()
  File "C:\Users\user\AppData\Local\Programs\Python\Python37\lib\http\client.py", line 257, in _read_status
    line = str(self.fp.readline(_MAXLINE + 1), "iso-8859-1")
  File "C:\Users\user\AppData\Local\Programs\Python\Python37\lib\socket.py", line 589, in readinto
    return self._sock.recv_into(b)
  File "C:\Users\user\AppData\Local\Programs\Python\Python37\lib\ssl.py", line 1052, in recv_into
    return self.read(nbytes, buffer)
  File "C:\Users\user\AppData\Local\Programs\Python\Python37\lib\ssl.py", line 911, in read
    return self._sslobj.read(len, buffer)
TimeoutError: [WinError 10060] 接続済みの呼び出し先が一定の時間を過ぎても正しく応答しなかったため、接続できませんでした。または接続済みのホストが応答しなかったため、確立された接続は失敗しました。

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "C:\Users\user\AppData\Local\Programs\Python\Python37\lib\site-packages\requests\adapters.py", line 449, in send
    timeout=timeout
  File "C:\Users\user\AppData\Local\Programs\Python\Python37\lib\site-packages\urllib3\connectionpool.py", line 638, in urlopen
    _stacktrace=sys.exc_info()[2])
(以下同様なエラー出力が続く)

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

関係があるかはわかりませんが、dev environment から検索ツイートの期間は無制限を選択しています。
API上の何らかの制限にかかっていると思うのですが、それが何なのかわかりません。どうかお力添えをいただければと思います。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

とりあえず180リクエスト/15分の制限があるはずなので、それにひっかかるのでは?

https://developer.twitter.com/en/docs/tweets/search/api-reference/get-search-tweets

……と思ったけど一応ちゃんと処理してますね。リクエストを投げるたびにsleepさせた方が相手サーバには優しいと思いますけど。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/02/10 20:36

    助言通り取得毎にsleepさせればエラーが出なくなりました。非常に助かりました、ありがとうございます!

    キャンセル

  • 2019/02/10 20:39

    きっと連続して送りすぎたので弾かれたんでしょうね

    キャンセル

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

  • ただいまの回答率 90.23%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる