Превышено максимальное количество попыток с 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 казалось, решил это для меня.

https://github.com/requests/requests/issues/4246

Указание прокси в корпоративной среде решило эту проблему для меня.

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-адресов с . Одним из лучших решений является следующий скрипт Python, который вычисляет общедоступный IP-адрес любого домена и создает это сопоставление с файлом /etc/hosts.

      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" в протоколе. Это решило мою проблему.

Другие вопросы по тегам