web-dev-qa-db-fra.com

Nombre maximal de tentatives dépassé avec l'URL dans les demandes

J'essaie d'obtenir le contenu de App Store> Affaires :

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)

Lorsque j'essaie le range avec (0,2) cela fonctionne, mais lorsque je mets le range dans 100s, il affiche cette erreur:

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)
110
user3446000

Ce qui s’est passé ici, c’est que le serveur iTunes refuse votre connexion (vous envoyez trop de demandes à partir de la même adresse IP en peu de temps).

Nombre maximal de tentatives dépassé avec url:/in/app/Adobe-reader/id469337564? Mt = 8

la trace d'erreur est trompeuse. Elle devrait ressembler à quelque chose comme "Aucune connexion n'a pu être établie car la machine cible l'a activement refusée" .

Il y a un problème à propos de python.requests lib chez Github, regardez-le ici

Pour résoudre ce problème (qui n'est pas tellement un problème car il s'agit d'une trace de débogage trompeuse), vous devez intercepter les exceptions liées à la connexion, comme suit:

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

Un autre moyen de résoudre ce problème consiste à utiliser la fonction sleep(timeinsec) dans python si vous utilisez suffisamment de temps pour envoyer des requêtes au serveur (n'oubliez pas d'importer la mise en veille).

from time import sleep

Dans l'ensemble, les demandes sont géniales python lib, j'espère que cela résoudra votre problème.

111
djra

Il suffit d'utiliser _requests'_ caractéristiques:

_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)
_

Cela GET l'URL et réessayez 3 fois dans le cas de _requests.exceptions.ConnectionError_. _backoff_factor_ aidera à appliquer des délais entre les tentatives pour éviter un nouvel échec en cas de quota de demandes périodiques.

Jetez un coup d'œil à requests.packages.urllib3.util.retry.Retry , il propose de nombreuses options pour simplifier les tentatives.

79
Zulu

Fais juste ça,

Collez le code suivant à la place de 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

Vous êtes les bienvenus :)

29
jatin

pip install pyopenssl sembla le résoudre pour moi.

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

20
Akshar

J'ai un problème similaire mais le code suivant a fonctionné pour moi.

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

"verify = False" désactive la vérification SSL. Essayez et attrapez peut être ajouté comme d'habitude.

8
Raj Stha

Il est toujours bon d'implémenter la gestion des exceptions. Cela permet non seulement d'éviter la sortie inattendue du script, mais également de consigner les erreurs et les notifications d'informations. Lorsque j'utilise les requêtes Python, je préfère intercepter les exceptions comme ceci:

    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 () est ici une fonction définie par l'utilisateur qui peut changer l'adresse IP si elle est bloquée. Vous pouvez y aller sans cette fonction.

3
Tanmoy Datta

Lorsque j'écrivais un script de test de navigateur Selenium, je rencontrais cette erreur en appelant driver.quit() avant d'utiliser un appel JS api. Rappelez-vous que quitter Webdriver est la dernière chose à faire!

1
Saleh

Ajout de ma propre expérience pour ceux qui vivent cela à l'avenir. Mon erreur spécifique était

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

Il s’avère que c’est parce que j’ai atteint le nombre maximum de fichiers ouverts sur mon système. Cela n’a rien à voir avec des échecs de connexion, ni même avec une erreur DNS, comme indiqué.

0
Oded

Ajoutez des en-têtes pour cette demande.

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