it-swarm.com.ru

Превышено максимальное количество попыток с URL в запросах

Я пытаюсь получить содержимое App Store> Business :

import requests
from lxml import html

page = requests.get("https://iTunes.Apple.com/in/genre/ios-business/id6000?mt=8")
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)

Когда я пытаюсь использовать range с (0,2), он работает, но когда я помещаю range в 100s, он показывает эту ошибку:

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)
101
user3446000

Здесь произошло то, что сервер 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 lib, надеюсь, это решит вашу проблему.

107
djra

Просто используйте функции 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 , он имеет много опций для упрощения повторных попыток.

71
Zulu

Просто сделай это,

Вставьте следующий код вместо 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

Пожалуйста :)

27
jatin

pip install pyopenssl, казалось, решил это для меня.

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

18
Akshar

Я получил похожую проблему, но следующий код работал для меня.

url = <some REST url>    
page = requests.get(url, verify=False)

"verify = False" отключает проверку SSL. Попробуйте и поймать можно добавить как обычно.

4
Raj Stha

Всегда полезно реализовать обработку исключений. Это не только помогает избежать неожиданного выхода из скрипта, но также может помочь регистрировать ошибки и информационные уведомления. При использовании запросов 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-адрес, если он заблокирован. Вы можете обойтись без этой функции.

3
Tanmoy Datta