Введение
В операционной работе часто требуется проверять доступность веб-сервисов. Хотя сторонние библиотеки, например requests, широко используются, в ограниченных средах иногда приходится работать только со стандартной библиотекой Python.
В этой лабораторной работе вы используете модуль стандартной библиотеки Python urllib, чтобы создать простое средство проверки подключения. На этом примере видно, что полезные инструменты для операционных задач часто можно создавать без дополнительных зависимостей.
В результате вы научитесь:
- импортировать модуль
urllib.request; - определять функцию для проверки URL;
- получать коды состояния HTTP, например
200 OK; - обрабатывать такие ошибки, как ошибки сервера или недоступность узла;
- выводить понятные пользователю сообщения о состоянии.
Импорт модулей
На этом шаге вы создадите скрипт Python и импортируете необходимый модуль. Модуль urllib.request — встроенный инструмент Python для открытия URL. Его можно представить как веб-браузер, например Chrome или Firefox, которым вы управляете с помощью кода, а не мыши. Скрипт с его помощью может получать данные из интернета.
Это полезно в операционной работе, поскольку многие системы предоставляют API на основе HTTP или конечные точки проверки состояния. Даже если позднее вы начнёте использовать сторонние библиотеки, понимание инструментов стандартной библиотеки поможет лучше разобраться в базовой модели «запрос — ответ».
Сначала убедитесь, что вы находитесь в нужном каталоге. Откройте терминал и перейдите в каталог проекта:
cd ~/project
Теперь создайте новый файл Python с именем connectivity_check.py с помощью текстового редактора nano или любого другого удобного редактора:
nano connectivity_check.py
В Python перед использованием библиотеки её нужно импортировать. Добавьте следующие строки в начало файла. Мы импортируем urllib.request для выполнения запроса, а urllib.error — для обработки возможных ошибок на следующих шагах.
import urllib.request
import urllib.error
Нажмите Ctrl+O, затем Enter, чтобы сохранить файл, и Ctrl+X, чтобы выйти из nano.
Проверить содержимое файла можно с помощью команды cat:
cat connectivity_check.py
Определение функции
Теперь, когда импорты готовы, нужно структурировать код. Рекомендуется помещать логику в функции. Это делает код повторно используемым и упрощает его тестирование.
Функции особенно полезны в операционных скриптах, поскольку одно и то же действие часто требуется выполнять для нескольких целей. Если поместить проверку сети в функцию, её можно вызывать для разных URL, не дублируя код.
На этом шаге вы определите функцию с именем check_url, которая принимает строку URL в качестве аргумента.
Снова откройте файл connectivity_check.py:
nano connectivity_check.py
Добавьте следующее определение функции под строками импорта. Пока мы добавим только инструкцию pass — это заполнитель в Python, который означает «ничего не делать». Логику функции мы добавим на следующих шагах.
import urllib.request
import urllib.error
def check_url(url):
print(f"Checking connectivity for: {url}")
## Logic will go here
pass
Сохраните файл и выйдите из редактора (Ctrl+O, Enter, Ctrl+X).
Эта структура задаёт основу программы. Функция check_url принимает один параметр url, содержащий адрес веб-сайта, который мы хотим проверить, например "https://www.google.com".
Выполнение запроса
На этом шаге мы реализуем основную логику: отправим запрос и получим код состояния HTTP. Код состояния HTTP 200 обычно означает «OK», то есть успешное выполнение запроса.
В общих чертах HTTP-запрос представляет собой обмен данными между клиентом и сервером. Ваш скрипт выступает в роли клиента: он отправляет запрос по URL, ожидает ответ сервера, а затем проверяет такие метаданные, как код состояния, прежде чем решить, что делать дальше.
Для открытия URL мы используем urllib.request.urlopen(). Эта функция возвращает объект ответа, у которого есть метод .getcode() для получения кода состояния.
Откройте файл connectivity_check.py:
nano connectivity_check.py
Измените функцию check_url, чтобы она выглядела следующим образом. Обратите внимание: мы добавляем тайм-аут в 5 секунд, чтобы скрипт не зависал, если сервер не отвечает.
import urllib.request
import urllib.error
def check_url(url):
print(f"Checking connectivity for: {url}")
## Open the URL with a 5-second timeout
response = urllib.request.urlopen(url, timeout=5)
## Get the status code
status_code = response.getcode()
print(f"Status Code: {status_code}")
Примечание: на этом этапе скрипт завершится с ошибкой, если URL недействителен или сервер недоступен, поскольку обработка ошибок ещё не добавлена. Мы исправим это на следующем шаге.
Сохраните файл и выйдите из редактора.
Обработка ошибок
Сетевое программирование непредсказуемо. Серверы могут отключаться, DNS-запросы — завершаться ошибкой, а интернет-соединение — прерываться. Если urlopen не может выполнить запрос, функция возбуждает исключение. Чтобы сделать скрипт устойчивым, нужно обработать такие исключения с помощью блока try...except.
Различие между типами сбоев важно при реальном мониторинге. Ответ сервера с кодом 500 означает, что запрос дошёл до сервера, но сервер сообщил о внутренней проблеме. URLError часто означает, что запрос вообще не достиг доступной конечной точки HTTP. Хороший специалист по эксплуатации рассматривает такие ситуации как разные классы инцидентов.
Мы обработаем два конкретных типа ошибок:
urllib.error.HTTPError: сервер ответил, но вернул код ошибки, например 404 Not Found или 500 Server Error;urllib.error.URLError: сервер вообще не удалось достичь, например из-за отсутствия интернета или неправильного домена.
Блок try...except можно представить как страховочную сетку. Если что-то пойдёт не так, например пропадёт интернет, код не завершится аварийно. Вместо этого выполнение перейдёт в блок except, где мы перехватим ошибку и выведем понятное сообщение.
Откройте файл connectivity_check.py:
nano connectivity_check.py
Измените функцию, поместив логику запроса в блок try:
import urllib.request
import urllib.error
def check_url(url):
print(f"Checking connectivity for: {url}")
try:
## Attempt to open the URL
response = urllib.request.urlopen(url, timeout=5)
status_code = response.getcode()
print(f"Success! Status Code: {status_code}")
except urllib.error.HTTPError as e:
## Server responded with an error (e.g., 404, 500)
print(f"HTTP Error: {e.code}")
except urllib.error.URLError as e:
## Failed to reach the server
print(f"URL Error: {e.reason}")
Сначала код выполняет строки внутри блока try. Если возникает ошибка, Python прекращает выполнение блока try и переходит в соответствующий блок except.
Сохраните файл и выйдите из редактора.
Тестирование скрипта
На последнем шаге мы добавим основной блок, который вызывает нашу функцию. Благодаря этому скрипт можно будет запускать непосредственно из терминала.
Конструкция if __name__ == "__main__": — общепринятый в Python способ отделить повторно используемые функции от кода, который должен выполняться при непосредственном запуске файла. Благодаря этому другой скрипт сможет импортировать check_url, не запуская автоматически тестовые вызовы.
Мы протестируем скрипт с заведомо рабочим URL, например https://www.example.com. Также можно проверить вымышленный URL и увидеть, как работает обработка ошибок.
Откройте файл connectivity_check.py:
nano connectivity_check.py
Добавьте следующий код в конец файла:
if __name__ == "__main__":
## Test with a valid URL
target_url = "https://www.example.com"
check_url(target_url)
print("-" * 20)
## Test with an invalid URL to see error handling
invalid_url = "https://www.this-domain-does-not-exist-12345.com"
check_url(invalid_url)
Блок if __name__ == "__main__": гарантирует, что этот код будет выполняться только при непосредственном запуске скрипта, а не при импорте файла как модуля в другом скрипте.
Сохраните файл и выйдите из редактора.
Теперь запустите скрипт и просмотрите результаты:
python3 connectivity_check.py
Вы должны увидеть вывод, похожий на следующий:
Checking connectivity for: https://www.example.com
Success! Status Code: 200
--------------------
Checking connectivity for: https://www.this-domain-does-not-exist-12345.com
URL Error: [Errno -2] Name or service not known
(Примечание: точное сообщение об ошибке для недействительного URL может немного отличаться в зависимости от сетевого окружения.)
Итоги
В этой лабораторной работе вы успешно создали средство проверки сетевого подключения с помощью стандартной библиотеки Python. Вы научились:
- Импортировать модули: использовать
urllib.requestиurllib.error; - Выполнять HTTP-запросы: подключаться к веб-серверу с помощью
urlopen; - Обрабатывать ответы: получать коды состояния HTTP для проверки доступности сервиса;
- Обрабатывать ошибки: использовать блоки
try...exceptдля обработкиHTTPErrorиURLError, делая скрипт устойчивым к сетевым сбоям.
Этот навык необходим при создании скриптов мониторинга, проверок состояния и простых веб-скрейперов в средах, где нельзя устанавливать внешние зависимости.



