Подтвердить что ты не робот

Python: requests.exceptions.ConnectionError. Максимальное количество попыток превышено с помощью URL-адреса

This is the 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}

как вы можете видеть, его попытка получить доступ к списку URL-адресов через список прокси. Вот файл urls.txt:

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

вот файл proxies.txt:

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

Я получил этот прокси на www.hidemyass.com. Может быть, это плохой прокси? Я попробовал несколько, и это результат. Примечание. Если вы пытаетесь реплицировать это, возможно, вам придется обновить прокси-сервер до последнего на hidemyass.com. Похоже, что они перестали работать. вот полная ошибка и трассировка:

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'>: '')
4b9b3361

Ответ 1

Глядя на трассировку стека, которую вы указали, ваша ошибка вызвана исключением httplib.BadStatusLine, которое в соответствии с docs:

Поднят, если сервер отвечает кодом состояния HTTP, который мы не понимаем.

Другими словами, что-то, что возвращается (если вообще возвращается) прокси-сервером, не может быть проанализировано с помощью httplib, который выполняет фактический запрос.

Из моего опыта работы с (прописью) http-прокси я могу сказать, что некоторые реализации не могут строго следовать спецификациям (спецификации rfc на http не так просто читать на самом деле) или использовать хаки для исправления старых браузеров, которые имеют недостатки в их реализации.

Итак, отвечая на это:

Может быть, это плохой прокси?

... Я бы сказал, что это возможно. Единственный реальный способ убедиться в том, что посмотреть, что возвращается прокси-сервером.

Попробуйте отладить его с помощью отладчика или снимите сниффер пакетов (что-то вроде Wireshark или Network Monitor), чтобы проанализировать, что происходит в сети. Информация о том, что именно возвращается прокси-сервером, должна дать вам ключ к решению этой проблемы.

Ответ 2

Возможно, вы перегружаете прокси-сервер, отправляя слишком много запросов за короткий промежуток времени, вы говорите, что у вас есть прокси-сервер с популярного веб-сайта прокси-сервера, что означает, что вы не единственный, кто использует этот сервер, и он часто при большой нагрузке.

Если вы добавляете некоторую задержку между вашими запросами следующим образом:

from time import sleep

[...]

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

(обратите внимание на sleep(1), который приостанавливает выполнение кода в течение одной секунды)

Это работает?