Python3 Urllib Http error 403 — except

904 просмотра
0
0 Комментариев

Во время парсинга сайта, выкидывает ошибку 403:

    raise HTTPError(req.full_url, code, msg, hdrs, fp)
urllib.error.HTTPError: HTTP Error 403: Forbidden

Видел «решение» с «юзер эджент» но оно не решает (у меня даже в браузере выскакивает такая ошибка на этом сайте).

Нужно именно железное решение в коде — в случае возникновения 403 ошибки (желательно и остальных) перезапустить код еще раз.

Проблема в том что except не улавливает ни HTTPError ни urllib.error.HTTPError ни urllib.HTTPError ни urllib.error. В отличии от ValueError TypeError IndexError с которыми все ок работает.

В начале кода импортировал библиотеку с ошибками from urllib.error import URLError, HTTPError«

Конкретный вопрос: как «отловить» эту ошибку 403?


Добавить комментарий

3 Answers

Python Опубликовано 14.12.2018
0

Что-то вроде такого:

from urllib.request import urlopen
import time
 
while True:
    try:
        with urlopen(URL) as f:
            print(f.read())
 
        # Прошло без ошибок, выходим
        break
 
    except Exception as e:
        print(e)
 
        # Ждем 30 секунд перед повтором запроса
        time.sleep(30)

Можно дальше — ограничить количество повторов, отлавливать и обрабатывать индивидуально разные исключения, увеличивать таймауты между повторами для повторяющихся ошибок

Добавить комментарий
0

Если у вас есть возможность использовать urrlib2, отлавливайте код ошибки urllib2.HTTPError. Например:

import urllib2
import time
 
try:
   do_something()
except urllib2.HTTPError as e:
   if e.code == 403:
        print(e)
        time.sleep(TIMEOUT)
        do_something()
else:
   raise

Либо ловить код ошибки urllib.error.HTTPError :

from urllib.error import HTTPError
import time
 
try:
   do_something()
except HTTPError as e:
   if e.code == 403:
        print(e)
        time.sleep(TIMEOUT)
        do_something()
else:
   raise

Добавить комментарий
0

HTTPError работает:

#!/usr/bin/env python3
from urllib.request import urlopen
from urllib.error import HTTPError
 
try:
    urlopen('http://httpbin.org/status/403')
except HTTPError as e:
    assert e.code == 403
else:
    assert 0, 'never happens'

Чтобы повторить запрос max_attempts раз в случае получения 403 Forbidden HTTP статуса:

for _ in range(max_attempts):
    try:
        response = urlopen(url)
    except HTTPError as e:
        if e.code == 403:
            last_error = e
            continue  # try again
        raise  # allow other errors to propagate up the stack
    else:  # success
        break
else:  # no break: all attempts failed
    raise last_error  # raise last error

Добавить комментарий
Напишите свой ответ на данный вопрос.
Scroll Up