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

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

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

Ответ 1

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

Ответ 2

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

Ответ 3

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

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

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

Ответ 5

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

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

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

Ответ 6

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

Ответ 7

Когда я писал сценарий тестирования браузера селена, я столкнулся с этой ошибкой при вызове driver.quit() перед использованием вызова API JS. Помните, что выход из веб-драйвера - это последнее, что нужно сделать!

Ответ 8

Добавьте заголовки для этого запроса.

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)

Ответ 9

Добавляю свой опыт для тех, кто переживает это в будущем. Моя конкретная ошибка была

Failed to establish a new connection: [Errno 8] nodename nor servname provided, or not known'

Оказывается, это на самом деле потому, что я достиг максимального количества открытых файлов в моей системе. Это не имеет ничего общего с ошибочными подключениями или даже ошибкой DNS, как указано.

Ответ 10

я не смог заставить его работать на 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)

Ответ 11

Я получил ту же проблему и нашел самое простое решение для моего случая. Попробуйте заменить это:

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