Обработка сетевых ошибок, таймауты

Сетевые ошибки

Если в результате сетевого запроса происходит ошибка, Grab генерирует GrabNetworkError исключение. Что такое сетевая ошибка? Сервер может вообще не устанавливать соединение по нашему запросу или он может вернуть HTTP-ответ с кодом отличным от 2** (см Статусы HTTP ответа). Любой запрос с кодом отличным от 2** или 404 считается ошибкой и генерируется GrabNetworkError исключение. Нужно ли считать 404 ошибкой - спорный вопрос. Мне удобнее обрабатывать этот случай как нормальный ответ сервера. Возможно, нужна опция, устанавливающая какие коды ответа считать неошибочными.

Таймауты

Вы можете настроить максимальное время ожидания начала передачи данных от сервера опцией connect_timeout и максимальное время на весь процесс отправки запроса-прёма данных опцией timeout.

В случае превышение заданного времени, будет сгенерировано GrabTimeoutError исключение.

Режим повторных запросов

В случае активации опции hammer_mode Grab переключается в режим повторной отсылки того же запроса в случае сетевой ошибки. Количество повторных запросов и их таймауты настраиваются опцией hammer_timeouts. Рассмотрим пример:

g.setup(hammer_mode=True, hammer_timeouts=((2, 5), (10, 15), (20, 30)))
g.go('http://some/url')

Это значит, что первый сетевой запрос будет произведён с настройками connect_timeout=2, timeout=5. В случае timeout-ошибки или получения ответа с кодом отличным от успешного (см. обработка сетевых ошибок), запрос будет произведён ещё раз, но на этот раз с настройками connect_timeout=10, timeout=15. Если повторный запрос окончится неудачей будет проивзденё последний третий запрос с натройками connect_timeout=20, timeout=30. Надеюсь, вы поняли принцип.