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 100
s, 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)
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.
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.
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 :)
pip install pyopenssl
sembla le résoudre pour moi.
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.
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.
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!
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é.
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)