Страницы

Поиск по вопросам

среда, 5 февраля 2020 г.

Как заставить urllib3 возвращать 307/301 ответы сервера?

#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/

Комментариев нет:

Отправить комментарий