libreria - requests python post
Max reintentos superados con URL (6)
Estoy intentando obtener el contenido de esta url " https://itunes.apple.com/in/genre/ios-business/id6000?mt=8 " y muestra este error
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)
el codigo es
url="https://itunes.apple.com/in/genre/ios-business/id6000?mt=8"
page = requests.get(url)
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)
Cuando intento el rango con (0,2) funciona, pero cuando pongo el rango en 100, muestra este error.
Lo que sucedió aquí es que el servidor de iTunes rechaza tu conexión (estás enviando demasiadas solicitudes desde la misma dirección IP en un corto período de tiempo)
Reintentos máximos excedidos con url: / in / app / adobe-reader / id469337564? Mt = 8
el seguimiento de errores es engañoso, debería ser algo así como "No se pudo establecer conexión porque la máquina de destino lo rechazó activamente" .
Hay un problema en Python.requests lib en Github, échale un vistazo here
Para superar este problema (no es tanto un problema, ya que es un seguimiento de depuración engañoso), debe capturar las excepciones relacionadas con la conexión de esta manera:
try:
page1 = requests.get(ap)
except requests.exceptions.ConnectionError:
r.status_code = "Connection refused"
Otra forma de superar este problema es si usa el espacio de tiempo suficiente para enviar solicitudes al servidor, esto puede lograrse mediante la función de sleep(timeinsec)
en python (no se olvide de importar suspensión)
from time import sleep
Todo en todos los pedidos es impresionante libra de Python, espero que resuelva su problema.
Siempre es bueno implementar el manejo de excepciones. No solo ayuda a evitar la salida inesperada de secuencias de comandos, sino que también ayuda a registrar errores y notificaciones de información. Cuando utilizo solicitudes de Python, prefiero capturar excepciones como esta:
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")
Aquí renewIPadress () es una función de definición de usuario que puede cambiar la dirección IP si se bloquea. Puedes irte sin esta función.
Solo haz esto,
Pegue el siguiente código en lugar 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
De nada :)
Solo usa requests''
características de 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)
Esto GET
la URL y reintentará 3 veces en caso de requests.exceptions.ConnectionError
. backoff_factor
ayudará a aplicar retrasos entre intentos para evitar fallar nuevamente en caso de una cuota de solicitud periódica.
Eche un vistazo a requests.packages.urllib3.util.retry.Retry
, tiene muchas opciones para simplificar los reintentos.
Tuve el mismo problema y encontré la solución más fácil para mi caso. Trate de reemplazar esto:
url="https://itunes.apple.com/in/genre/ios-business/id6000?mt=8"
Con este:
url="http://itunes.apple.com/in/genre/ios-business/id6000?mt=8"
La diferencia es "s" en el protocolo. Esto solucionó mi problema.
pip install pyopenssl
me lo solucionó.