Veuillez me supporter car je suis assez nouveau avec Python et github en général.
J'ai utilisé des requêtes pour extraire des données du Play Store. J'ai besoin de faire un grand nombre de requêtes (environ 20k). Cela fonctionne très bien pour environ 3000-4000 requêtes mais reste bloqué après cela (erreur SSL). Je ne connais pas SSL et les requêtes, donc je ne sais pas ce qui cause cela.
Erreur:
(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, sur ce github, semblait avoir le même problème sur ce fil : https://github.com/kennethreitz/requests/issues/3006 (voir ci-dessous, il n'était pas l'OP) mais je n'ai pas pu trouver le fil qu'il a ouvert pour obtenir de l'aide. J'utilise Python 2.7. également.
Je suis bloqué là-dessus depuis un bon moment maintenant et je ne trouve aucune réponse ici ni StackOverflow (la réponse était probablement juste sous mon nez mais j'ai eu du mal à les comprendre à cause de mon manque de connaissances en SSL et requêtes) .
Merci d'avance pour votre aide, et désolé si quelque chose n'est pas clair -- s'il vous plaît faites le moi savoir.
Lorsque vous dites que vous êtes bloqué, est-ce simplement que l'exception se déclenche ? Ou les demandes de suivi ne fonctionnent-elles pas ? Je demande parce que des erreurs de réseau transitoires se produisent, et si vous effectuez un grand nombre de requêtes Web, vous devriez envisager de mettre en œuvre une sorte de logique de nouvelle tentative face à celles-ci.
L'exception se déclenche. Les demandes de suivi semblent fonctionner, mais je n'ai pas encore essayé de réessayer. J'avais peur d'être contre les règles de faire trop de demandes à un serveur ou quelque chose, je suppose.
Je vais certainement essayer et mettre à jour ce fil. Merci!
Eh bien, pour ce que ça vaut, parce que vous utilisez requests.*
vous vous exposez davantage au risque de surcharger les ressources réseau entre vous et le serveur. Vous devriez essayer d'utiliser une session .
Pour toute personne ayant ce problème :
Je l'ai corrigé en suivant les suggestions de @Lukasa et
import requests
sess = requests.Session()
adapter = requests.adapters.HTTPAdapter(max_retries = 20)
sess.mount('http://', adapter)
Ensuite, là où j'utilisais requests.get()
auparavant, j'utilisais sess.get()
.
J'espère que cela aide, et merci pour votre aide @Lukasa !
J'ai eu exactement le même message d'erreur, le problème était que je n'avais pas installé ndg-httpsclient
@variable J'ai installé ndg-httpsclient mais la même erreur : urllib.error.URLError :
Commentaire le plus utile
J'ai eu exactement le même message d'erreur, le problème était que je n'avais pas installé ndg-httpsclient
https://github.com/kennethreitz/requests/issues/3605