Превышено максимальное количество попыток с 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)
Ответы
Ответ 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
Пожалуйста :)
Ответ 4
pip install pyopenssl
похоже, решил это за меня.
https://github.com/requests/requests/issues/4246
Ответ 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" в протоколе. Это решило мою проблему.