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.
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
@variable instalé ndg-httpsclient pero el mismo error: urllib.error.URLError :
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