paulenot
@paulenot
IT Issue

Почему библиотека requests не работает при проверке статуса кода в Python?

Писал скрипт, который проверяет статус сервера в таком варианте все работало:
#!/usr/bin/env python3
import requests
import sys

domain = str('http://' + sys.argv[1])
position = 0
lines = 1
while position != lines:
	response = requests.get(domain)
	if response.status_code == 200:
		print('[200] Все хорошо: ' + str(domain))
	elif response.status_code == 404:
		print('[404] Страница отсутствует ' + str(domain))
	position += 1

Вывод терминала:

> python3 requester.py ya.ru
[200] Все хорошо: https://ya.ru
> python3 requester.py ya.ru/bgdtrubi
[404] Страница отсутствует: https://ya.ru/bgdtrubi


Но код ответа не всегда соответствует заданным, по этому я отредактировал, что бы понимать какой код возвращает скрипт:
#!/usr/bin/env python3
import requests
import sys

domain = str('http://' + sys.argv[1])
position = 0
lines = 1
while position != lines:
	response = requests.get(domain)
	if response.status_code == 200:
		print('[200] Все хорошо: ' + str(domain))
	else:
		print('[' + str(response.status_code) + '] Не все хорошо: ' + str(domain))
	position += 1

При вводе существующего домена вывод терминала такой:

> python3 requester.py ya.ru
[200] Все хорошо: ya.ru
> python3 requester.py ya.ru/bgdtrubi
[404] Не все хорошо: ya.ru/bgdtrubi

И тут начались проблемы, когда я пытаюсь проверить свободный домен - он даже код не возвращает. Вывод терминала:

Traceback (most recent call last):
File "/home/usr/.local/lib/python3.6/site-packages/urllib3/connection.py", line 157, in _new_conn
(self._dns_host, self.port), self.timeout, **extra_kw
File "/home/usr/.local/lib/python3.6/site-packages/urllib3/util/connection.py", line 61, in create_connection
for res in socket.getaddrinfo(host, port, family, socket.SOCK_STREAM):
File "/usr/lib/python3.6/socket.py", line 745, in getaddrinfo
for res in _socket.getaddrinfo(host, port, family, type, proto, flags):
socket.gaierror: [Errno -2] Name or service not known

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "/home/usr/.local/lib/python3.6/site-packages/urllib3/connectionpool.py", line 672, in urlopen
chunked=chunked,
File "/home/usr/.local/lib/python3.6/site-packages/urllib3/connectionpool.py", line 387, in _make_request
conn.request(method, url, **httplib_request_kw)
File "/usr/lib/python3.6/http/client.py", line 1264, in request
self._send_request(method, url, body, headers, encode_chunked)
File "/usr/lib/python3.6/http/client.py", line 1310, in _send_request
self.endheaders(body, encode_chunked=encode_chunked)
File "/usr/lib/python3.6/http/client.py", line 1259, in endheaders
self._send_output(message_body, encode_chunked=encode_chunked)
File "/usr/lib/python3.6/http/client.py", line 1038, in _send_output
self.send(msg)
File "/usr/lib/python3.6/http/client.py", line 976, in send
self.connect()
File "/home/usr/.local/lib/python3.6/site-packages/urllib3/connection.py", line 184, in connect
conn = self._new_conn()
File "/home/usr/.local/lib/python3.6/site-packages/urllib3/connection.py", line 169, in _new_conn
self, "Failed to establish a new connection: %s" % e
urllib3.exceptions.NewConnectionError: : Failed to establish a new connection: [Errno -2] Name or service not known

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "/home/usr/.local/lib/python3.6/site-packages/requests/adapters.py", line 449, in send
timeout=timeout
File "/home/usr/.local/lib/python3.6/site-packages/urllib3/connectionpool.py", line 720, in urlopen
method, url, error=e, _pool=self, _stacktrace=sys.exc_info()[2]
File "/home/usr/.local/lib/python3.6/site-packages/urllib3/util/retry.py", line 436, in increment
raise MaxRetryError(_pool, url, error or ResponseError(cause))
urllib3.exceptions.MaxRetryError: HTTPConnectionPool(host='yqqqqa.ru', port=80): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno -2] Name or service not known',))

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "requester.py", line 9, in
response = requests.get(domain)
File "/home/usr/.local/lib/python3.6/site-packages/requests/api.py", line 76, in get
return request('get', url, params=params, **kwargs)
File "/home/usr/.local/lib/python3.6/site-packages/requests/api.py", line 61, in request
return session.request(method=method, url=url, **kwargs)
File "/home/usr/.local/lib/python3.6/site-packages/requests/sessions.py", line 530, in request
resp = self.send(prep, **send_kwargs)
File "/home/usr/.local/lib/python3.6/site-packages/requests/sessions.py", line 643, in send
r = adapter.send(request, **kwargs)
File "/home/usr/.local/lib/python3.6/site-packages/requests/adapters.py", line 516, in send
raise ConnectionError(e, request=request)
requests.exceptions.ConnectionError: HTTPConnectionPool(host='yqqqqa.ru', port=80): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno -2] Name or service not known',))


Гугление мне почти ничего не дало, так много строк, не понятно что именно гуглить. Я пробовал отключить проверку сертификата из одной статьи:
response = requests.get(domain, verify=False)
Это ничего не дало... Подскажите пожалуйста, что с этим делать. Как мне все таки получить ответ (существует домен и с каким кодом, или не существует)?
  • Вопрос задан
  • 101 просмотр
Решения вопроса 1
hottabxp
@hottabxp Куратор тега Python
Миллиардер. Честно, 100 пистонов!
1) Обратите внимание, что http и https - это разные штуки.
2) В данном случае (как впрочем и во многих остальных) нужно обрабатывать исключения.
В документации к библиотеке requests есть список исключений и их описание: - Requests exceptions
Вот там можно обработать исключение, когда мы вводим адрес несуществующего сайта(или не валидного):
import requests
import sys

domain = 'http://' + sys.argv[1]

try:
	response = requests.get(domain)
	if response.status_code == 200:
		print('[200] Все хорошо: ' + domain)
	else:
		print('[' + str(response.status_code) + '] Не все хорошо: ' + domain)
except requests.ConnectionError:
	print(f'Сайта {domain} не существует')
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы