Понимание try и except в Python — это разница между сканером, который останавливается после одного неверного запроса, и краулером, который продолжает работать даже через сетевые сбои. В производственном скрапинге ошибки — это нормально. Сервер может истечь по времени, прокси может не сработать, страница может вернуть 403, или селектор может сломаться после изменения разметки. Этот гид объясняет try, except, else и finally с точки зрения высокодоступных краулеров. Он написан для разработчиков на Python, которые уже отправляют HTTP-запросы и теперь нуждаются в более безопасной обработке ошибок. Вы узнаете, как отлавливать конкретные исключения, повторять запросы с увеличением времени ожидания, вращать прокси, освобождать ресурсы и использовать Nstproxy как часть стабильного рабочего процесса с прокси.
Ключевые моменты
Используйте python try except, чтобы обрабатывать ожидаемые сбои краулера, не скрывая ошибки.
Ловите конкретные исключения, такие как Timeout, ProxyError и HTTPError.
Используйте else для парсинга только после успешного запроса.
Используйте finally для очистки, закрытия сессии и метрик.
Сочетайте логику повторных попыток с вращением прокси, когда повторяются сетевые сбои.
Общие исключения в веб-скрапинге
Скрейперы терпят неудачу по определенным паттернам, поэтому обработка исключений должна соответствовать этим паттернам. Рассматривайте сетевые ошибки, ошибки прокси, ошибки статуса HTTP и ошибки парсинга как разные события.
Попробуйте Nstproxy - Начните бесплатный тест сегодня
Тип сбоя
Общая причина
Типичное исключение или сигнал
Действие
Тайм-аут
Медленный сервер или плохая сеть
requests.exceptions.Timeout
Повторить с увеличением времени ожидания
Сбой прокси
Неисправный прокси или проблема с аутентификацией
requests.exceptions.ProxyError
Переключить прокси
Ошибка подключения
DNS, сброс, отказ в подключении
ConnectionError
Повторить или приостановить
Блокировка HTTP
403, 407, 429
Код статуса
Повернуть прокси или уменьшить скорость
Ошибка парсинга
HTML изменился
AttributeError, KeyError
Логировать и обновить парсер
Ошибка JSON
Неверное тело ответа
ValueError
Проверить тип контента
Официальная документация requests перечисляет такие исключения, как Timeout, TooManyRedirects и HTTPError в своем руководстве по ошибкам и исключениям. Python также документирует обработку исключений в Ошибки и исключения.
Ключевое правило простое. Ловите то, от чего можете восстановиться. Позвольте неизвестным ошибкам всплывать в процессе разработки.
Основы try except в Python для краулеров
try except в Python следует использовать только для рискованных операций. В краулере это обычно означает запрос, проверку статуса, шаг парсера или шаг хранения. Держите каждый блок достаточно небольшим для объяснения.
import requests
url ="https://example.com/products"try: response = requests.get(url, timeout=10) response.raise_for_status()except requests.exceptions.Timeout:print("Запрос превысил время ожидания; запланируйте повтор.")except requests.exceptions.HTTPError as exc:print(f"HTTP ошибка: {exc.response.status_code}")except requests.exceptions.RequestException as exc:print(f"Сетевая ошибка: {exc}")else: html = response.text
print("Теперь безопасно парсить страницу.")
Этот шаблон лучше, чем широкий except:. Он разделяет тайм-ауты, HTTP-ошибки и общие сбои запроса. Он также сохраняет парсинг в блоке else, который выполняется только после успешного запроса.
Избегайте этого шаблона в производстве:
try: response = requests.get(url)except:pass
Он скрывает реальные ошибки. Он также создает молчаливые пробелы в данных, которые труднее исправить, чем видимые ошибки.
Ловля ошибок прокси и вращение IP-адресов
Ошибки прокси требуют отдельной ветви, поскольку исправление отличается от обычной повторной попытки. Если конечная точка прокси не сработала, повторение того же запроса через тот же прокси может потратить время. Скрейпер должен пометить прокси как неисправный и попробовать другой.
import requests
deffetch_with_proxy(url, proxy): proxies ={"http": proxy,"https": proxy,}try: response = requests.get(url, proxies=proxies, timeout=12) response.raise_for_status()except requests.exceptions.ProxyError:return{"ok":False,"reason":"proxy_error","retry":True}except requests.exceptions.Timeout:return{"ok":False,"reason":"timeout","retry":True}except requests.exceptions.HTTPError as exc: status = exc.response.status_code
return{"ok":False,"reason":f"http_{status}","retry": status in(403,407,429)}except requests.exceptions.RequestException as exc:return{"ok":False,"reason":str(exc),"retry":True}else:return{"ok":True,"html": response.text}
Эта структура явно определяет решения по повторным попыткам. Ошибка ProxyError может вызвать замену прокси. Ошибка 429 может привести к замедлению темпа. Ошибка 403 может вызвать пересмотр заголовков, поведения сессии или качества прокси.
Nstproxy естественно вписывается сюда. Если ваш скрепер использует пул прокси с ротацией, Nstproxy может предоставить более чистые источники прокси для повторных запросов. Его интеллектуальная ротация IP и глобальное покрытие уменьшают вероятность блокировок, CAPTCHA и ограничений по скорости, позволяя скреперам получать доступ к публичной информации в больших объемах.
Блок else подходит для работы, которая должна выполняться только после того, как не произошло никаких исключений. В скрепере поместите парсинг или извлечение сюда. Это предотвращает запуск парсера на отсутствующем или неудачном ответе.
Блок finally лучше всего использовать для очистки. Используйте его для закрытия сеансов, освобождения страниц браузера, обновления метрик или возврата токена прокси в пул. Избегайте сложной бизнес-логики в finally.
session = requests.Session()try: response = session.get(url, timeout=10) response.raise_for_status()except requests.exceptions.RequestException as exc: logger.warning("fetch_failed", extra={"url": url,"error":str(exc)})else: title = parse_title(response.text) save_record(url, title)finally: session.close()
Это читается как жизненный цикл краулера. Попробуйте запрос. Обработайте известные сбои. Парсите только при успехе. Очищайте каждый раз.
Документация Python также поддерживает повторное поднятие исключений, когда вызывающий должен решить, что делать дальше. Это полезно, когда низкоуровневая функция получения данных не должна скрывать сбой от планировщика заданий.
Стратегия повторных попыток в Производстве
Логика повторных попыток в производстве должна быть ограниченной, наблюдаемой и вежливой. Бесконечные повторные попытки могут перегрузить целевой сайт и потратить пропускную способность прокси. Более безопасный подход — это экспоненциальное увеличение времени ожидания с вариацией, пределами повторных попыток и решениями, основанными на статусе.
Проект urllib3 документирует утилиту Retry для обработки поведения повторных попыток в HTTP-клиентах. См. urllib3 Retry для получения основных концепций.
Триггер повтора
Повтор?
Дополнительное действие
Тайм-аут
Да
Увеличить время ожидания
ProxyError
Да
Заменить прокси
403
Иногда
Проверить заголовки и репутацию прокси
407
Да
Проверить аутентификацию прокси
429
Да
Замедлить скорость и сменить IP
404
Нет
Зафиксировать отсутствующую страницу
Ошибка парсера
Без немедленного повтора
Записать образец HTML
Код в производстве должен записывать каждую попытку. Включите URL, код состояния, тип исключения, ID прокси, количество повторных попыток и окончательный результат. Эти поля помогут вам отделить плохие прокси от плохих парсеров.
Nstproxy может уменьшить шум на сетевом уровне, предоставляя краулерам управляемый источник прокси вместо случайных бесплатных прокси. Команды также могут использовать бесплатный проверщик прокси во время диагностики и жилые прокси для рабочих процессов, которые требуют реалистичных сетевых профилей.
Сравнительное резюме: Простое Try Except против Производственной Обработки
Простые примеры python try except хороши для обучения. Скреперы в производстве требуют большей структуры, потому что одно и то же исключение может означать разные действия.
Область
Шаблон для начинающих
Шаблон для скрепера в производстве
Тип исключения
Уловить все ошибки
Уловить конкретные исключения
Обработка прокси
Повторить тот же запрос
Заменить прокси при ошибке прокси
Код HTTP
Игнорировать или печатать
Направлять по 403, 407, 429, 5xx
Логирование
Вывод в консоль
Структурированные логи с ID прокси
Повторные попытки
Руководствоваться вручную
Увеличение времени ожидания, вариация, максимум попыток
Парсинг
Парсить внутри try
Парсить в else после успеха
Очистка
Часто пропускается
finally закрывает сеансы
Практический Рабочий Процесс для Скрепера с Высокой Доступностью
Стабильный краулер должен рассматривать сбои как данные. Каждый неудачный запрос должен обновлять следующее решение.
Используйте этот рабочий процесс:
Выберите URL и прокси.
Отправьте запрос с тайм-аутом.
Перехватите конкретные исключения сети и прокси.
Повторите с увеличением времени ожидания, когда ошибка может быть исправлена.
Смените прокси при ProxyError, 407, повторяющемся 403 или повторяющемся 429.
Парсите только после чистого ответа.
Запишите окончательный результат.
Сохраните неудачные URL для последующего просмотра.
Этот рабочий процесс улучшает уровень выживания, не скрывая реальных дефектов. Он также помогает командам решать, когда проблема связана с целевой страницей, парсером, шаблоном запроса или пулом прокси.
Она позволяет Python выполнять рискованный код в блоке try и обрабатывать ожидаемые сбои в одном или нескольких блоках except. В скраперах это предотвращает остановку всей задачи из-за одного неудачного запроса.
Должен ли я ловить Exception в скраперe?
Сначала ловите конкретные исключения. Используйте Exception только на границе, где вы записываете ошибку и продолжаете выполнение задачи. Избегайте пустого except:, так как это может скрывать ошибки.
Как обрабатывать ошибки прокси в запросах Python?
Ловите requests.exceptions.ProxyError, помечайте прокси как неработающий, затем повторите попытку с другим прокси. Также записывайте ID прокси, URL и счетчик попыток.
Должен ли код парсинга находиться внутри try или else?
Размещайте парсинг в else, когда он зависит от успешного запроса. Это предотвращает попадание неудачных ответов в ваш парсер.
Как Nstproxy помогает повысить надежность скраперов?
Nstproxy предоставляет инфраструктуру прокси, которая может поддерживать повторные попытки и ротацию IP. Это помогает снизить количество сбоев, вызванных необеспеченными или нестабильными источниками прокси.
Заключение
Python try-except — это не просто синтаксис для начинающих, когда вы создаете веб-скрапер. Это управляющий уровень, который поддерживает выполнение задач во время тайм-аутов, сбоев прокси, блокировок HTTP и изменений парсера.
Начните с малого. Ловите конкретные исключения. Используйте else для парсинга и finally для очистки. Добавьте ограниченные повторные попытки с использованием нарастания. Поворачивайте прокси, когда сбой связан с сетью. Для команд, которым нужна более стабильная инфраструктура прокси, Nstproxy является практичным решением для процессов скрапинга на Python.