#python #python_3x #urllib
При попытке получить ответ сервера по URL, который СОВЕРШЕННО ТОЧНО редиректит по 307 коду (по 301 скорее всего тоже), urllib3 возвращает 200-й ответ сервера, что дезинформирует. Нужно знать, когда страница возвращает 307-й ответ. Как быть? Ниже привожу часть кода, которая у меня за это дело отвечает. Пробовал через Requests, та же история. from urllib.request import * from urllib.error import * def __init__(self, urls): super().__init__() self.urls = urls def run(self): for url in self.urls: try: code = urlopen(url).getcode() except HTTPError as e: # Пусть будет исключение code = str(e)
Ответы
Ответ 1
Если использовать модуль requests, то при запросе можно указать параметр allow_redirects=False, тогда автоматическое перенаправление выполняться не будет: r = requests.get('http://ya.ru/') print(r) #print(r.url) # https://ya.ru/ - автоматически перенаправлено на https r = requests.get('http://ya.ru/', allow_redirects=False) print(r) # Документация: Redirection and History Ответ 2
Модуль urllib автоматически ходит по перенаправлениям. Не знаю, по какому недоразумению отсутствует штатная возможность отключения этого, но можно написать свой отключающий handler: class NoRedirectHandler(urllib.request.HTTPRedirectHandler): def http_error_302(self, req, fp, code, msg, headers): return fp http_error_301 = http_error_303 = http_error_307 = http_error_302 Потом создаём opener с этим handler'ом: opener = urllib.request.build_opener(NoRedirectHandler()) Теперь можно отправлять свои запросы с помощью метода opener.open, но если хочется отключить обработку перенаправлений по умолчанию везде и сразу, то можно установить его по умолчанию: urllib.request.install_opener(opener) Теперь редиректы обрабатываться не будут: r = urllib.request.urlopen('http://ya.ru/') print(r.code) # → 302 print(r.url) # → http://ya.ru/ print(r.headers['Location']) # → https://ya.ru/
Комментариев нет:
Отправить комментарий