web-dev-qa-db-ja.com

リクエストのURLで最大再試行回数を超えました

App Store> Business の内容を取得しようとしています。

import requests
from lxml import html

page = requests.get("https://iTunes.Apple.com/in/genre/ios-business/id6000?mt=8")
tree = html.fromstring(page.text)

flist = []
plist = []
for i in range(0, 100):
    app = tree.xpath("//div[@class='column first']/ul/li/a/@href")
    ap = app[0]
    page1 = requests.get(ap)

range(0,2)で試すとうまくいきますが、range100sに入れるとこのエラーが表示されます。

Traceback (most recent call last):
  File "/home/preetham/Desktop/eg.py", line 17, in <module>
    page1 = requests.get(ap)
  File "/usr/local/lib/python2.7/dist-packages/requests/api.py", line 55, in get
    return request('get', url, **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/requests/api.py", line 44, in request
    return session.request(method=method, url=url, **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/requests/sessions.py", line 383, in request
    resp = self.send(prep, **send_kwargs)
  File "/usr/local/lib/python2.7/dist-packages/requests/sessions.py", line 486, in send
    r = adapter.send(request, **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/requests/adapters.py", line 378, in send
    raise ConnectionError(e)
requests.exceptions.ConnectionError: HTTPSConnectionPool(Host='iTunes.Apple.com', port=443): Max retries exceeded with url: /in/app/Adobe-reader/id469337564?mt=8 (Caused by <class 'socket.gaierror'>: [Errno -2] Name or service not known)
101
user3446000

ここで起こったことは、iTunesサーバーがあなたの接続を拒否しているということです(あなたは短期間に同じIPアドレスからあまりにも多くのリクエストを送信しています)

最大再試行回数がurl:/ in/app/Adob​​e-reader/id469337564で最大回数を超えましたか?mt = 8

エラートレースは、「ターゲットマシンが積極的に拒否したため、接続できませんでした」のように誤解を招く可能性があります。

Githubのlibについてはpython.requests libに問題があります。こちらをチェックしてください こちら

この問題を解決するには(デバッグトレースの誤解を招くほどの問題ではありません)、次のような接続関連の例外をキャッチする必要があります。

try:
    page1 = requests.get(ap)
except requests.exceptions.ConnectionError:
    r.status_code = "Connection refused"

この問題を克服するもう1つの方法は、リクエストをサーバに送信するのに十分なタイムギャップを使用する場合、これはpythonのsleep(timeinsec)関数によって実現できます(sleepをインポートすることを忘れないでください)。

from time import sleep

すべての要求のすべては素晴らしいpython libです、それがあなたの問題を解決することを願っています。

107
djra

requests'機能を使うだけです:

import requests
from requests.adapters import HTTPAdapter
from requests.packages.urllib3.util.retry import Retry


session = requests.Session()
retry = Retry(connect=3, backoff_factor=0.5)
adapter = HTTPAdapter(max_retries=retry)
session.mount('http://', adapter)
session.mount('https://', adapter)

session.get(url)

これはURLをGETし、requests.exceptions.ConnectionErrorの場合は3回再試行します。 backoff_factorは、定期的なリクエストクォータの場合に再度失敗するのを避けるために試行間に遅延を適用するのを助けます。

requests.packages.urllib3.util.retry.Retry を見てください。再試行を簡単にするための多くのオプションがあります。

71
Zulu

これをしてください。

page = requests.get(url)の代わりに次のコードを貼り付けます。

import time

page = ''
while page == '':
    try:
        page = requests.get(url)
        break
    except:
        print("Connection refused by the server..")
        print("Let me sleep for 5 seconds")
        print("ZZzzzz...")
        time.sleep(5)
        print("Was a Nice sleep, now let me continue...")
        continue

どういたしまして :)

27
jatin

pip install pyopensslはそれを解決してくれたようです。

https://github.com/requests/requests/issues/4246

18
Akshar

私は同様の問題を抱えていましたが、以下のコードが私のために働きました。

url = <some REST url>    
page = requests.get(url, verify=False)

"verify = False"はSSL検証を無効にします。トライアンドキャッチはいつも通り追加できます。

4
Raj Stha

例外処理を実装することは常に良いことです。スクリプトの予期せぬ終了を防ぐのに役立つだけでなく、エラーや情報通知を記録するのにも役立ちます。 Pythonリクエストを使うとき、私はこのような例外を捕らえることを好みます:

    try:
        res = requests.get(adress,timeout=30)
    except requests.ConnectionError as e:
        print("OOPS!! Connection Error. Make sure you are connected to Internet. Technical Details given below.\n")
        print(str(e))            
        renewIPadress()
        continue
    except requests.Timeout as e:
        print("OOPS!! Timeout Error")
        print(str(e))
        renewIPadress()
        continue
    except requests.RequestException as e:
        print("OOPS!! General Error")
        print(str(e))
        renewIPadress()
        continue
    except KeyboardInterrupt:
        print("Someone closed the program")

ここでrenewIPadress()は、IPアドレスがブロックされた場合にIPアドレスを変更できるユーザー定義関数です。あなたはこの機能なしで行くことができます。

3
Tanmoy Datta

Seleniumブラウザーのテストスクリプトを作成しているときに、JS API呼び出しを使用する前にdriver.quit()を呼び出すと、このエラーが発生しました。

1
Saleh

将来これを経験している人のために私自身の経験を追加します。私の特定のエラーは

Failed to establish a new connection: [Errno 8] nodename nor servname provided, or not known'

これは実際には、システムで開いているファイルの最大数に達したためであることがわかりました。接続の失敗や、示されているDNSエラーとは関係ありません。

0
Oded

このリクエストのヘッダーを追加します。

headers={
'Referer': 'https://iTunes.Apple.com',
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36'

}

requests.get(ap, headers=headers)
0
Michael Yang