Проверка доступности сайтов на Python

Если вы часто берёте данные с веб‑страниц, автоматизация процесса — разумный шаг. Термин «веб‑скрейпинг» обычно используют, когда сайт не предоставляет официального API или фида. Но сначала важно убедиться, что сайт доступен: при недоступности скрипт или сбор данных не сработают.
Если вы управляете своим сайтом, вы наверняка сталкивались с простоем. Это раздражает: теряются посетители и прерываются сервисы. Поэтому полезно уметь быстро проверять доступность сайта.
Python — удобный язык для таких задач. Его лаконичный синтаксис и богатая экосистема позволяют быстро собрать рабочий проверяльщик сайтов.
Создание персонального проверяльщика сайтов
Проверяльщик спроектирован так, чтобы обрабатывать сразу несколько сайтов. Это упрощает добавление или удаление сайтов и даёт лёгкую основу для дальнейшего развития.
Импорт библиотек
Для начала импортируйте библиотеку requests.
import requestsRequests упрощает работу с HTTP: отправку запросов и чтение ответов.
Хранение URL в списке
Сохраните адреса сайтов в списке. Это позволяет проверять сразу несколько адресов.
website_url = [
"https://www.google.co.in",
"https://www.yahoo.com",
"https://www.amazon.co.in",
"https://www.pipsnacks.com/404",
"http://the-internet.herokuapp.com/status_codes/301",
"http://the-internet.herokuapp.com/status_codes/500",
]Переменная website_url хранит список строк с URL. Замените примеры на ваши адреса по необходимости.
Сообщения для распространённых HTTP‑кодов
Лучше хранить читаемые сообщения по коду ответа в словаре. Это делает вывод понятнее для человека.
statuses = {
200: "Website Available",
301: "Permanent Redirect",
302: "Temporary Redirect",
404: "Not Found",
500: "Internal Server Error",
503: "Service Unavailable",
}Цикл проверки статусов сайтов
Пройдитесь по списку и отправьте GET‑запрос к каждому URL. В базовом варианте можно оставить try/except для обработки ошибок.
for url in website_url:
try:
web_response = requests.get(url)
print(url, statuses[web_response.status_code])
except:
print(url, statuses.get(web_response.status_code, "Request failed"))Где:
- for url… — проходит по списку URL.
- url — текущая строка с адресом.
- try/except — ловит исключения, например сетевые ошибки.
- web_response — объект ответа, у которого есть статусный код.
Полный, улучшенный код
Ниже — более надёжная версия: таймаут, явная обработка исключений и значение по умолчанию для неизвестных кодов.
import requests
website_url = [
"https://www.google.co.in",
"https://www.yahoo.com",
"https://www.amazon.co.in",
"https://www.pipsnacks.com/404",
"http://the-internet.herokuapp.com/status_codes/301",
"http://the-internet.herokuapp.com/status_codes/500",
]
statuses = {
200: "Website Available",
301: "Permanent Redirect",
302: "Temporary Redirect",
404: "Not Found",
500: "Internal Server Error",
503: "Service Unavailable",
}
for url in website_url:
try:
web_response = requests.get(url, timeout=5)
message = statuses.get(web_response.status_code, f"HTTP {web_response.status_code}")
print(url, message)
except requests.RequestException as e:
# Явно логируем сетевые и протокольные ошибки
print(url, "Connection error:", str(e))Пример запуска и вывода кода показан ниже.
Когда такой подход не сработает
- Сайты, требующие аутентификации или CSRF‑токенов. Простые GET‑запросы вернут страницу входа или ошибку.
- Защищённые API с rate limit: частые запросы приведут к блокировке.
- Динамический контент, который рендерится на стороне клиента (JS). requests не выполнит JS.
В этих случаях понадобятся дополнительные инструменты: сессии с авторизацией, управление задержками и заголовками, или headless‑браузер (Selenium, Playwright).
Альтернативные подходы
- Использовать специализированные сервисы мониторинга (UptimeRobot, Pingdom) — меньше поддержки, но больше удобства.
- Применять асинхронные запросы (aiohttp) для проверки тысяч сайтов одновременно.
- Headless‑браузеры для проверки рендеренного контента и взаимодействия с формами.
Простая методология для внедрения
- Составьте список URL и ожидаемые коды (200, 301 и т. п.).
- Настройте периодический запуск (cron, systemd, облачные функции).
- Логируйте результаты и предупреждения в файл или систему мониторинга.
- Настройте алёрты (email, Slack) при критических кодах или недоступности.
Чеклист ролей
- Разработчик: добавить проверку таймаута, обработку исключений, логирование.
- DevOps: настроить периодический запуск и интеграцию с алёртами.
- Тестировщик: добавить тестовые случаи для кодов 200, 301, 404, 500 и симуляции таймаута.
Критерии приёмки
- Скрипт возвращает читаемые сообщения для известных HTTP‑кодов.
- Скрипт не зависает при недоступности сайта (реагирует на timeout).
- Ошибки логируются с текстом исключения.
- Можно добавить или убрать URL без правки кода (подключение конфигурации).
Тестовые случаи
- Валидный сайт с 200 → вывод “Website Available”.
- Редирект 301 → вывод “Permanent Redirect”.
- 404 → вывод “Not Found”.
- Искусственный таймаут (блокировка) → сообщение об ошибке соединения.
Безопасность и приватность
- Не храните в коде секреты или токены в открытом виде.
- Уважайте правила сайта: используйте robots.txt и лимитируйте частоту запросов.
- При работе с пользовательскими данными соблюдайте требования локального законодательства о персональных данных.
Резюме
Простой скрипт на Python позволяет быстро проверять доступность сайтов и понимать их статус по HTTP‑кодам. Улучшения — таймауты, обработка исключений, логирование и асинхронность — делают решение надёжным и масштабируемым. Для сложных сценариев рассмотрите headless‑браузеры или внешние сервисы мониторинга.
Важно: начинайте с малого, автоматизируйте базовые проверки и постепенно добавляйте безопасность, алёрты и отчётность.
Похожие материалы
Как пожаловаться на пользователя в Snapchat
Связывание заметок в Apple Notes на iPhone
Лазерная гравировка по стеклу — практическое руководство
PayPal в Apple ID: добавить и удалить
Как безопасно стереть SSD — полное руководство