Requests: SSLError: EOF se produjo en violación del protocolo (_ssl.c: 590)

Creado en 9 jul. 2016  ·  6Comentarios  ·  Fuente: psf/requests

Por favor, tengan paciencia conmigo porque soy bastante nuevo con Python y github en general.

He estado usando solicitudes para extraer datos de Play Store. Necesito hacer una gran cantidad de solicitudes (alrededor de 20k). Funciona muy bien para aproximadamente 3000-4000 solicitudes, pero se atasca después de eso (error SSL). No estoy familiarizado con SSL y las solicitudes, por lo que no sé qué causa esto.

Error:

(SSLError                                  Traceback (most recent call last)
<ipython-input-23-1da544640d89> in <module>()
     53         time.sleep(0.1)
     54 
---> 55         r = requests.get('https://play.google.com' + link + '&hl=en')
     56         link_tree = html.fromstring(r.content)
     57         description = link_tree.xpath('//div[@jsname="C4s9Ed"]/text()') + link_tree.xpath('//div[@jsname="C4s9Ed"]/p/text()')

C:\Users\Nathan\AppData\Local\Enthought\Canopy\User\lib\site-packages\requests\api.pyc in get(url, params, **kwargs)
     65 
     66     kwargs.setdefault('allow_redirects', True)
---> 67     return request('get', url, params=params, **kwargs)
     68 
     69 

C:\Users\Nathan\AppData\Local\Enthought\Canopy\User\lib\site-packages\requests\api.pyc in request(method, url, **kwargs)
     51     # cases, and look like a memory leak in others.
     52     with sessions.Session() as session:
---> 53         return session.request(method=method, url=url, **kwargs)
     54 
     55 

C:\Users\Nathan\AppData\Local\Enthought\Canopy\User\lib\site-packages\requests\sessions.pyc in request(self, method, url, params, data, headers, cookies, files, auth, timeout, allow_redirects, proxies, hooks, stream, verify, cert, json)
    466         }
    467         send_kwargs.update(settings)
--> 468         resp = self.send(prep, **send_kwargs)
    469 
    470         return resp

C:\Users\Nathan\AppData\Local\Enthought\Canopy\User\lib\site-packages\requests\sessions.pyc in send(self, request, **kwargs)
    574 
    575         # Send the request
--> 576         r = adapter.send(request, **kwargs)
    577 
    578         # Total elapsed time of the request (approximately)

C:\Users\Nathan\AppData\Local\Enthought\Canopy\User\lib\site-packages\requests\adapters.pyc in send(self, request, stream, timeout, verify, cert, proxies)
    445         except (_SSLError, _HTTPError) as e:
    446             if isinstance(e, _SSLError):
--> 447                 raise SSLError(e, request=request)
    448             elif isinstance(e, ReadTimeoutError):
    449                 raise ReadTimeout(e, request=request)

SSLError: EOF occurred in violation of protocol (_ssl.c:590) )

The-efi, en este github, parecía tener el mismo problema en este hilo: https://github.com/kennethreitz/requests/issues/3006 (ver más abajo, él no era el OP) pero no pude encontrar abrió el hilo para obtener más ayuda. Yo uso Python 2.7. así como.

He estado atascado en esto durante bastante tiempo y no puedo encontrar ninguna respuesta aquí ni StackOverflow (la respuesta probablemente estaba justo debajo de mis narices, pero he tenido problemas para entenderlas debido a mi falta de conocimiento en SSL y solicitudes) .

Gracias de antemano por su ayuda, y lo siento si algo no está claro, por favor avíseme.

Comentario más útil

Tenía exactamente el mismo mensaje de error, el problema era que no tenía ndg-httpsclient instalado

https://github.com/kennethreitz/requests/issues/3605

Todos 6 comentarios

Cuando dices que te quedas atascado, ¿es solo que se activa la excepción? ¿O las solicitudes de seguimiento no funcionan? Lo pregunto porque se producen errores transitorios de red, y si está realizando una gran cantidad de solicitudes web, debería considerar implementar algún tipo de lógica de reintento frente a ellos.

La excepción se dispara. Las solicitudes de seguimiento parecen funcionar, pero todavía no he intentado implementar el reintento. Tenía miedo de estar en contra de las reglas de hacer demasiadas solicitudes a un servidor o algo así, supongo.

Definitivamente lo intentaré y actualizaré este hilo. ¡Gracias!

Bueno, por lo que vale, debido a que está usando requests.* se está poniendo en mayor riesgo de sobrecargar los recursos de red entre usted y el servidor. Deberías intentar usar una sesión .

Para cualquier persona con este problema:

Lo arreglé siguiendo las sugerencias de @Lukasa y agregué esto justo después de importar las solicitudes:

import requests
sess = requests.Session()
adapter = requests.adapters.HTTPAdapter(max_retries = 20)
sess.mount('http://', adapter)

Entonces, donde estaba usando requests.get() antes, usé sess.get() .

¡Espero que esto ayude, y gracias por tu ayuda @Lukasa !

Tenía exactamente el mismo mensaje de error, el problema era que no tenía ndg-httpsclient instalado

https://github.com/kennethreitz/requests/issues/3605

@variable instalé ndg-httpsclient pero el mismo error: urllib.error.URLError :

¿Fue útil esta página
0 / 5 - 0 calificaciones