Документация Python неофициальный перевод
Содержание страницы

urllib.request – Расширяемая библиотека для открытия URLurllib.request – Extensible library for opening URLs

Исходный код: Lib/urllib/request.py


Модуль urllib.request определяет функции и классы, которые помогают открывать URL (в основном HTTP) в сложном мире – базовая и дайджест-аутентификация, перенаправления, куки и многое другое.

См. также

Для высокоуровневого интерфейса HTTP-клиента рекомендуется пакет Requests.

Предупреждение

В macOS использовать этот модуль в программах, использующих os.fork(), небезопасно, поскольку реализация getproxies() для macOS использует системный API более высокого уровня. Установите переменную окружения no_proxy в *, чтобы избежать этой проблемы (например, os.environ["no_proxy"] = "*").

Доступность: не WASI.

Этот модуль не работает или недоступен на WebAssembly. Подробнее см. платформы WebAssembly.

Модуль urllib.request определяет следующие функции:

urllib.request.urlopen(url, data=None, [timeout, ]*, context=None)

Открывает url, который может быть строкой, содержащей корректный, правильно закодированный URL, или объектом Request.

data должен быть объектом, задающим дополнительные данные для отправки серверу, или None, если такие данные не нужны. Подробнее см. Request.

Модуль urllib.request использует HTTP/1.1 и включает заголовок Connection:close в свои HTTP-запросы.

Необязательный параметр timeout задает таймаут в секундах для блокирующих операций, таких как попытка подключения (если не указан, используется глобальная настройка таймаута по умолчанию). Это на самом деле работает только для HTTP, HTTPS и FTP-соединений.

Если указан context, он должен быть экземпляром ssl.SSLContext, описывающим различные параметры SSL. Подробнее см. HTTPSConnection.

Эта функция всегда возвращает объект, который может работать как контекстный менеджер и имеет свойства url, headers и status. Подробнее об этих свойствах см. urllib.response.addinfourl.

Для HTTP и HTTPS URL эта функция возвращает слегка измененный объект http.client.HTTPResponse. В дополнение к трем новым методам, указанным выше, атрибут msg содержит ту же информацию, что и атрибут reason – фразу причины, возвращаемую сервером – вместо заголовков ответа, как указано в документации для HTTPResponse.

Для FTP, file и data URL эта функция возвращает объект urllib.response.addinfourl.

Возбуждает URLError при ошибках протокола.

Обратите внимание, что может быть возвращен None, если ни один обработчик не обрабатывает запрос (хотя установленный по умолчанию глобальный OpenerDirector использует UnknownHandler, чтобы гарантировать, что этого никогда не произойдет).

Кроме того, если обнаружены настройки прокси (например, когда установлена переменная окружения *_proxy, например http_proxy), ProxyHandler устанавливается по умолчанию и гарантирует, что запросы обрабатываются через прокси.

Устаревшая функция urllib.urlopen из Python 2.6 и более ранних версий была прекращена; urllib.request.urlopen() соответствует старому urllib2.urlopen. Обработка прокси, которая осуществлялась передачей словаря в параметр функции urllib.urlopen, может быть получена с помощью объектов ProxyHandler.

Стандартный открыватель возбуждает событие аудита urllib.Request с аргументами fullurl, data, headers, method, взятыми из объекта запроса.

Изменено в версии 3.2: добавлены cafile и capath.

Виртуальные хосты HTTPS теперь поддерживаются, если это возможно (то есть, если ssl.HAS_SNI истинно).

data может быть итерируемым объектом.

Изменено в версии 3.3: добавлен cadefault.

Изменено в версии 3.4.3: добавлен context.

Изменено в версии 3.10: HTTPS-соединение теперь отправляет расширение ALPN с индикатором протокола http/1.1, если не указан context. Пользовательский context должен устанавливать протоколы ALPN с помощью set_alpn_protocols().

Изменено в версии 3.13: Удалены параметры cafile, capath и cadefault: вместо них используйте параметр context.

urllib.request.install_opener(opener)

Устанавливает экземпляр OpenerDirector в качестве глобального открывателя по умолчанию. Установка открывателя необходима только в том случае, если требуется, чтобы urlopen использовал именно его; в противном случае просто вызывайте OpenerDirector.open() вместо urlopen(). Код не проверяет, является ли объект настоящим OpenerDirector; подойдет любой класс с соответствующим интерфейсом.

urllib.request.build_opener([handler, ...])

Возвращает экземпляр OpenerDirector, который объединяет обработчики в заданном порядке. обработчики могут быть либо экземплярами BaseHandler, либо подклассами BaseHandler (в этом случае должна быть возможность вызвать конструктор без параметров). Экземпляры следующих классов будут помещены перед обработчиками, если только обработчики не содержат их, их экземпляры или подклассы: ProxyHandler (если обнаружены настройки прокси), UnknownHandler, HTTPHandler, HTTPDefaultErrorHandler, HTTPRedirectHandler, FTPHandler, FileHandler, HTTPErrorProcessor.

Если установка Python поддерживает SSL (т.е. если модуль ssl может быть импортирован), HTTPSHandler также будет добавлен.

Подкласс BaseHandler также может изменить свой атрибут handler_order, чтобы изменить свою позицию в списке обработчиков.

urllib.request.pathname2url(path, *, add_scheme=False)

Преобразует указанный локальный путь в URL file:. Для кодирования пути используется функция quote().

Если add_scheme равен false (по умолчанию), возвращаемое значение не включает префикс схемы file:. Задайте add_scheme равным true, чтобы вернуть полный URL.

В этом примере показано использование функции в Windows:

>>> from urllib.request import pathname2url
>>> path = 'C:\\Program Files'
>>> pathname2url(path, add_scheme=True)
'file:///C:/Program%20Files'

Изменено в версии 3.14: Буквы дисков Windows больше не преобразуются в верхний регистр, а символы :, не следующие за буквой диска, больше не вызывают исключение OSError в Windows.

Изменено в версии 3.14: Пути, начинающиеся с косой черты, преобразуются в URL с компонентом authority. Например, путь /etc/hosts преобразуется в URL ///etc/hosts.

Изменено в версии 3.14: Был добавлен параметр add_scheme.

urllib.request.url2pathname(url, *, require_scheme=False, resolve_host=False)

Преобразует указанный URL file: в локальный путь. Для декодирования URL используется unquote().

Если require_scheme равен false (по умолчанию), указанное значение должно не включать префикс схемы file:. Если require_scheme задан как true, указанное значение должно включать префикс; в противном случае возбуждается исключение URLError.

The URL authority is discarded if it is empty, localhost, or the local hostname. Otherwise, if resolve_host is set to true, the authority is resolved using socket.gethostbyname() and discarded if it matches a local IP address (as per RFC 8089 §3). If the authority is still unhandled, then on Windows a UNC path is returned, and on other platforms a URLError is raised.

В этом примере показано использование функции в Windows:

>>> from urllib.request import url2pathname
>>> url = 'file:///C:/Program%20Files'
>>> url2pathname(url, require_scheme=True)
'C:\\Program Files'

Изменено в версии 3.14: Буквы дисков Windows больше не преобразуются в верхний регистр, а символы :, не следующие за буквой диска, больше не вызывают исключение OSError в Windows.

Изменено в версии 3.14: Authority URL отбрасывается, если оно совпадает с локальным именем хоста. В противном случае, если authority не пусто и не равно localhost, то в Windows возвращается UNC-путь (как и раньше), а на других платформах возбуждается URLError.

Изменено в версии 3.14: Компоненты запроса и фрагмента URL отбрасываются, если они присутствуют.

Изменено в версии 3.14: Были добавлены параметры require_scheme и resolve_host.

urllib.request.getproxies()

Эта вспомогательная функция возвращает словарь, отображающий схему в URL прокси-сервера. Она сканирует окружение на наличие переменных с именем <scheme>_proxy, без учёта регистра, сначала для всех операционных систем, а если не удаётся найти, ищет информацию о прокси в System Configuration для macOS и в реестре Windows для Windows. Если существуют и переменные в нижнем, и в верхнем регистре (и они различаются), предпочтение отдаётся нижнему регистру.

Примечание

Если установлена переменная окружения REQUEST_METHOD, что обычно указывает на выполнение скрипта в CGI-среде, переменная окружения HTTP_PROXY (в верхнем регистре _PROXY) будет проигнорирована. Это связано с тем, что эта переменная может быть вставлена клиентом через HTTP-заголовок «Proxy:». Если необходимо использовать HTTP-прокси в CGI-среде, либо явно используйте ProxyHandler, либо убедитесь, что имя переменной указано в нижнем регистре (или, по крайней мере, суффикс _proxy).

Предоставляются следующие классы:

class urllib.request.Request(url, data=None, headers={}, origin_req_host=None, unverifiable=False, method=None)

Этот класс представляет абстракцию URL-запроса.

url должен быть строкой, содержащей корректный, правильно закодированный URL.

data must be an object specifying additional data to send to the server, or None if no such data is needed. Currently HTTP requests are the only ones that use data. The supported object types include bytes, file-like objects, and iterables of bytes-like objects. If no Content-Length nor Transfer-Encoding header field has been provided, HTTPHandler will set these headers according to the type of data. Content-Length will be used to send bytes objects, while Transfer-Encoding: chunked as specified in RFC 7230, Section 3.3.1 will be used to send files and other iterables.

Для метода запроса HTTP POST data должен быть буфером в стандартном формате application/x-www-form-urlencoded. Функция urllib.parse.urlencode() принимает отображение или последовательность кортежей из двух элементов и возвращает строку ASCII в этом формате. Перед использованием в качестве параметра data её следует закодировать в байты.

headers должен быть словарём, и будет обрабатываться так, как если бы add_header() была вызвана с каждым ключом и значением в качестве аргументов. Это часто используется для «подмены» значения заголовка User-Agent, который используется браузером для идентификации – некоторые HTTP-серверы разрешают только запросы от распространённых браузеров, а не от скриптов. Например, Mozilla Firefox может идентифицировать себя как "Mozilla/5.0 (X11; U; Linux i686) Gecko/20071127 Firefox/2.0.0.11", в то время как строка пользовательского агента по умолчанию для urllib"Python-urllib/2.6" (в Python 2.6). Все ключи заголовков отправляются в верблюжьем регистре.

Подходящий заголовок Content-Type следует включить, если присутствует аргумент data. Если этот заголовок не был предоставлен и data не равен None, по умолчанию будет добавлен Content-Type: application/x-www-form-urlencoded.

Следующие два аргумента представляют интерес только для корректной обработки сторонних HTTP-куки:

origin_req_host should be the request-host of the origin transaction, as defined by RFC 2965. It defaults to http.cookiejar.request_host(self). This is the host name or IP address of the original request that was initiated by the user. For example, if the request is for an image in an HTML document, this should be the request-host of the request for the page containing the image.

unverifiable should indicate whether the request is unverifiable, as defined by RFC 2965. It defaults to False. An unverifiable request is one whose URL the user did not have the option to approve. For example, if the request is for an image in an HTML document, and the user had no option to approve the automatic fetching of the image, this should be true.

method должен быть строкой, указывающей метод HTTP-запроса, который будет использоваться (например, 'HEAD'). Если указан, его значение сохраняется в атрибуте method и используется get_method(). По умолчанию используется 'GET', если data равен None, и 'POST' в противном случае. Подклассы могут указать другой метод по умолчанию, установив атрибут method в самом классе.

Примечание

Запрос не будет работать должным образом, если объект data не может предоставить своё содержимое более одного раза (например, файл или итерируемый объект, который может создать содержимое только один раз), и запрос повторяется из-за HTTP-перенаправлений или аутентификации. data отправляется на HTTP-сервер сразу после заголовков. В библиотеке нет поддержки ожидания 100-continue.

Изменено в версии 3.3: Добавлен аргумент Request.method в класс Request.

Изменено в версии 3.4: Метод по умолчанию Request.method может быть указан на уровне класса.

Изменено в версии 3.6: Не вызывать ошибку, если Content-Length не был предоставлен, а data не является ни None, ни объектом bytes. Вместо этого использовать чанкованное кодирование передачи.

class urllib.request.OpenerDirector

Класс OpenerDirector открывает URL-адреса через цепочку BaseHandler. Он управляет объединением обработчиков в цепочку и восстановлением после ошибок.

class urllib.request.BaseHandler

Это базовый класс для всех зарегистрированных обработчиков – он отвечает только за простую механику регистрации.

class urllib.request.HTTPDefaultErrorHandler

Класс, определяющий обработчик по умолчанию для HTTP-ответов с ошибками; все ответы преобразуются в исключения HTTPError.

class urllib.request.HTTPRedirectHandler

Класс для обработки перенаправлений.

class urllib.request.HTTPCookieProcessor(cookiejar=None)

Класс для обработки HTTP-куки.

class urllib.request.ProxyHandler(proxies=None)

Заставляет запросы проходить через прокси. Если передан proxies, это должен быть словарь, сопоставляющий имена протоколов с URL-адресами прокси. По умолчанию список прокси читается из переменных окружения <protocol>_proxy. Если переменные окружения для прокси не заданы, то в среде Windows настройки прокси берутся из раздела Internet Settings реестра, а в среде macOS информация о прокси извлекается из System Configuration Framework.

Чтобы отключить автоматически обнаруженный прокси, передайте пустой словарь.

Переменная окружения no_proxy может использоваться для указания узлов, к которым не следует обращаться через прокси; если она задана, то должна представлять собой разделённый запятыми список суффиксов имён узлов, опционально с добавленным :port, например cern.ch,ncsa.uiuc.edu,some.host:8080.

Примечание

HTTP_PROXY будет игнорироваться, если задана переменная REQUEST_METHOD; см. документацию по getproxies().

class urllib.request.HTTPPasswordMgr

Хранит базу данных соответствий (realm, uri) -> (user, password).

class urllib.request.HTTPPasswordMgrWithDefaultRealm

Хранит базу данных соответствий (realm, uri) -> (user, password). Область (realm) None считается универсальной областью, которая используется, если не подходит ни одна другая.

class urllib.request.HTTPPasswordMgrWithPriorAuth

Вариант HTTPPasswordMgrWithDefaultRealm, который также содержит базу данных соответствий uri -> is_authenticated. Может использоваться обработчиком BasicAuth для определения, когда отправлять учётные данные аутентификации немедленно, не дожидаясь сначала ответа 401.

Добавлено в версии 3.5.

class urllib.request.AbstractBasicAuthHandler(password_mgr=None)

Это миксин-класс, который помогает с HTTP-аутентификацией как на удалённом хосте, так и через прокси. Если передан password_mgr, он должен быть совместимым с HTTPPasswordMgr; обратитесь к разделу HTTPPasswordMgr Objects для получения информации об интерфейсе, который необходимо поддерживать. Если passwd_mgr также предоставляет методы is_authenticated и update_authenticated (см. HTTPPasswordMgrWithPriorAuth Objects), то обработчик будет использовать результат is_authenticated для заданного URI, чтобы определить, следует ли отправлять учётные данные аутентификации вместе с запросом. Если is_authenticated возвращает True для URI, учётные данные отправляются. Если is_authenticated равно False, учётные данные не отправляются, и после получения ответа 401 запрос отправляется повторно с учётными данными аутентификации. Если аутентификация прошла успешно, вызывается update_authenticated для установки is_authenticated True для URI, так что последующие запросы к этому URI или любым его супер-URI будут автоматически включать учётные данные аутентификации.

Добавлено в версии 3.5: Добавлена поддержка is_authenticated.

class urllib.request.HTTPBasicAuthHandler(password_mgr=None)

Обрабатывает аутентификацию на удалённом хосте. Если передан password_mgr, он должен быть совместим с HTTPPasswordMgr; обратитесь к разделу HTTPPasswordMgr Objects для получения информации об интерфейсе, который необходимо поддерживать. HTTPBasicAuthHandler вызовет ValueError при получении неправильной схемы аутентификации.

class urllib.request.ProxyBasicAuthHandler(password_mgr=None)

Управляет аутентификацией с прокси. password_mgr, если указан, должен быть совместим с HTTPPasswordMgr; обращайтесь к разделу HTTPPasswordMgr Objects за информацией об интерфейсе, который должен поддерживаться.

class urllib.request.AbstractDigestAuthHandler(password_mgr=None)

Это миксин-класс, который помогает с HTTP-аутентификацией как на удалённом хосте, так и через прокси. Если передан password_mgr, он должен быть совместимым с HTTPPasswordMgr; обратитесь к разделу HTTPPasswordMgr Objects для получения информации об интерфейсе, который необходимо поддерживать.

Изменено в версии 3.14: Добавлена поддержка алгоритма дайджест-аутентификации HTTP SHA-256.

class urllib.request.HTTPDigestAuthHandler(password_mgr=None)

Управляет аутентификацией с удалённым хостом. password_mgr, если указан, должен быть совместим с HTTPPasswordMgr; обращайтесь к разделу HTTPPasswordMgr Objects за информацией об интерфейсе, который должен поддерживаться. Когда добавлены обработчик дайджест-аутентификации (Digest Authentication Handler) и обработчик базовой аутентификации (Basic Authentication Handler), дайджест-аутентификация всегда выполняется первой. Если дайджест-аутентификация снова возвращает ответ 40x, он передаётся обработчику базовой аутентификации. Этот метод обработчика вызовет исключение ValueError при использовании схемы аутентификации, отличной от Digest или Basic.

Изменено в версии 3.3: Возбуждает исключение ValueError при неподдерживаемой схеме аутентификации.

class urllib.request.ProxyDigestAuthHandler(password_mgr=None)

Управляет аутентификацией с прокси. password_mgr, если указан, должен быть совместим с HTTPPasswordMgr; обращайтесь к разделу HTTPPasswordMgr Objects за информацией об интерфейсе, который должен поддерживаться.

class urllib.request.HTTPHandler

Класс для открытия HTTP-URL.

class urllib.request.HTTPSHandler(debuglevel=0, context=None, check_hostname=None)

Класс для открытия HTTPS-URL. context и check_hostname имеют то же значение, что и в http.client.HTTPSConnection.

Изменено в версии 3.2: Добавлены параметры context и check_hostname.

class urllib.request.FileHandler

Открывает локальные файлы.

class urllib.request.DataHandler

Открывает data-URL.

Добавлено в версии 3.4.

class urllib.request.FTPHandler

Открывает FTP-URL.

class urllib.request.CacheFTPHandler

Открывает FTP-URL, сохраняя кеш открытых FTP-соединений для минимизации задержек.

class urllib.request.UnknownHandler

Универсальный класс для обработки неизвестных URL.

class urllib.request.HTTPErrorProcessor

Обрабатывает ошибочные HTTP-ответы.

Объекты запросаRequest Objects

Следующие методы описывают открытый интерфейс Request, поэтому все они могут быть переопределены в подклассах. Также определяет несколько открытых атрибутов, которые могут использоваться клиентами для анализа разобранного запроса.

Request.full_url

Оригинальный URL, переданный конструктору.

Изменено в версии 3.4.

Request.full_url – это свойство с сеттером, геттером и делитером. При получении full_url возвращает оригинальный URL запроса вместе с фрагментом, если он присутствовал.

Request.type

Схема URI.

Request.host

Авторитетная часть URI, обычно хост, но может также содержать порт, отделённый двоеточием.

Request.origin_req_host

Исходный хост запроса, без порта.

Request.selector

Путь URI. Если Request использует прокси, то selector будет содержать полный URL, который передаётся прокси.

Request.data

Тело сущности запроса или None, если не задано.

Изменено в версии 3.4: Изменение значения Request.data теперь удаляет заголовок “Content-Length” , если он был ранее установлен или вычислен.

Request.unverifiable

логическое значение, указывает, является ли запрос непроверяемым, как определено в RFC 2965.

Request.method

HTTP-метод запроса. По умолчанию его значение равно None, что означает, что get_method() выполнит обычное вычисление метода. Значение можно задать (тем самым переопределив вычисление по умолчанию в get_method()), либо установив значение по умолчанию на уровне класса в подклассе Request, либо передав значение в конструктор Request через аргумент method.

Добавлено в версии 3.3.

Изменено в версии 3.4: Теперь значение по умолчанию можно задавать в подклассах; ранее его можно было установить только через аргумент конструктора.

Request.get_method()

Возвращает строку, указывающую HTTP-метод запроса. Если Request.method не равно None, возвращается его значение; иначе возвращается 'GET', если Request.data равно None, или 'POST' в противном случае. Это имеет смысл только для HTTP-запросов.

Изменено в версии 3.3: get_method теперь учитывает значение Request.method.

Request.add_header(key, val)

Добавляет ещё один заголовок в запрос. В настоящее время заголовки игнорируются всеми обработчиками, кроме HTTP-обработчиков, где они добавляются в список заголовков, отправляемых серверу. Обратите внимание, что не может быть более одного заголовка с одним и тем же именем, и последующие вызовы перезаписывают предыдущие, если key совпадает. В настоящее время это не приводит к потере функциональности HTTP, поскольку все заголовки, которые имеют смысл при многократном использовании, имеют (заголовок-специфичный) способ достижения той же функциональности с помощью только одного заголовка. Обратите внимание, что заголовки, добавленные этим методом, также добавляются в перенаправленные запросы.

Request.add_unredirected_header(key, header)

Добавляет заголовок, который не будет добавлен в перенаправленный запрос.

Request.has_header(header)

Возвращает, имеет ли экземпляр указанный заголовок (проверяет как обычные, так и неперенаправленные).

Request.remove_header(header)

Удаляет указанный заголовок из экземпляра запроса (как из обычных, так и из неперенаправленных заголовков).

Добавлено в версии 3.4.

Request.get_full_url()

Возвращает URL, переданный в конструктор.

Изменено в версии 3.4.

Возвращает Request.full_url

Request.set_proxy(host, type)

Подготавливает запрос, подключаясь к прокси-серверу. host и type заменят соответствующие значения экземпляра, а selector экземпляра будет содержать исходный URL, переданный в конструктор.

Request.get_header(header_name, default=None)

Возвращает значение указанного заголовка. Если заголовок отсутствует, возвращает значение по умолчанию.

Request.header_items()

Возвращает список кортежей (имя_заголовка, значение_заголовка) заголовков запроса.

Изменено в версии 3.4:Методы запроса add_data, has_data, get_data, get_type, get_host, get_selector, get_origin_req_host и is_unverifiable, которые были объявлены устаревшими начиная с версии 3.3, удалены.

Объекты OpenerDirectorOpenerDirector Objects

Экземпляры OpenerDirector имеют следующие методы:

OpenerDirector.add_handler(handler)

handler должен быть экземпляром BaseHandler. Поиск осуществляется среди следующих методов, и они добавляются в возможные цепочки (обратите внимание: ошибки HTTP являются особым случаем). Обратите внимание, что в следующих методах протокол следует заменить на фактический обрабатываемый протокол, например http_response() будет обработчиком ответа протокола HTTP. Кроме того, type следует заменить на фактический код HTTP, например http_error_404() будет обрабатывать ошибки HTTP 404.

  • <protocol>_open() – сигнал о том, что обработчик умеет открывать URL протокол.

    Подробнее см. BaseHandler.<protocol>_open().

  • http_error_<type>() – сигнал о том, что обработчик умеет обрабатывать ошибки HTTP с кодом ошибки HTTP type.

    Подробнее см. BaseHandler.http_error_<nnn>().

  • <protocol>_error() – сигнал о том, что обработчик умеет обрабатывать ошибки от (не-http) протокол.

  • <protocol>_request() – сигнал о том, что обработчик умеет предварительно обрабатывать запросы протокол.

    Подробнее см. BaseHandler.<protocol>_request().

  • <protocol>_response() – сигнал о том, что обработчик умеет постобрабатывать ответы протокол.

    Подробнее см. BaseHandler.<protocol>_response().

OpenerDirector.open(url, data=None[, timeout])

Открывает указанный url (который может быть объектом запроса или строкой), при необходимости передавая указанные data. Аргументы, возвращаемые значения и вызываемые исключения такие же, как у urlopen() (который просто вызывает метод open() текущего установленного глобального OpenerDirector). Необязательный параметр timeout задаёт тайм-аут в секундах для блокирующих операций, таких как попытка подключения (если не указан, будет использоваться глобальная настройка тайм-аута по умолчанию). Функция тайм-аута на самом деле работает только для HTTP, HTTPS и FTP соединений.

OpenerDirector.error(proto, *args)

Обрабатывает ошибку указанного протокола. Вызывает зарегистрированные обработчики ошибок для данного протокола с указанными аргументами (зависящими от протокола). Протокол HTTP является особым случаем: для определения конкретного обработчика ошибок используется код ответа HTTP; обратитесь к методам http_error_<type>() классов обработчиков.

Возвращаемые значения и вызываемые исключения такие же, как у urlopen().

Объекты OpenerDirector открывают URL в три этапа:

Порядок вызова этих методов в каждом этапе определяется сортировкой экземпляров обработчиков.

  1. Каждый обработчик, имеющий метод с именем <protocol>_request(), вызывает этот метод для предварительной обработки запроса.

  2. Обработчики, имеющие метод с именем <protocol>_open(), вызываются для обработки запроса. Этот этап завершается, когда обработчик либо возвращает значение, отличное от None (т.е. ответ), либо вызывает исключение (обычно URLError). Исключения могут распространяться дальше.

    На самом деле, описанный выше алгоритм сначала применяется для методов с именем default_open(). Если все такие методы возвращают None, алгоритм повторяется для методов с именем <protocol>_open(). Если все такие методы возвращают None, алгоритм повторяется для методов с именем unknown_open().

    Обратите внимание, что реализация этих методов может включать вызовы методов open() и error() родительского экземпляра OpenerDirector.

  3. Каждый обработчик, имеющий метод с именем <protocol>_response(), вызывает этот метод для постобработки ответа.

Объекты BaseHandlerBaseHandler Objects

Объекты BaseHandler предоставляют несколько методов, которые непосредственно полезны, а также другие методы, предназначенные для использования производными классами. Они предназначены для прямого использования:

BaseHandler.add_parent(director)

Добавляет директор в качестве родителя.

BaseHandler.close()

Удаляет всех родителей.

Следующие атрибут и методы должны использоваться только классами, производными от BaseHandler.

Примечание

Принято соглашение, что подклассы, определяющие методы <protocol>_request() или <protocol>_response(), называются *Processor; все остальные называются *Handler.

BaseHandler.parent

Действительный OpenerDirector, который можно использовать для открытия через другой протокол или для обработки ошибок.

BaseHandler.default_open(req)

Этот метод не определён в BaseHandler, но подклассы должны определить его, если хотят перехватывать все URL.

Если этот метод реализован, он будет вызван родительским OpenerDirector. Он должен возвращать файлоподобный объект, как описано в возвращаемом значении метода open() класса OpenerDirector, или None. Он должен вызывать исключение URLError, если не происходит действительно исключительной ситуации (например, MemoryError не должен отображаться на URLError).

Этот метод будет вызван перед любым методом открытия, специфичным для протокола.

BaseHandler.<protocol>_open(req)

Этот метод не определён в BaseHandler, но подклассы должны определить его, если хотят обрабатывать URL с указанным протоколом.

Если этот метод определён, он будет вызван родительским OpenerDirector. Возвращаемые значения должны быть такими же, как для default_open().

BaseHandler.unknown_open(req)

Этот метод не определён в BaseHandler, но подклассы должны определить его, если хотят перехватывать все URL, для которых нет зарегистрированного обработчика для открытия.

Если этот метод реализован, он будет вызван parent OpenerDirector. Возвращаемые значения должны быть такими же, как для default_open().

BaseHandler.http_error_default(req, fp, code, msg, hdrs)

Этот метод не определён в BaseHandler, но подклассы должны переопределить его, если они намерены обеспечить всеобъемлющую обработку для иначе необработанных HTTP-ошибок. Он будет автоматически вызван OpenerDirector при получении ошибки и обычно не должен вызываться в других обстоятельствах.

OpenerDirector вызовет этот метод с пятью позиционными аргументами:

  1. объект Request,

  2. файлоподобный объект с телом HTTP-ошибки,

  3. трёхзначный код ошибки в виде строки,

  4. понятное пользователю объяснение кода в виде строки и

  5. заголовки ошибки в виде объекта отображения.

Возвращаемые значения и вызываемые исключения должны быть такими же, как у urlopen().

BaseHandler.http_error_<nnn>(req, fp, code, msg, hdrs)

nnn должен быть трёхзначным HTTP-кодом ошибки. Этот метод также не определён в BaseHandler, но будет вызван, если он существует, на экземпляре подкласса, когда возникает HTTP-ошибка с кодом nnn.

Подклассы должны переопределить этот метод для обработки конкретных HTTP-ошибок.

Аргументы, возвращаемые значения и вызываемые исключения должны быть такими же, как для http_error_default().

BaseHandler.<protocol>_request(req)

Этот метод не определён в BaseHandler, но подклассы должны определить его, если хотят предварительно обрабатывать запросы заданного протокола.

Если этот метод определён, он будет вызван родительским OpenerDirector. req будет объектом Request. Возвращаемое значение должно быть объектом Request.

BaseHandler.<protocol>_response(req, response)

Этот метод не определён в BaseHandler, но подклассы должны определить его, если хотят выполнять постобработку ответов заданного протокола.

Этот метод, если он определён, будет вызван родительским OpenerDirector. req будет объектом Request. response будет объектом, реализующим тот же интерфейс, что и возвращаемое значение urlopen(). Возвращаемое значение должно реализовывать тот же интерфейс, что и возвращаемое значение urlopen().

Объекты HTTPRedirectHandlerHTTPRedirectHandler Objects

Примечание

Некоторые HTTP-перенаправления требуют действий от клиентского кода этого модуля. В таком случае возбуждается HTTPError. См. RFC 2616 для подробностей о точном значении различных кодов перенаправления.

Исключение HTTPError, возбуждаемое по соображениям безопасности, если HTTPRedirectHandler получает URL перенаправления, который не является HTTP, HTTPS или FTP URL.

HTTPRedirectHandler.redirect_request(req, fp, code, msg, hdrs, newurl)

Возвращает Request или None в ответ на перенаправление. Этот метод вызывается реализациями по умолчанию методов http_error_30*(), когда от сервера получено перенаправление. Если перенаправление должно произойти, верните новый Request, чтобы http_error_30*() смог выполнить перенаправление на newurl. В противном случае возбудите HTTPError, если никакой другой обработчик не должен пытаться обработать этот URL, или верните None, если вы не можете, но другой обработчик смог бы.

Примечание

Реализация по умолчанию этого метода не следует строго RFC 2616, который говорит, что ответы 301 и 302 на запросы POST не должны автоматически перенаправляться без подтверждения пользователем. В действительности браузеры разрешают автоматическое перенаправление таких ответов, меняя POST на GET, и реализация по умолчанию воспроизводит такое поведение.

HTTPRedirectHandler.http_error_301(req, fp, code, msg, hdrs)

Перенаправляет на URL Location: или URI:. Этот метод вызывается родительским OpenerDirector при получении HTTP-ответа «Moved Permanently».

HTTPRedirectHandler.http_error_302(req, fp, code, msg, hdrs)

То же, что и http_error_301(), но вызывается для ответа «Found».

HTTPRedirectHandler.http_error_303(req, fp, code, msg, hdrs)

То же, что и http_error_301(), но вызывается для ответа «See Other».

HTTPRedirectHandler.http_error_307(req, fp, code, msg, hdrs)

То же, что и http_error_301(), но вызывается для ответа «Temporary Redirect». Не разрешает изменять метод запроса с POST на GET.

HTTPRedirectHandler.http_error_308(req, fp, code, msg, hdrs)

То же, что и http_error_301(), но вызывается для ответа «Permanent Redirect». Не разрешает изменять метод запроса с POST на GET.

Добавлено в версии 3.12.

Объекты HTTPCookieProcessorHTTPCookieProcessor Objects

Экземпляры HTTPCookieProcessor имеют один атрибут:

HTTPCookieProcessor.cookiejar

http.cookiejar.CookieJar, в котором хранятся куки.

Объекты ProxyHandlerProxyHandler Objects

ProxyHandler.<protocol>_open(request)

Объект ProxyHandler будет иметь метод <protocol>_open() для каждого протокол, для которого есть прокси в словаре proxies, переданном в конструктор. Метод будет изменять запросы для прохождения через прокси, вызывая request.set_proxy(), и вызывать следующий обработчик в цепочке для непосредственного выполнения протокола.

Объекты HTTPPasswordMgrHTTPPasswordMgr Objects

Эти методы доступны у объектов HTTPPasswordMgr и HTTPPasswordMgrWithDefaultRealm.

HTTPPasswordMgr.add_password(realm, uri, user, passwd)

uri может быть как одним URI, так и последовательностью URI. realm, user и passwd должны быть строками. В результате (user, passwd) будет использоваться в качестве токенов аутентификации, когда запрашивается аутентификация для realm и супер-URI любого из заданных URI.

HTTPPasswordMgr.find_user_password(realm, authuri)

Получает имя пользователя/пароль для заданных realm и URI, если они есть. Этот метод вернёт (None, None), если нет соответствующей пары пользователь/пароль.

Для объектов HTTPPasswordMgrWithDefaultRealm область None будет проверена, если заданная realm не имеет соответствующей пары пользователь/пароль.

Объекты HTTPPasswordMgrWithPriorAuthHTTPPasswordMgrWithPriorAuth Objects

Этот менеджер паролей расширяет HTTPPasswordMgrWithDefaultRealm, чтобы поддерживать отслеживание URI, для которых учётные данные аутентификации должны всегда отправляться.

HTTPPasswordMgrWithPriorAuth.add_password(realm, uri, user, passwd, is_authenticated=False)

realm, uri, user, passwd – как и для HTTPPasswordMgr.add_password(). is_authenticated устанавливает начальное значение флага is_authenticated для указанного URI или списка URI. Если is_authenticated указан как True, realm игнорируется.

HTTPPasswordMgrWithPriorAuth.find_user_password(realm, authuri)

То же, что и для объектов HTTPPasswordMgrWithDefaultRealm

HTTPPasswordMgrWithPriorAuth.update_authenticated(self, uri, is_authenticated=False)

Обновляет флаг is_authenticated для указанного uri или списка URI.

HTTPPasswordMgrWithPriorAuth.is_authenticated(self, authuri)

Возвращает текущее состояние флага is_authenticated для указанного URI.

Объекты AbstractBasicAuthHandlerAbstractBasicAuthHandler Objects

AbstractBasicAuthHandler.http_error_auth_reqed(authreq, host, req, headers)

Обрабатывает запрос аутентификации, получая пару пользователь/пароль и повторяя запрос. authreq должен быть именем заголовка, в котором содержится информация о realm в запросе, host указывает URL и путь для аутентификации, req должен быть (неудачным) объектом Request, а headers – заголовками ошибки.

host – это либо authority (например, "python.org"), либо URL, содержащий компонент authority (например, "https://python.org/"). В любом случае, authority не должен содержать компонент userinfo (поэтому "python.org" и "python.org:80" подходят, а "joe:password@python.org" – нет).

Объекты HTTPBasicAuthHandlerHTTPBasicAuthHandler Objects

HTTPBasicAuthHandler.http_error_401(req, fp, code, msg, hdrs)

Повторяет запрос с информацией аутентификации, если она доступна.

Объекты ProxyBasicAuthHandlerProxyBasicAuthHandler Objects

ProxyBasicAuthHandler.http_error_407(req, fp, code, msg, hdrs)

Повторяет запрос с информацией аутентификации, если она доступна.

Объекты AbstractDigestAuthHandlerAbstractDigestAuthHandler Objects

AbstractDigestAuthHandler.http_error_auth_reqed(authreq, host, req, headers)

authreq должен быть именем заголовка, в котором содержится информация о realm в запросе, host должен быть хостом для аутентификации, req должен быть (неудачным) объектом Request, а headers – заголовками ошибки.

Объекты HTTPDigestAuthHandlerHTTPDigestAuthHandler Objects

HTTPDigestAuthHandler.http_error_401(req, fp, code, msg, hdrs)

Повторяет запрос с информацией аутентификации, если она доступна.

Объекты ProxyDigestAuthHandlerProxyDigestAuthHandler Objects

ProxyDigestAuthHandler.http_error_407(req, fp, code, msg, hdrs)

Повторяет запрос с информацией аутентификации, если она доступна.

Объекты HTTPHandlerHTTPHandler Objects

HTTPHandler.http_open(req)

Отправляет HTTP-запрос, который может быть GET или POST, в зависимости от req.data.

Объекты HTTPSHandlerHTTPSHandler Objects

HTTPSHandler.https_open(req)

Отправляет HTTPS-запрос, который может быть GET или POST, в зависимости от req.data.

Объекты FileHandlerFileHandler Objects

FileHandler.file_open(req)

Открывает файл локально, если имя хоста отсутствует или равно 'localhost'.

Изменено в версии 3.2: Этот метод применим только для локальных имён хостов. При указании удалённого имени хоста вызывается исключение URLError.

Объекты DataHandlerDataHandler Objects

DataHandler.data_open(req)

Читает data URL. Такой URL содержит содержимое, закодированное непосредственно в самом URL. Синтаксис data URL описан в RFC 2397. Эта реализация игнорирует пробелы в data URL с base64-кодированием, поэтому URL может быть перенесён в любом исходном файле, откуда он берётся. Но даже если некоторые браузеры не обращают внимания на отсутствие дополнения (padding) в конце base64-кодированного data URL, данная реализация в таком случае вызовет исключение ValueError.

Объекты FTPHandlerFTPHandler Objects

FTPHandler.ftp_open(req)

Открывает FTP-файл, указанный req. Вход всегда выполняется с пустыми именем пользователя и паролем.

Объекты CacheFTPHandlerCacheFTPHandler Objects

Объекты CacheFTPHandler являются объектами FTPHandler со следующими дополнительными методами:

CacheFTPHandler.setTimeout(t)

Устанавливает тайм-аут соединений равным t секунд.

CacheFTPHandler.setMaxConns(m)

Устанавливает максимальное количество кэшированных соединений равным m.

Объекты UnknownHandlerUnknownHandler Objects

UnknownHandler.unknown_open()

Вызывает исключение URLError.

Объекты HTTPErrorProcessorHTTPErrorProcessor Objects

HTTPErrorProcessor.http_response(request, response)

Обрабатывает ошибочные HTTP-ответы.

Для кода 200 объект ответа возвращается немедленно.

Для кодов ошибок, отличных от 200, этот метод просто передаёт задачу методам обработчика http_error_<type>() через OpenerDirector.error(). В конечном счёте, HTTPDefaultErrorHandler вызовет исключение HTTPError, если ни один другой обработчик не обработает ошибку.

HTTPErrorProcessor.https_response(request, response)

Обрабатывает ошибочные HTTPS-ответы.

Поведение аналогично http_response().

ПримерыExamples

В дополнение к примерам ниже, больше примеров приведено в HOWTO Fetch Internet Resources Using The urllib Package.

Этот пример получает главную страницу python.org и отображает первые 300 байт.

>>> import urllib.request
>>> with urllib.request.urlopen('https://www.python.org/') as f:
...     # Ответ может быть сжат (например, 'gzip').
...     print(f.headers.get('Content-Encoding'))
...     data = f.read()
...     if f.headers.get('Content-Encoding') == 'gzip':
...         import gzip
...         data = gzip.decompress(data)
...     print(data[:300].decode('utf-8', errors='replace'))

Обратите внимание, что urlopen возвращает объект bytes. Это связано с тем, что urlopen не может автоматически определить кодировку байтового потока, полученного от HTTP-сервера. Как правило, программа декодирует возвращённый объект bytes в строку, как только определит или угадает подходящую кодировку.

В следующем документе спецификации HTML, https://html.spec.whatwg.org/#charset, перечислены различные способы указания информации о кодировке в HTML- или XML-документе.

Дополнительную информацию см. в документе W3C: https://www.w3.org/International/questions/qa-html-encoding-declarations.

Поскольку на сайте python.org используется кодировка utf-8, как указано в его мета-теге, мы будем использовать её же для декодирования байтового объекта:

>>> with urllib.request.urlopen('https://www.python.org/') as f:
...     # Проверить сжатие и декодировать соответствующим образом.
...     enc = f.headers.get('Content-Encoding')
...     data = f.read()
...     if enc == 'gzip':
...         import gzip
...         data = gzip.decompress(data)
...     print(data[:100].decode('utf-8', errors='replace'))
...

Тот же результат можно получить и без использования подхода контекстного менеджера:

>>> import urllib.request
>>> f = urllib.request.urlopen('https://www.python.org/')
>>> try:
...     enc = f.headers.get('Content-Encoding')
...     data = f.read()
...     if enc == 'gzip':
...         import gzip
...         data = gzip.decompress(data)
...     print(data[:100].decode('utf-8', errors='replace'))
... finally:
...     f.close()

В следующем примере мы отправляем поток данных на стандартный ввод CGI и читаем данные, которые он возвращает. Обратите внимание: этот пример будет работать только в том случае, если установка Python поддерживает SSL.

>>> import urllib.request
>>> req = urllib.request.Request(url='https://localhost/cgi-bin/test.cgi',
...                       data=b'This data is passed to stdin of the CGI')
>>> with urllib.request.urlopen(req) as f:
...     print(f.read().decode('utf-8'))
...
Got Data: "This data is passed to stdin of the CGI"

Код образца CGI, использованного в приведённом выше примере:

#!/usr/bin/env python
import sys
data = sys.stdin.read()
print('Content-type: text/plain\n\nGot Data: "%s"' % data)

Вот пример выполнения запроса PUT с помощью Request:

import urllib.request
DATA = b'some data'
req = urllib.request.Request(url='http://localhost:8080', data=DATA, method='PUT')
with urllib.request.urlopen(req) as f:
    pass
print(f.status)
print(f.reason)

Использование базовой HTTP-аутентификации:

import urllib.request
# Создать OpenerDirector с поддержкой базовой HTTP-аутентификации...
auth_handler = urllib.request.HTTPBasicAuthHandler()
auth_handler.add_password(realm='PDQ Application',
                          uri='https://mahler:8092/site-updates.py',
                          user='klem',
                          passwd='kadidd!ehopper')
opener = urllib.request.build_opener(auth_handler)
# ...и установить его глобально, чтобы его можно было использовать с urlopen.
urllib.request.install_opener(opener)
with urllib.request.urlopen('http://www.example.com/login.html') as f:
    print(f.read().decode('utf-8'))

build_opener() предоставляет множество обработчиков по умолчанию, включая ProxyHandler. По умолчанию ProxyHandler использует переменные окружения с именами <scheme>_proxy, где <scheme> – это используемая схема URL. Например, переменная окружения http_proxy читается для получения URL HTTP-прокси.

Этот пример заменяет обработчик по умолчанию ProxyHandler на тот, который использует программно заданные URL прокси, и добавляет поддержку авторизации прокси с помощью ProxyBasicAuthHandler.

proxy_handler = urllib.request.ProxyHandler({'http': 'http://www.example.com:3128/'})
proxy_auth_handler = urllib.request.ProxyBasicAuthHandler()
proxy_auth_handler.add_password('realm', 'host', 'username', 'password')

opener = urllib.request.build_opener(proxy_handler, proxy_auth_handler)
# На этот раз, вместо установки OpenerDirector, используется напрямую:
with opener.open('http://www.example.com/login.html') as f:
   print(f.read().decode('utf-8'))

Добавление HTTP-заголовков:

Используйте аргумент headers конструктора Request или:

import urllib.request
req = urllib.request.Request('http://www.example.com/')
req.add_header('Referer', 'https://www.python.org/')
# Настроить значение заголовка User-Agent по умолчанию:
req.add_header('User-Agent', 'urllib-example/0.1 (Contact: . . .)')
with urllib.request.urlopen(req) as f:
    print(f.read().decode('utf-8'))

OpenerDirector автоматически добавляет заголовок User-Agent к каждому запросу Request. Чтобы изменить это:

import urllib.request
opener = urllib.request.build_opener()
opener.addheaders = [('User-agent', 'Mozilla/5.0')]
with opener.open('http://www.example.com/') as f:
   print(f.read().decode('utf-8'))

Также помните, что несколько стандартных заголовков (Content-Length, Content-Type и Host) добавляются, когда Request передаётся в urlopen() (или OpenerDirector.open()).

Вот пример сеанса, в котором используется метод GET для получения URL с параметрами:

>>> import urllib.request
>>> import urllib.parse
>>> params = urllib.parse.urlencode({'spam': 1, 'eggs': 2, 'bacon': 0})
>>> url = "https://www.python.org/?%s" % params
>>> with urllib.request.urlopen(url) as f:
...     print(f.read().decode('utf-8'))
...

В следующем примере вместо этого используется метод POST. Обратите внимание, что вывод параметров из urlencode кодируется в байты перед отправкой в urlopen в качестве данных:

>>> import urllib.request
>>> import urllib.parse
>>> data = urllib.parse.urlencode({'spam': 1, 'eggs': 2, 'bacon': 0})
>>> data = data.encode('ascii')
>>> with urllib.request.urlopen("https://httpbin.org/post", data) as f:
...     print(f.read().decode('utf-8'))
...

В следующем примере используется явно указанный HTTP-прокси, переопределяющий настройки окружения:

>>> import urllib.request
>>> proxies = {'http': 'http://proxy.example.com:8080/'}
>>> opener = urllib.request.build_opener(urllib.request.ProxyHandler(proxies))
>>> with opener.open("https://www.python.org") as f:
...     f.read().decode('utf-8')
...

В следующем примере прокси не используются вовсе, переопределяя настройки окружения:

>>> import urllib.request
>>> opener = urllib.request.build_opener(urllib.request.ProxyHandler({}))
>>> with opener.open("https://www.python.org/") as f:
...     f.read().decode('utf-8')
...

Устаревший интерфейсLegacy interface

Следующие функции и классы перенесены из модуля Python 2 urllib (в отличие от urllib2). В будущем они могут стать устаревшими.

urllib.request.urlretrieve(url, filename=None, reporthook=None, data=None)

Копирует сетевой объект, заданный URL, в локальный файл. Если URL указывает на локальный файл, объект не будет скопирован, если не указан filename. Возвращает кортеж (filename, headers), где filename – это имя локального файла, под которым можно найти объект, а headers – то, что вернул метод info() объекта, возвращённого urlopen() (для удалённого объекта). Исключения те же, что и для urlopen().

Второй аргумент, если присутствует, задаёт местоположение файла для копирования (если отсутствует, местоположением будет временный файл с автоматически сгенерированным именем). Третий аргумент, если присутствует, является вызываемым объектом, который будет вызван один раз при установлении сетевого соединения и один раз после каждого последующего чтения блока. Вызываемый объект будет получать три аргумента: количество переданных блоков на данный момент, размер блока в байтах и общий размер файла. Третий аргумент может быть -1 на старых FTP-серверах, которые не возвращают размер файла в ответ на запрос получения.

Следующий пример иллюстрирует наиболее распространённый сценарий использования:

>>> import urllib.request
>>> local_filename, headers = urllib.request.urlretrieve('https://python.org/')
>>> html = open(local_filename)
>>> html.close()

Если url использует идентификатор схемы http:, необязательный аргумент data может быть передан для указания запроса POST (обычно тип запроса – GET). Аргумент data должен быть байтовым объектом в стандартном формате application/x-www-form-urlencoded; см. функцию urllib.parse.urlencode().

urlretrieve() вызовет исключение ContentTooShortError, когда обнаружит, что объём доступных данных меньше ожидаемого (который указан в заголовке Content-Length). Это может произойти, например, при прерывании загрузки.

Заголовок Content-Length рассматривается как нижняя граница: если доступно больше данных для чтения, urlretrieve читает больше данных, но если данных меньше, он вызывает исключение.

В этом случае вы всё ещё можете получить загруженные данные, они хранятся в атрибуте content экземпляра исключения.

Если заголовок Content-Length не был передан, urlretrieve не может проверить размер загруженных данных и просто возвращает их. В этом случае остаётся только предполагать, что загрузка прошла успешно.

urllib.request.urlcleanup()

Очищает временные файлы, которые могли остаться от предыдущих вызовов urlretrieve().

Ограничения urllib.requesturllib.request Restrictions

  • В настоящее время поддерживаются только следующие протоколы: HTTP (версии 0.9 и 1.0), FTP, локальные файлы и data-URL.

    Изменено в версии 3.4: Добавлена поддержка data-URL.

  • Функция кэширования urlretrieve() отключена, пока не будет реализована правильная обработка заголовков Expiration time.

  • Должна быть функция для проверки, находится ли определённый URL в кэше.

  • Для обратной совместимости, если URL указывает на локальный файл, но файл не удаётся открыть, URL интерпретируется заново с использованием протокола FTP. Это иногда может приводить к запутанным сообщениям об ошибках.

  • Функции urlopen() и urlretrieve() могут вызывать сколь угодно длительные задержки при ожидании установки сетевого соединения. Это означает, что создать интерактивный веб-клиент с помощью этих функций без использования потоков сложно.

  • Данные, возвращаемые urlopen() или urlretrieve(), представляют собой необработанные данные, возвращённые сервером. Это могут быть бинарные данные (например, изображение), обычный текст или, к примеру, HTML. Протокол HTTP передаёт информацию о типе в заголовке ответа, который можно проверить, взглянув на заголовок Content-Type. Если возвращённые данные являются HTML, можно использовать модуль html.parser для его разбора.

  • Код, обрабатывающий протокол FTP, не может различить файл и каталог. Это может приводить к неожиданному поведению при попытке чтения URL, указывающего на недоступный файл. Если URL заканчивается на /, считается, что он ссылается на каталог, и обрабатывается соответствующим образом. Но если попытка чтения файла приводит к ошибке 550 (означающей, что URL не найден или недоступен, часто из-за прав доступа), то путь трактуется как каталог, чтобы обработать случай, когда каталог указан URL, но конечный / был опущен. Это может приводить к вводящим в заблуждение результатам при попытке получить файл, недоступный для чтения из-за прав; код FTP попытается прочитать его, получит ошибку 550, а затем выполнит листинг каталога для этого недоступного файла. Если требуется более точный контроль, стоит рассмотреть использование модуля ftplib.

urllib.response – Классы ответов, используемые urlliburllib.response – Response classes used by urllib

Модуль urllib.response определяет функции и классы, которые предоставляют минимальный файлоподобный интерфейс, включая read() и readline(). Функции, определённые в этом модуле, используются внутри модуля urllib.request. Типичный объект ответа – экземпляр urllib.response.addinfourl:

class urllib.response.addinfourl
url

URL полученного ресурса, обычно используется для определения, был ли выполнен редирект.

headers

Возвращает заголовки ответа в виде экземпляра EmailMessage.

status

Добавлено в версии 3.9.

Код состояния, возвращаемый сервером.

geturl()

Устарело с версии 3.9: Устарело в пользу url.

info()

Устарело с версии 3.9: Устарело в пользу headers.

code

Устарело с версии 3.9: Устарело в пользу status.

getcode()

Устарело с версии 3.9: Устарело в пользу status.