Я пытаюсь получить содержимое App Store> Business:
Когда я пытаюсь range с (0,2) , он работает, но когда я помещаю range в 100 , он показывает эту ошибку:
Что произошло, так это то, что сервер itunes отказывается от вашего соединения (вы отправляете слишком много запросов с одного и того же IP-адреса за короткий промежуток времени)
Максимальное количество попыток превышено с помощью url:/in/app/adobe-reader/ >
Ошибка трассировки вводит в заблуждение, она должна быть чем-то вроде «Никакое соединение не может быть сделано, потому что целевая машина активно отказалась от него» .
Существует проблема с python.requests lib в Github, проверьте здесь
Чтобы преодолеть эту проблему (не столько проблема, как обманчивая трассировка отладки), вы должны поймать связанные с подключением исключения следующим образом:
Еще один способ преодолеть эту проблему — использовать достаточный промежуток времени для отправки запросов на сервер. Это может быть достигнуто с помощью функции sleep(timeinsec) в python (не забудьте импортировать сон)
Все запросы — это потрясающая папка python, надеюсь, что решает вашу проблему.
модуль запросов Python прост и элегантен, но меня беспокоит одна вещь. Можно получить запросы.исключение.ConnectionError сообщение типа:
это означает, что запросы могут пытаться получить доступ к данным несколько раз. Но в документах нет ни единого упоминания об этой возможности. Глядя на исходный код, я не нашел места, где я мог бы изменить значение по умолчанию (предположительно 0).
Так можно ли как-то установить максимальное количество попыток для запросов?
6 ответов
это базовый urllib3 библиотека, которая выполняет повторную попытку. Чтобы задать другое максимальное число повторов, используйте альтернативные транспортные адаптеры:
на max_retries аргумент принимает целое число или Retry() объект; последний дает вам мелкозернистый контроль над тем, какие виды сбоев повторяются (целочисленное значение превращается в Retry() экземпляр, который обрабатывает только сбои соединения; ошибки после подключения по умолчанию не обрабатывается, поскольку это может привести к побочным эффектам).
старый ответ, предшествующий выпуску запросов 1.2.1:
на requests библиотека на самом деле не делает это настраиваемым, и не собирается (см. этот запрос тянуть). В настоящее время (запросы 1.1) количество попыток равно 0. Если вы действительно хотите установить его на более высокое значение, вам придется установить это глобально:
эта константа не документирована; используйте это на свой страх и риск, поскольку будущие выпуски могут изменить то, как это обрабатывается.
обновление: и это сделал изменить; в версии 1.2.1 настройка max_retries параметр на HTTPAdapter() класс был добавлен, так что теперь вам нужно использовать альтернативные транспортные адаптеры, см. выше. Подход monkey-patch больше не работает, если вы также не исправите HTTPAdapter.__init__() настройки по умолчанию (очень не рекомендуется).
это не только изменит max_retries, но и включит стратегию возврата, которая делает запросы ко всем http:// адреса сна в течение определенного периода времени перед повторной попыткой (в общей сложности 5 раз):
по состоянию на документация для повтора: если backoff_factor равен 0.1, то sleep () будет спать в течение [0.1 s, 0.2 s, 0.4 s, . ] между попытками. Он также заставит повторить попытку, если возвращенный код состояния 500, 502, 503 или 504.
различные другие опции для повторной попытки позволяют более детализированный контроль:
- total-общее количество попыток разрешить.
- connect — сколько ошибок, связанных с подключением, чтобы повторить попытку.
- read — сколько раз повторить попытку при ошибках чтения.
- redirect — сколько перенаправлений выполнять.
- method_whitelist-набор прописных глаголов метода HTTP, которые мы должны повторить.
- status_forcelist-набор кодов состояния HTTP, которые мы должен заставить повторить попытку.
- backoff_factor — коэффициент возврата для применения между попытками.
- raise_on_redirect-если количество переадресаций исчерпано, вызвать MaxRetryError или вернуть ответ с кодом ответа в диапазоне 3xx.
- raise_on_status-аналогичное значение raise_on_redirect: должны ли мы вызывать исключение или возвращать ответ, если статус падает в диапазоне status_forcelist и повторные попытки были измученный.
NB: raise_on_status является относительно новым и еще не превратился в выпуск urllib3 или запросов. на raise_on_status аргумент ключевого слова, похоже, попал в стандартную библиотеку не более чем в python версии 3.6
для повторения запросов по определенным кодам состояния HTTP используйте status_forcelist. Например, status_forcelist=[503] повторит попытку для кода состояния 503 (service недоступный.)
по умолчанию повторная попытка срабатывает только для этих условий:
- не удалось получить подключение из пула.
- TimeoutError
- HTTPException поднято (из http.клиент в Python 3 else httplib). Это кажется низкоуровневыми исключениями HTTP, такими как URL или протокол not сформировано правильно.
- SocketError
- ошибка протокола
обратите внимание, что все эти исключения предотвращают регулярный HTTP-ответ от получения. Если любой генерируется регулярный ответ, повторная попытка не выполняется. Без использования status_forcelist даже ответ со статусом 500 не будет повторен.
чтобы заставить его вести себя более интуитивно понятным для работы с удаленным API или веб-сервером, я бы использовал приведенный выше фрагмент кода, который заставляет повторять попытки на статусах 500, 502, 503 и 504, все из которых не редкость в интернете и (возможно) восстанавливаются с учетом большого достаточно периода отступления.
HTTPConnectionPool(host=’127.0.0.1′, port=48457): Max retries exceeded with url: /session/76af77e47285142cc188ed81e217fbb4/source (Caused by NewConnectionError(‘: Failed to establish a new connection: [Errno 111] Connection refused’))
2019-06-14 17:44:04.270078
Traceback (most recent call last):
File «/root/.local/lib/python3.7/site-packages/urllib3/connection.py», line 159, in _new_conn
(self._dns_host, self.port), self.timeout, **extra_kw)
File «/root/.local/lib/python3.7/site-packages/urllib3/util/connection.py», line 80, in create_connection
raise err
File «/root/.local/lib/python3.7/site-packages/urllib3/util/connection.py», line 70, in create_connection
sock.connect(sa)
ConnectionRefusedError: [Errno 111] Connection refused
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File «/root/.local/lib/python3.7/site-packages/urllib3/connectionpool.py», line 600, in urlopen
chunked=chunked)
File «/root/.local/lib/python3.7/site-packages/urllib3/connectionpool.py», line 354, in _make_request
conn.request(method, url, **httplib_request_kw)
File «/usr/local/lib/python3.7/http/client.py», line 1229, in request
self._send_request(method, url, body, headers, encode_chunked)
File «/root/.local/lib/python3.7/site-packages/selenium/webdriver/remote/remote_connection.py», line 374, in execute
return self._request(command_info[0], url, body=data)
File «/root/.local/lib/python3.7/site-packages/selenium/webdriver/remote/remote_connection.py», line 397, in _request
resp = self._conn.request(method, url, body=body, headers=headers)
File «/root/.local/lib/python3.7/site-packages/urllib3/request.py», line 68, in request
**urlopen_kw)
File «/root/.local/lib/python3.7/site-packages/urllib3/request.py», line 89, in request_encode_url
return self.urlopen(method, url, **extra_kw)
File «/root/.local/lib/python3.7/site-packages/urllib3/poolmanager.py», line 323, in urlopen
response = conn.urlopen(method, u.request_uri, **kw)
File «/root/.local/lib/python3.7/site-packages/urllib3/connectionpool.py», line 667, in urlopen
**response_kw)
File «/root/.local/lib/python3.7/site-packages/urllib3/connectionpool.py», line 667, in urlopen
**response_kw)
File «/root/.local/lib/python3.7/site-packages/urllib3/connectionpool.py», line 667, in urlopen
**response_kw)
File «/root/.local/lib/python3.7/site-packages/urllib3/connectionpool.py», line 638, in urlopen
_stacktrace=sys.exc_info()[2])
File «/root/.local/lib/python3.7/site-packages/urllib3/util/retry.py», line 398, in increment
raise MaxRetryError(_pool, url, error or ResponseError(cause))
urllib3.exceptions.MaxRetryError: HTTPConnectionPool(host=’127.0.0.1′, port=48457): Max retries exceeded with url: /session/76af77e47285142cc188ed81e217fbb4/window (Caused by NewConnectionError(‘: Failed to establish a new connection: [Errno 111] Connection refused’))
urllib3==1.24.1
selenium==3.141.0
Читал что это должны были пофиксить как раз в версии 3.141 , но самое забавное что на этом же сервере буквально месяц назад скрипт работал в течении 40 дней без перерыва и вполне исправно. Подскажите что попробовать?
p.s делал и слипы, и даже перезагрузку в случае исключения, но это увы не помогает даже при перегрузки вебдрайвера с выгрузкой из памяти. Подумал даже может провайдер может что-то ограничивает?