web-dev-qa-db-fra.com

Python: requests.exceptions.ConnectionError. Nombre maximal de tentatives dépassé avec l'URL

Voici le script:

import requests
import json
import urlparse
from requests.adapters import HTTPAdapter

s = requests.Session()
s.mount('http://', HTTPAdapter(max_retries=1))

with open('proxies.txt') as proxies:
    for line in proxies:
        proxy=json.loads(line)

    with open('urls.txt') as urls:
        for line in urls:

            url=line.rstrip()
            data=requests.get(url, proxies=proxy)
            data1=data.content
            print data1
            print {'http': line}

comme vous pouvez le constater, il essaie d’accéder à une liste d’URL à travers une liste de serveurs mandataires. Voici le fichier urls.txt: 

http://api.exip.org/?call=ip

voici le fichier proxies.txt: 

{"http":"http://107.17.92.18:8080"}

J'ai reçu cette procuration sur www.hidemyass.com. Serait-ce un mauvais proxy? J'ai essayé plusieurs et c'est le résultat. Remarque: si vous essayez de répliquer cela, vous devrez peut-être mettre à jour le proxy avec un serveur récent à l'adresse hidemyass.com. Ils semblent arrêter de travailler par la suite. voici l'erreur complète et traceback: 

Traceback (most recent call last):
  File "test.py", line 17, in <module>
    data=requests.get(url, proxies=proxy)
  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 335, in request
    resp = self.send(prep, **send_kwargs)
  File "/usr/local/lib/python2.7/dist-packages/requests/sessions.py", line 454, in send
    history = [resp for resp in gen] if allow_redirects else []
  File "/usr/local/lib/python2.7/dist-packages/requests/sessions.py", line 144, in resolve_redirects
    allow_redirects=False,
  File "/usr/local/lib/python2.7/dist-packages/requests/sessions.py", line 438, in send
    r = adapter.send(request, **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/requests/adapters.py", line 327, in send
    raise ConnectionError(e)
requests.exceptions.ConnectionError: HTTPConnectionPool(Host=u'219.231.143.96', port=18186): Max retries exceeded with url: http://www.google.com/ (Caused by <class 'httplib.BadStatusLine'>: '')
24
BigBoy1337

En regardant la trace de pile que vous avez fournie, votre erreur est provoquée par une exception httplib.BadStatusLine, qui, selon docs , est:

Relevé si un serveur répond avec un code d’état HTTP que nous ne comprenons pas.

En d'autres termes, un élément renvoyé (le cas échéant) par le serveur proxy ne peut pas être analysé par httplib qui effectue la demande réelle.

D'après mon expérience avec (l'écriture) proxy http, je peux dire que certaines implémentations peuvent ne pas suivre les spécifications à la lettre (les spécifications RFC sur http ne sont pas faciles à lire) ou utiliser des hacks pour corriger les vieux navigateurs qui présentent des défauts d'implémentation.

Alors, répondant à ceci:

Serait-ce un mauvais proxy?

... Je dirais que c'est possible. Le seul moyen d'être sûr est de voir ce qui est renvoyé par le serveur proxy.

Essayez de le déboguer avec le débogueur ou le renifleur de paquets (quelque chose comme Wireshark ou Moniteur réseau ) pour analyser ce qui se passe sur le réseau. Avoir des informations sur ce qui est exactement renvoyé par le serveur proxy devrait vous donner une clé pour résoudre ce problème.

31
Eugene Loy

Peut-être que vous surchargez le serveur proxy en envoyant trop de demandes en un court laps de temps, vous dites que vous avez obtenu le proxy d'un site Web proxy gratuit gratuit, ce qui signifie que vous n'êtes pas le seul à utiliser ce serveur et qu'il est souvent soumis à de lourdes charges. charge.

Si vous ajoutez un délai entre vos demandes comme ceci:

from time import sleep

[...]

data=requests.get(url, proxies=proxy)
data1=data.content
print data1
print {'http': line}
sleep(1)

(notez le sleep(1) qui suspend l'exécution du code pendant une seconde)

Est-ce que ça marche ? 

7
user2629998
def hello(self):
    self.s = requests.Session()
    self.s.headers.update({'User-Agent': self.user_agent})
    return True

Essayez ceci, cela a fonctionné pour moi :)

0
Ashu