Превышено максимальное количество попыток с URL
Я пытаюсь получить содержание этого URL-адреса " https://itunes.apple.com/in/genre/ios-business/id6000?mt=8" и в нем отображается эта ошибка.
Traceback (most recent call last):
File "/home/preetham/Desktop/eg.py", line 17, in <module>
page1 = requests.get(ap)
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 383, in request
resp = self.send(prep, **send_kwargs)
File "/usr/local/lib/python2.7/dist-packages/requests/sessions.py", line 486, in send
r = adapter.send(request, **kwargs)
File "/usr/local/lib/python2.7/dist-packages/requests/adapters.py", line 378, in send
raise ConnectionError(e)
requests.exceptions.ConnectionError: HTTPSConnectionPool(host='itunes.apple.com', port=443): Max retries exceeded with url: /in/app/adobe-reader/id469337564?mt=8 (Caused by <class 'socket.gaierror'>: [Errno -2] Name or service not known)
код
url="https://itunes.apple.com/in/genre/ios-business/id6000?mt=8"
page = requests.get(url)
tree = html.fromstring(page.text)
flist=[]
plist=[]
for i in range(0,100):
app = tree.xpath("//div[@class='column first']/ul/li/a/@href")
ap=app[0]
page1 = requests.get(ap)
когда я пробую диапазон с (0,2), он работает, но когда я помещаю диапазон в 100, он показывает эту ошибку.
23 ответа
Просто используйте requests'
функции:
import requests
from requests.adapters import HTTPAdapter
from requests.packages.urllib3.util.retry import Retry
session = requests.Session()
retry = Retry(connect=3, backoff_factor=0.5)
adapter = HTTPAdapter(max_retries=retry)
session.mount('http://', adapter)
session.mount('https://', adapter)
session.get(url)
Это будет GET
URL и повторите 3 раза в случае requests.exceptions.ConnectionError
, backoff_factor
поможет применить задержки между попытками избежать повторного сбоя в случае периодической квоты запроса.
Взгляни на requests.packages.urllib3.util.retry.Retry
, у него есть много вариантов, чтобы упростить повторные попытки.
Здесь произошло то, что сервер itunes отклонил ваше соединение (вы отправляете слишком много запросов с одного и того же IP-адреса за короткий промежуток времени)
Максимальное количество повторных попыток превышено с помощью URL: /in/app/adobe-reader/id469337564? Mt=8
трассировка ошибки вводит в заблуждение, это должно быть что-то вроде "Невозможно установить соединение, потому что целевая машина активно отказала ему"
Существует проблема примерно в python.requests lib на Github, посмотрите здесь
Чтобы преодолеть эту проблему (не столько проблему, сколько вводящую в заблуждение трассировку отладки), вы должны перехватывать исключения, связанные с подключением, например:
try:
page1 = requests.get(ap)
except requests.exceptions.ConnectionError:
r.status_code = "Connection refused"
Другой способ решить эту проблему - если вы используете достаточно времени для отправки запросов на сервер, это может быть достигнуто sleep(timeinsec)
функция в Python (не забудьте импортировать сон)
from time import sleep
В общем, все запросы - это потрясающая библиотека Python, надеюсь, она решит вашу проблему.
Просто сделай это,
Вставьте следующий код вместо page = requests.get(url)
:
import time
page = ''
while page == '':
try:
page = requests.get(url)
break
except:
print("Connection refused by the server..")
print("Let me sleep for 5 seconds")
print("ZZzzzz...")
time.sleep(5)
print("Was a nice sleep, now let me continue...")
continue
Пожалуйста:)
Я получил похожую проблему, но следующий код работал для меня.
url = <some REST url>
page = requests.get(url, verify=False)
"verify = False" отключает проверку SSL. Попробуйте и поймать можно добавить как обычно.
pip install pyopenssl
казалось, решил это для меня.
Указание прокси в корпоративной среде решило эту проблему для меня.
page = requests.get("http://www.google.com:80", proxies={"http": "http://111.233.225.166:1234"})
Полная ошибка:
request.exceptions.ConnectionError: HTTPSConnectionPool(host='www.google.com', port=80): Превышено максимальное количество повторных попыток с url: / (вызвано NewConnectionError(': Не удалось установить новое соединение: [WinError 10060] Соединение попытка не удалась, потому что подключенная сторона не ответила должным образом по прошествии определенного периода времени, или установление соединения не удалось, потому что подключенный хост не ответил '))
Всегда полезно реализовать обработку исключений. Это не только помогает избежать неожиданного выхода из скрипта, но также может помочь регистрировать ошибки и информационные уведомления. При использовании запросов Python я предпочитаю ловить исключения вроде этого:
try:
res = requests.get(adress,timeout=30)
except requests.ConnectionError as e:
print("OOPS!! Connection Error. Make sure you are connected to Internet. Technical Details given below.\n")
print(str(e))
renewIPadress()
continue
except requests.Timeout as e:
print("OOPS!! Timeout Error")
print(str(e))
renewIPadress()
continue
except requests.RequestException as e:
print("OOPS!! General Error")
print(str(e))
renewIPadress()
continue
except KeyboardInterrupt:
print("Someone closed the program")
Здесь renewIPadress() - это пользовательская функция, которая может изменить IP-адрес, если он заблокирован. Вы можете обойтись без этой функции.
Добавляю свой собственный опыт для тех, кто столкнется с этим в будущем. Моя конкретная ошибка была
Failed to establish a new connection: [Errno 8] nodename nor servname provided, or not known'
Оказывается, на самом деле это произошло потому, что в моей системе было достигнуто максимальное количество открытых файлов. Это не имело ничего общего с неудачными подключениями или даже ошибкой DNS, как указано.
Я не смог заставить его работать в Windows даже после установки pyopenssl и попытки использования различных версий Python (хотя он работал нормально на Mac), поэтому я переключился на urllib, и он работает на python 3.6 (из python .org) и 3.7 (anaconda)
import urllib
from urllib.request import urlopen
html = urlopen("http://pythonscraping.com/pages/page1.html")
contents = html.read()
print(contents)
Когда я писал тестовый скрипт браузера selenium, я столкнулся с этой ошибкой при вызове driver.quit()
перед использованием JS api-вызова. Помните, что выход из webdriver - это последнее, что нужно сделать!
В моем случае я развертываю некоторые контейнеры докеров внутри скрипта Python, а затем вызываю одну из развернутых служб. Ошибка исправлена, когда я добавляю некоторую задержку перед вызовом службы. Думаю, нужно время, чтобы подготовиться к подключению.
from time import sleep
#deploy containers
#get URL of the container
sleep(5)
response = requests.get(url,verify=False)
print(response.json())
Это также может быть проблема с сетевой конфигурацией. Итак, для этого вам нужно перенастроить настройки сети.
для Ubuntu:sudo vim /etc / network / interfaces
добавьте 8.8.8.8 в dns-nameserver и сохраните его.
сбросить сеть ur: /etc/init.d/networking restart
А теперь попробуй ..
просто добавь :
time.sleep(6)
где-то в цикле for, чтобы не отправлять слишком много запросов на сервер за короткое время. цифра 6 означает: 6 секунд. продолжайте проверять числа, начиная с 1, пока не дойдете до минимума секунд, который поможет избежать проблемы.
Моя ситуация довольно особенная. Я пробовал ответы выше, ни один из них не работал. Я вдруг подумал, не связано ли это с моим интернет-прокси? Знаете, я нахожусь в материковом Китае и не могу получить доступ к таким сайтам, как Google, без интернет-прокси. Затем я отключил свой интернет-прокси, и проблема была решена.
Добавлю свой опыт:
r = requests.get(download_url)
когда я пытался скачать файл, указанный в url.
Ошибка была
HTTPSConnectionPool(host, port=443): Max retries exceeded with url (Caused by SSLError(SSLError("bad handshake: Error([('SSL routines', 'tls_process_server_certificate', 'certificate verify failed')])")))
Я поправил, добавив verify = False
в функции следующим образом:
r = requests.get(download_url + filename)
open(filename, 'wb').write(r.content)
Проверьте подключение к сети. У меня было это, и у виртуальной машины не было надлежащего сетевого подключения.
У меня была такая же ошибка при запуске маршрута в браузере, но в почтальоне все работает нормально. Проблема с моей заключалась в том, что не было/
после маршрута перед строкой запроса.
127.0.0.1:5000/api/v1/search/?location=Madina
поднять ошибку и удалить /
после search
работал у меня.
Мое решение этой проблемы состояло в том, чтобы использовать: «verify = False»
page = Requests.get("https://itunes.apple.com/in/genre/ios-business/id6000?mt=8",verify = False)
Это происходит, когда вы отправляете слишком много запросов на публичный IP-адрес домена . Как вы можете видеть, это вызвано какой-то причиной, которая не разрешает/блокирует доступ к сопоставлению общедоступных IP-адресов с
import re
import socket
import subprocess
from typing import Tuple
ENDPOINT = 'https://anydomainname.example.com/'
ENDPOINT = 'https://itunes.apple.com/'
def get_public_ip() -> Tuple[str, str, str]:
"""
Command to get public_ip address of host machine and endpoint domain
Returns
-------
my_public_ip : str
Ip address string of host machine.
end_point_ip_address : str
Ip address of endpoint domain host.
end_point_domain : str
domain name of endpoint.
"""
# bash_command = """host myip.opendns.com resolver1.opendns.com | \
# grep "myip.opendns.com has" | awk '{print $4}'"""
# bash_command = """curl ifconfig.co"""
# bash_command = """curl ifconfig.me"""
bash_command = """ curl icanhazip.com"""
my_public_ip = subprocess.getoutput(bash_command)
my_public_ip = re.compile("[0-9.]{4,}").findall(my_public_ip)[0]
end_point_domain = (
ENDPOINT.replace("https://", "")
.replace("http://", "")
.replace("/", "")
)
end_point_ip_address = socket.gethostbyname(end_point_domain)
return my_public_ip, end_point_ip_address, end_point_domain
def set_etc_host(ip_address: str, domain: str) -> str:
"""
A function to write mapping of ip_address and domain name in /etc/hosts.
Ref: https://stackoverflow.com/questions/38302867/how-to-update-etc-hosts-file-in-docker-image-during-docker-build
Parameters
----------
ip_address : str
IP address of the domain.
domain : str
domain name of endpoint.
Returns
-------
str
Message to identify success or failure of the operation.
"""
bash_command = """echo "{} {}" >> /etc/hosts""".format(ip_address, domain)
output = subprocess.getoutput(bash_command)
return output
if __name__ == "__main__":
my_public_ip, end_point_ip_address, end_point_domain = get_public_ip()
output = set_etc_host(ip_address=end_point_ip_address, domain=end_point_domain)
print("My public IP address:", my_public_ip)
print("ENDPOINT public IP address:", end_point_ip_address)
print("ENDPOINT Domain Name:", end_point_domain )
print("Command output:", output)
Вы можете вызвать приведенный выше скрипт перед запуском нужной функции :)
Иногда вам нужно проверить, что ваша сеть доступна и не заблокирована брандмауэром и т. д.
Добавьте заголовки для этого запроса.
headers={
'Referer': 'https://itunes.apple.com',
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36'
}
requests.get(ap, headers=headers)
Я пишу тест с помощью Gauge, и я также столкнулся с этой ошибкой, потому что я пытался запросить внутренний URL-адрес без активации VPN.
Я получил ту же проблему и нашел самое простое решение для моего случая. Попробуйте заменить это:
url="https://itunes.apple.com/in/genre/ios-business/id6000?mt=8"
С этим:
url="http://itunes.apple.com/in/genre/ios-business/id6000?mt=8"
Разница "s" в протоколе. Это решило мою проблему.