urllib.request.md
1> **Источник:** https://python-all.ru/3.9/library/urllib.request.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# [`urllib.request`](https://python-all.ru/3.9/library/urllib.request.html#module-urllib.request) – Расширяемая библиотека для открытия URL89**Исходный код:** [Lib/urllib/request.py](https://python-all.ru/src/3.9/Lib/urllib/request.py)1011---1213Модуль [`urllib.request`](https://python-all.ru/3.9/library/urllib.request.html#module-urllib.request) определяет функции и классы, которые помогают открывать URL (в основном HTTP) в сложном мире – базовая и дайджест-аутентификация, перенаправления, куки и многое другое.1415> **См. также**16>17> Для высокоуровневого интерфейса HTTP-клиента рекомендуется [пакет Requests](https://python-all.ru/3.9/library/urllib.request.html).1819Модуль [`urllib.request`](https://python-all.ru/3.9/library/urllib.request.html#module-urllib.request) определяет следующие функции:2021#### `urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None)`2223Открывает URL *url*, который может быть строкой или объектом [`Request`](https://python-all.ru/3.9/library/urllib.request.html#urllib.request.Request).2425*data* должен быть объектом, задающим дополнительные данные для отправки серверу, или `None`, если такие данные не нужны. Подробнее см. [`Request`](https://python-all.ru/3.9/library/urllib.request.html#urllib.request.Request).2627Модуль urllib.request использует HTTP/1.1 и включает заголовок `Connection:close` в свои HTTP-запросы.2829Необязательный параметр *timeout* задает таймаут в секундах для блокирующих операций, таких как попытка подключения (если не указан, используется глобальная настройка таймаута по умолчанию). Это на самом деле работает только для HTTP, HTTPS и FTP-соединений.3031Если указан *context*, он должен быть экземпляром [`ssl.SSLContext`](https://python-all.ru/3.9/library/ssl.html#ssl.SSLContext), описывающим различные параметры SSL. Подробнее см. [`HTTPSConnection`](https://python-all.ru/3.9/library/http.client.html#http.client.HTTPSConnection).3233Необязательные параметры *cafile* и *capath* задают набор доверенных сертификатов ЦС для HTTPS-запросов. *cafile* должен указывать на один файл, содержащий набор сертификатов ЦС, а *capath* должен указывать на каталог хешированных файлов сертификатов. Дополнительную информацию можно найти в [`ssl.SSLContext.load_verify_locations()`](https://python-all.ru/3.9/library/ssl.html#ssl.SSLContext.load_verify_locations).3435Параметр *cadefault* игнорируется.3637Эта функция всегда возвращает объект, который может работать как [контекстный менеджер](https://python-all.ru/3.9/glossary.html#term-context-manager) и имеет свойства *url*, *headers* и *status*. Подробнее об этих свойствах см. [`urllib.response.addinfourl`](https://python-all.ru/3.9/library/urllib.request.html#urllib.response.addinfourl).3839Для HTTP и HTTPS URL эта функция возвращает слегка измененный объект [`http.client.HTTPResponse`](https://python-all.ru/3.9/library/http.client.html#http.client.HTTPResponse). В дополнение к трем новым методам, указанным выше, атрибут msg содержит ту же информацию, что и атрибут [`reason`](https://python-all.ru/3.9/library/http.client.html#http.client.HTTPResponse.reason) – фразу причины, возвращаемую сервером – вместо заголовков ответа, как указано в документации для [`HTTPResponse`](https://python-all.ru/3.9/library/http.client.html#http.client.HTTPResponse).4041Для URL с протоколами FTP, file и data, а также для запросов, явно обрабатываемых устаревшими классами [`URLopener`](https://python-all.ru/3.9/library/urllib.request.html#urllib.request.URLopener) и [`FancyURLopener`](https://python-all.ru/3.9/library/urllib.request.html#urllib.request.FancyURLopener), эта функция возвращает объект [`urllib.response.addinfourl`](https://python-all.ru/3.9/library/urllib.request.html#urllib.response.addinfourl).4243Возбуждает [`URLError`](https://python-all.ru/3.9/library/urllib.error.html#urllib.error.URLError) при ошибках протокола.4445Обратите внимание, что может быть возвращен `None`, если ни один обработчик не обрабатывает запрос (хотя установленный по умолчанию глобальный [`OpenerDirector`](https://python-all.ru/3.9/library/urllib.request.html#urllib.request.OpenerDirector) использует [`UnknownHandler`](https://python-all.ru/3.9/library/urllib.request.html#urllib.request.UnknownHandler), чтобы гарантировать, что этого никогда не произойдет).4647Кроме того, если обнаружены настройки прокси (например, когда установлена переменная окружения `*_proxy` такая, как `http_proxy`), [`ProxyHandler`](https://python-all.ru/3.9/library/urllib.request.html#urllib.request.ProxyHandler) устанавливается по умолчанию и обрабатывает запросы через прокси.4849Устаревшая функция `urllib.urlopen` из Python 2.6 и более ранних версий была прекращена; [`urllib.request.urlopen()`](https://python-all.ru/3.9/library/urllib.request.html#urllib.request.urlopen) соответствует старому `urllib2.urlopen`. Обработка прокси, которая осуществлялась передачей словаря в параметр функции `urllib.urlopen`, может быть получена с помощью объектов [`ProxyHandler`](https://python-all.ru/3.9/library/urllib.request.html#urllib.request.ProxyHandler).5051Стандартный открыватель возбуждает [событие аудита](https://python-all.ru/3.9/library/sys.html#auditing) `urllib.Request` с аргументами `fullurl`, `data`, `headers`, `method`, взятыми из объекта запроса.5253Изменено в версии 3.2: добавлены *cafile* и *capath*.5455Изменено в версии 3.2: Теперь, если возможно, поддерживаются виртуальные хосты HTTPS (то есть если [`ssl.HAS_SNI`](https://python-all.ru/3.9/library/ssl.html#ssl.HAS_SNI) истинно).5657Новое в версии 3.2: Параметр *data* может быть итерируемым объектом.5859Изменено в версии 3.3: добавлен *cadefault*.6061Изменено в версии 3.4.3: добавлен *context*.6263Устарело с версии 3.6: *cafile*, *capath* и *cadefault* устарели в пользу *context*. Вместо этого используйте [`ssl.SSLContext.load_cert_chain()`](https://python-all.ru/3.9/library/ssl.html#ssl.SSLContext.load_cert_chain) или позвольте [`ssl.create_default_context()`](https://python-all.ru/3.9/library/ssl.html#ssl.create_default_context) выбрать доверенные сертификаты ЦС системы за вас.6465#### `urllib.request.install_opener(opener)`6667Устанавливает экземпляр [`OpenerDirector`](https://python-all.ru/3.9/library/urllib.request.html#urllib.request.OpenerDirector) в качестве глобального открывателя по умолчанию. Установка открывателя необходима только в том случае, если требуется, чтобы urlopen использовал именно его; в противном случае просто вызывайте [`OpenerDirector.open()`](https://python-all.ru/3.9/library/urllib.request.html#urllib.request.OpenerDirector.open) вместо [`urlopen()`](https://python-all.ru/3.9/library/urllib.request.html#urllib.request.urlopen). Код не проверяет, является ли объект настоящим [`OpenerDirector`](https://python-all.ru/3.9/library/urllib.request.html#urllib.request.OpenerDirector); подойдет любой класс с соответствующим интерфейсом.6869#### `urllib.request.build_opener([handler, ...])`7071Возвращает экземпляр [`OpenerDirector`](https://python-all.ru/3.9/library/urllib.request.html#urllib.request.OpenerDirector), который объединяет обработчики в заданном порядке. *обработчик*и могут быть либо экземплярами [`BaseHandler`](https://python-all.ru/3.9/library/urllib.request.html#urllib.request.BaseHandler), либо подклассами [`BaseHandler`](https://python-all.ru/3.9/library/urllib.request.html#urllib.request.BaseHandler) (в этом случае должна быть возможность вызвать конструктор без параметров). Экземпляры следующих классов будут помещены перед *обработчик*ами, если только *обработчик*и не содержат их, их экземпляры или подклассы: [`ProxyHandler`](https://python-all.ru/3.9/library/urllib.request.html#urllib.request.ProxyHandler) (если обнаружены настройки прокси), [`UnknownHandler`](https://python-all.ru/3.9/library/urllib.request.html#urllib.request.UnknownHandler), [`HTTPHandler`](https://python-all.ru/3.9/library/urllib.request.html#urllib.request.HTTPHandler), [`HTTPDefaultErrorHandler`](https://python-all.ru/3.9/library/urllib.request.html#urllib.request.HTTPDefaultErrorHandler), [`HTTPRedirectHandler`](https://python-all.ru/3.9/library/urllib.request.html#urllib.request.HTTPRedirectHandler), [`FTPHandler`](https://python-all.ru/3.9/library/urllib.request.html#urllib.request.FTPHandler), [`FileHandler`](https://python-all.ru/3.9/library/urllib.request.html#urllib.request.FileHandler), [`HTTPErrorProcessor`](https://python-all.ru/3.9/library/urllib.request.html#urllib.request.HTTPErrorProcessor).7273Если установка Python поддерживает SSL (т.е. если модуль [`ssl`](https://python-all.ru/3.9/library/ssl.html#module-ssl) может быть импортирован), [`HTTPSHandler`](https://python-all.ru/3.9/library/urllib.request.html#urllib.request.HTTPSHandler) также будет добавлен.7475Подкласс [`BaseHandler`](https://python-all.ru/3.9/library/urllib.request.html#urllib.request.BaseHandler) также может изменить свой атрибут `handler_order`, чтобы изменить свою позицию в списке обработчиков.7677#### `urllib.request.pathname2url(path)`7879Преобразует имя пути *path* из локального синтаксиса в форму, используемую в компоненте пути URL. Эта функция не создает полный URL. Возвращаемое значение уже будет закодировано с помощью функции [`quote()`](https://python-all.ru/3.9/library/urllib.parse.html#urllib.parse.quote).8081#### `urllib.request.url2pathname(path)`8283Преобразует компонент пути *path* из процентно-кодированного URL в локальный синтаксис пути. Эта функция не принимает полный URL. Для декодирования *path* используется [`unquote()`](https://python-all.ru/3.9/library/urllib.parse.html#urllib.parse.unquote).8485#### `urllib.request.getproxies()`8687Эта вспомогательная функция возвращает словарь, отображающий схему в URL прокси-сервера. Она сканирует окружение на наличие переменных с именем `<scheme>_proxy`, без учёта регистра, сначала для всех операционных систем, а если не удаётся найти, ищет информацию о прокси в System Configuration для macOS и в реестре Windows для Windows. Если существуют и переменные в нижнем, и в верхнем регистре (и они различаются), предпочтение отдаётся нижнему регистру.8889> **Примечание**90>91> Если установлена переменная окружения `REQUEST_METHOD`, что обычно указывает на выполнение скрипта в CGI-среде, переменная окружения `HTTP_PROXY` (в верхнем регистре `_PROXY`) будет проигнорирована. Это связано с тем, что эта переменная может быть вставлена клиентом через HTTP-заголовок «Proxy:». Если необходимо использовать HTTP-прокси в CGI-среде, либо явно используйте `ProxyHandler`, либо убедитесь, что имя переменной указано в нижнем регистре (или, по крайней мере, суффикс `_proxy`).9293Предоставляются следующие классы:9495#### `class urllib.request.Request(url, data=None, headers={}, origin_req_host=None, unverifiable=False, method=None)`9697Этот класс представляет абстракцию URL-запроса.9899*url* должен быть строкой, содержащей корректный URL.100101*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`](https://python-all.ru/3.9/library/urllib.request.html#urllib.request.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**](https://python-all.ru/3.9/library/urllib.request.html), Section 3.3.1 will be used to send files and other iterables.102103Для метода запроса HTTP POST *data* должен быть буфером в стандартном формате *application/x-www-form-urlencoded*. Функция [`urllib.parse.urlencode()`](https://python-all.ru/3.9/library/urllib.parse.html#urllib.parse.urlencode) принимает отображение или последовательность кортежей из двух элементов и возвращает строку ASCII в этом формате. Перед использованием в качестве параметра *data* её следует закодировать в байты.104105*headers* должен быть словарём, и будет обрабатываться так, как если бы [`add_header()`](https://python-all.ru/3.9/library/urllib.request.html#urllib.request.Request.add_header) была вызвана с каждым ключом и значением в качестве аргументов. Это часто используется для «подмены» значения заголовка `User-Agent`, который используется браузером для идентификации – некоторые HTTP-серверы разрешают только запросы от распространённых браузеров, а не от скриптов. Например, Mozilla Firefox может идентифицировать себя как `"Mozilla/5.0 (X11; U; Linux i686) Gecko/20071127 Firefox/2.0.0.11"`, в то время как строка пользовательского агента по умолчанию для [`urllib`](https://python-all.ru/3.9/library/urllib.html#module-urllib) – `"Python-urllib/2.6"` (в Python 2.6). Все ключи заголовков отправляются в верблюжьем регистре.106107Соответствующий заголовок `Content-Type` должен быть включен, если указан аргумент *data*. Если этот заголовок не был предоставлен и *data* не равно None, по умолчанию будет добавлен `Content-Type: application/x-www-form-urlencoded`.108109Следующие два аргумента представляют интерес только для корректной обработки сторонних HTTP-куки:110111*origin\_req\_host* should be the request-host of the origin transaction, as defined by [**RFC 2965**](https://python-all.ru/3.9/library/urllib.request.html). 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.112113*unverifiable* should indicate whether the request is unverifiable, as defined by [**RFC 2965**](https://python-all.ru/3.9/library/urllib.request.html). 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.114115*method* должен быть строкой, указывающей метод HTTP-запроса, который будет использоваться (например, `'HEAD'`). Если указан, его значение сохраняется в атрибуте [`method`](https://python-all.ru/3.9/library/urllib.request.html#urllib.request.Request.method) и используется [`get_method()`](https://python-all.ru/3.9/library/urllib.request.html#urllib.request.Request.get_method). По умолчанию используется `'GET'`, если *data* равен `None`, и `'POST'` в противном случае. Подклассы могут указать другой метод по умолчанию, установив атрибут [`method`](https://python-all.ru/3.9/library/urllib.request.html#urllib.request.Request.method) в самом классе.116117> **Примечание**118>119> Запрос не будет работать должным образом, если объект data не может предоставить своё содержимое более одного раза (например, файл или итерируемый объект, который может создать содержимое только один раз), и запрос повторяется из-за HTTP-перенаправлений или аутентификации. *data* отправляется на HTTP-сервер сразу после заголовков. В библиотеке нет поддержки ожидания 100-continue.120121Изменено в версии 3.3: Добавлен аргумент [`Request.method`](https://python-all.ru/3.9/library/urllib.request.html#urllib.request.Request.method) в класс Request.122123Изменено в версии 3.4: Метод по умолчанию [`Request.method`](https://python-all.ru/3.9/library/urllib.request.html#urllib.request.Request.method) может быть указан на уровне класса.124125Изменено в версии 3.6: Не вызывать ошибку, если `Content-Length` не был предоставлен, а *data* не является ни `None`, ни объектом bytes. Вместо этого использовать чанкованное кодирование передачи.126127#### `class urllib.request.OpenerDirector`128129Класс [`OpenerDirector`](https://python-all.ru/3.9/library/urllib.request.html#urllib.request.OpenerDirector) открывает URL-адреса через цепочку [`BaseHandler`](https://python-all.ru/3.9/library/urllib.request.html#urllib.request.BaseHandler). Он управляет объединением обработчиков в цепочку и восстановлением после ошибок.130131#### `class urllib.request.BaseHandler`132133Это базовый класс для всех зарегистрированных обработчиков – он отвечает только за простую механику регистрации.134135#### `class urllib.request.HTTPDefaultErrorHandler`136137Класс, определяющий обработчик по умолчанию для HTTP-ответов с ошибками; все ответы преобразуются в исключения [`HTTPError`](https://python-all.ru/3.9/library/urllib.error.html#urllib.error.HTTPError).138139#### `class urllib.request.HTTPRedirectHandler`140141Класс для обработки перенаправлений.142143#### `class urllib.request.HTTPCookieProcessor(cookiejar=None)`144145Класс для обработки HTTP-куки.146147#### `class urllib.request.ProxyHandler(proxies=None)`148149Заставляет запросы проходить через прокси. Если передан *proxies*, это должен быть словарь, сопоставляющий имена протоколов с URL-адресами прокси. По умолчанию список прокси читается из переменных окружения `<protocol>_proxy`. Если переменные окружения для прокси не заданы, то в среде Windows настройки прокси берутся из раздела Internet Settings реестра, а в среде macOS информация о прокси извлекается из System Configuration Framework.150151Чтобы отключить автоматически обнаруженный прокси, передайте пустой словарь.152153Переменная окружения `no_proxy` может использоваться для указания узлов, к которым не следует обращаться через прокси; если она задана, то должна представлять собой разделённый запятыми список суффиксов имён узлов, опционально с добавленным `:port`, например `cern.ch,ncsa.uiuc.edu,some.host:8080`.154155> > **Примечание**156> >157> > `HTTP_PROXY` будет игнорироваться, если задана переменная `REQUEST_METHOD`; см. документацию по [`getproxies()`](https://python-all.ru/3.9/library/urllib.request.html#urllib.request.getproxies).158159#### `class urllib.request.HTTPPasswordMgr`160161Хранит базу данных соответствий `(realm, uri) -> (user, password)`.162163#### `class urllib.request.HTTPPasswordMgrWithDefaultRealm`164165Хранит базу данных соответствий `(realm, uri) -> (user, password)`. Область (realm) `None` считается универсальной областью, которая используется, если не подходит ни одна другая.166167#### `class urllib.request.HTTPPasswordMgrWithPriorAuth`168169Вариант [`HTTPPasswordMgrWithDefaultRealm`](https://python-all.ru/3.9/library/urllib.request.html#urllib.request.HTTPPasswordMgrWithDefaultRealm), который также содержит базу данных соответствий `uri -> is_authenticated`. Может использоваться обработчиком BasicAuth для определения, когда отправлять учётные данные аутентификации немедленно, не дожидаясь сначала ответа `401`.170171Новое в версии 3.5.172173#### `class urllib.request.AbstractBasicAuthHandler(password_mgr=None)`174175Это миксин-класс, который помогает с HTTP-аутентификацией как на удалённом хосте, так и через прокси. Если передан *password\_mgr*, он должен быть совместимым с [`HTTPPasswordMgr`](https://python-all.ru/3.9/library/urllib.request.html#urllib.request.HTTPPasswordMgr); обратитесь к разделу [HTTPPasswordMgr Objects](https://python-all.ru/3.9/library/urllib.request.html#http-password-mgr) для получения информации об интерфейсе, который необходимо поддерживать. Если *passwd\_mgr* также предоставляет методы `is_authenticated` и `update_authenticated` (см. [HTTPPasswordMgrWithPriorAuth Objects](https://python-all.ru/3.9/library/urllib.request.html#http-password-mgr-with-prior-auth)), то обработчик будет использовать результат `is_authenticated` для заданного URI, чтобы определить, следует ли отправлять учётные данные аутентификации вместе с запросом. Если `is_authenticated` возвращает `True` для URI, учётные данные отправляются. Если `is_authenticated` равно `False`, учётные данные не отправляются, и после получения ответа `401` запрос отправляется повторно с учётными данными аутентификации. Если аутентификация прошла успешно, вызывается `update_authenticated` для установки `is_authenticated` `True` для URI, так что последующие запросы к этому URI или любым его супер-URI будут автоматически включать учётные данные аутентификации.176177Новое в версии 3.5: Добавлена поддержка `is_authenticated`.178179#### `class urllib.request.HTTPBasicAuthHandler(password_mgr=None)`180181Обрабатывает аутентификацию на удалённом хосте. Если передан *password\_mgr*, он должен быть совместим с [`HTTPPasswordMgr`](https://python-all.ru/3.9/library/urllib.request.html#urllib.request.HTTPPasswordMgr); обратитесь к разделу [HTTPPasswordMgr Objects](https://python-all.ru/3.9/library/urllib.request.html#http-password-mgr) для получения информации об интерфейсе, который необходимо поддерживать. HTTPBasicAuthHandler вызовет [`ValueError`](https://python-all.ru/3.9/library/exceptions.html#ValueError) при получении неправильной схемы аутентификации.182183#### `class urllib.request.ProxyBasicAuthHandler(password_mgr=None)`184185Управляет аутентификацией с прокси. *password\_mgr*, если указан, должен быть совместим с [`HTTPPasswordMgr`](https://python-all.ru/3.9/library/urllib.request.html#urllib.request.HTTPPasswordMgr); обращайтесь к разделу [HTTPPasswordMgr Objects](https://python-all.ru/3.9/library/urllib.request.html#http-password-mgr) за информацией об интерфейсе, который должен поддерживаться.186187#### `class urllib.request.AbstractDigestAuthHandler(password_mgr=None)`188189Это миксин-класс, который помогает с HTTP-аутентификацией как на удалённом хосте, так и через прокси. Если передан *password\_mgr*, он должен быть совместимым с [`HTTPPasswordMgr`](https://python-all.ru/3.9/library/urllib.request.html#urllib.request.HTTPPasswordMgr); обратитесь к разделу [HTTPPasswordMgr Objects](https://python-all.ru/3.9/library/urllib.request.html#http-password-mgr) для получения информации об интерфейсе, который необходимо поддерживать.190191#### `class urllib.request.HTTPDigestAuthHandler(password_mgr=None)`192193Управляет аутентификацией с удалённым хостом. *password\_mgr*, если указан, должен быть совместим с [`HTTPPasswordMgr`](https://python-all.ru/3.9/library/urllib.request.html#urllib.request.HTTPPasswordMgr); обращайтесь к разделу [HTTPPasswordMgr Objects](https://python-all.ru/3.9/library/urllib.request.html#http-password-mgr) за информацией об интерфейсе, который должен поддерживаться. Когда добавлены обработчик дайджест-аутентификации (Digest Authentication Handler) и обработчик базовой аутентификации (Basic Authentication Handler), дайджест-аутентификация всегда выполняется первой. Если дайджест-аутентификация снова возвращает ответ 40x, он передаётся обработчику базовой аутентификации. Этот метод обработчика вызовет исключение [`ValueError`](https://python-all.ru/3.9/library/exceptions.html#ValueError) при использовании схемы аутентификации, отличной от Digest или Basic.194195Изменено в версии 3.3: Возбуждает исключение [`ValueError`](https://python-all.ru/3.9/library/exceptions.html#ValueError) при неподдерживаемой схеме аутентификации.196197#### `class urllib.request.ProxyDigestAuthHandler(password_mgr=None)`198199Управляет аутентификацией с прокси. *password\_mgr*, если указан, должен быть совместим с [`HTTPPasswordMgr`](https://python-all.ru/3.9/library/urllib.request.html#urllib.request.HTTPPasswordMgr); обращайтесь к разделу [HTTPPasswordMgr Objects](https://python-all.ru/3.9/library/urllib.request.html#http-password-mgr) за информацией об интерфейсе, который должен поддерживаться.200201#### `class urllib.request.HTTPHandler`202203Класс для открытия HTTP-URL.204205#### `class urllib.request.HTTPSHandler(debuglevel=0, context=None, check_hostname=None)`206207Класс для открытия HTTPS-URL. *context* и *check\_hostname* имеют то же значение, что и в [`http.client.HTTPSConnection`](https://python-all.ru/3.9/library/http.client.html#http.client.HTTPSConnection).208209Изменено в версии 3.2: Добавлены параметры *context* и *check\_hostname*.210211#### `class urllib.request.FileHandler`212213Открывает локальные файлы.214215#### `class urllib.request.DataHandler`216217Открывает data-URL.218219Новое в версии 3.4.220221#### `class urllib.request.FTPHandler`222223Открывает FTP-URL.224225#### `class urllib.request.CacheFTPHandler`226227Открывает FTP-URL, сохраняя кеш открытых FTP-соединений для минимизации задержек.228229#### `class urllib.request.UnknownHandler`230231Универсальный класс для обработки неизвестных URL.232233#### `class urllib.request.HTTPErrorProcessor`234235Обрабатывает ошибочные HTTP-ответы.236237## Объекты запроса238239Следующие методы описывают открытый интерфейс [`Request`](https://python-all.ru/3.9/library/urllib.request.html#urllib.request.Request), поэтому все они могут быть переопределены в подклассах. Также определяет несколько открытых атрибутов, которые могут использоваться клиентами для анализа разобранного запроса.240241#### `Request.full_url`242243Оригинальный URL, переданный конструктору.244245Изменено в версии 3.4.246247Request.full\_url – это свойство с сеттером, геттером и делитером. При получении [`full_url`](https://python-all.ru/3.9/library/urllib.request.html#urllib.request.Request.full_url) возвращает оригинальный URL запроса вместе с фрагментом, если он присутствовал.248249#### `Request.type`250251Схема URI.252253#### `Request.host`254255Авторитетная часть URI, обычно хост, но может также содержать порт, отделённый двоеточием.256257#### `Request.origin_req_host`258259Исходный хост запроса, без порта.260261#### `Request.selector`262263Путь URI. Если [`Request`](https://python-all.ru/3.9/library/urllib.request.html#urllib.request.Request) использует прокси, то selector будет содержать полный URL, который передаётся прокси.264265#### `Request.data`266267Тело сущности запроса или `None`, если не задано.268269Изменено в версии 3.4: Изменение значения [`Request.data`](https://python-all.ru/3.9/library/urllib.request.html#urllib.request.Request.data) теперь удаляет заголовок “Content-Length” , если он был ранее установлен или вычислен.270271#### `Request.unverifiable`272273логическое значение, указывает, является ли запрос непроверяемым, как определено в [**RFC 2965**](https://python-all.ru/3.9/library/urllib.request.html).274275#### `Request.method`276277HTTP-метод запроса. По умолчанию его значение равно [`None`](https://python-all.ru/3.9/library/constants.html#None), что означает, что [`get_method()`](https://python-all.ru/3.9/library/urllib.request.html#urllib.request.Request.get_method) выполнит обычное вычисление метода. Значение можно задать (тем самым переопределив вычисление по умолчанию в [`get_method()`](https://python-all.ru/3.9/library/urllib.request.html#urllib.request.Request.get_method)), либо установив значение по умолчанию на уровне класса в подклассе [`Request`](https://python-all.ru/3.9/library/urllib.request.html#urllib.request.Request), либо передав значение в конструктор [`Request`](https://python-all.ru/3.9/library/urllib.request.html#urllib.request.Request) через аргумент *method*.278279Новое в версии 3.3.280281Изменено в версии 3.4: Теперь значение по умолчанию можно задавать в подклассах; ранее его можно было установить только через аргумент конструктора.282283#### `Request.get_method()`284285Возвращает строку, указывающую HTTP-метод запроса. Если [`Request.method`](https://python-all.ru/3.9/library/urllib.request.html#urllib.request.Request.method) не равно `None`, возвращается его значение; иначе возвращается `'GET'`, если [`Request.data`](https://python-all.ru/3.9/library/urllib.request.html#urllib.request.Request.data) равно `None`, или `'POST'` в противном случае. Это имеет смысл только для HTTP-запросов.286287Изменено в версии 3.3: get\_method теперь учитывает значение [`Request.method`](https://python-all.ru/3.9/library/urllib.request.html#urllib.request.Request.method).288289#### `Request.add_header(key, val)`290291Добавляет ещё один заголовок в запрос. В настоящее время заголовки игнорируются всеми обработчиками, кроме HTTP-обработчиков, где они добавляются в список заголовков, отправляемых серверу. Обратите внимание, что не может быть более одного заголовка с одним и тем же именем, и последующие вызовы перезаписывают предыдущие, если *key* совпадает. В настоящее время это не приводит к потере функциональности HTTP, поскольку все заголовки, которые имеют смысл при многократном использовании, имеют (заголовок-специфичный) способ достижения той же функциональности с помощью только одного заголовка. Обратите внимание, что заголовки, добавленные этим методом, также добавляются в перенаправленные запросы.292293#### `Request.add_unredirected_header(key, header)`294295Добавляет заголовок, который не будет добавлен в перенаправленный запрос.296297#### `Request.has_header(header)`298299Возвращает, имеет ли экземпляр указанный заголовок (проверяет как обычные, так и неперенаправленные).300301#### `Request.remove_header(header)`302303Удаляет указанный заголовок из экземпляра запроса (как из обычных, так и из неперенаправленных заголовков).304305Новое в версии 3.4.306307#### `Request.get_full_url()`308309Возвращает URL, переданный в конструктор.310311Изменено в версии 3.4.312313Возвращает [`Request.full_url`](https://python-all.ru/3.9/library/urllib.request.html#urllib.request.Request.full_url)314315#### `Request.set_proxy(host, type)`316317Подготавливает запрос, подключаясь к прокси-серверу. *host* и *type* заменят соответствующие значения экземпляра, а selector экземпляра будет содержать исходный URL, переданный в конструктор.318319#### `Request.get_header(header_name, default=None)`320321Возвращает значение указанного заголовка. Если заголовок отсутствует, возвращает значение по умолчанию.322323#### `Request.header_items()`324325Возвращает список кортежей (имя\_заголовка, значение\_заголовка) заголовков запроса.326327Изменено в версии 3.4:Методы запроса add\_data, has\_data, get\_data, get\_type, get\_host, get\_selector, get\_origin\_req\_host и is\_unverifiable, которые были объявлены устаревшими начиная с версии 3.3, удалены.328329## Объекты OpenerDirector330331Экземпляры [`OpenerDirector`](https://python-all.ru/3.9/library/urllib.request.html#urllib.request.OpenerDirector) имеют следующие методы:332333#### `OpenerDirector.add_handler(handler)`334335*handler* должен быть экземпляром [`BaseHandler`](https://python-all.ru/3.9/library/urllib.request.html#urllib.request.BaseHandler). Поиск осуществляется среди следующих методов, и они добавляются в возможные цепочки (обратите внимание: ошибки HTTP являются особым случаем). Обратите внимание, что в следующих методах *протокол* следует заменить на фактический обрабатываемый протокол, например `http_response()` будет обработчиком ответа протокола HTTP. Кроме того, *type* следует заменить на фактический код HTTP, например `http_error_404()` будет обрабатывать ошибки HTTP 404.336337- `<protocol>_open()` – сигнал о том, что обработчик умеет открывать URL *протокол*.338339 Подробнее см. [`BaseHandler.<protocol>_open()`](https://python-all.ru/3.9/library/urllib.request.html#protocol-open).340- `http_error_<type>()` – сигнал о том, что обработчик умеет обрабатывать ошибки HTTP с кодом ошибки HTTP *type*.341342 Подробнее см. [`BaseHandler.http_error_<nnn>()`](https://python-all.ru/3.9/library/urllib.request.html#http-error-nnn).343- `<protocol>_error()` – сигнал о том, что обработчик умеет обрабатывать ошибки от (не-`http`) *протокол*.344- `<protocol>_request()` – сигнал о том, что обработчик умеет предварительно обрабатывать запросы *протокол*.345346 Подробнее см. [`BaseHandler.<protocol>_request()`](https://python-all.ru/3.9/library/urllib.request.html#protocol-request).347- `<protocol>_response()` – сигнал о том, что обработчик умеет постобрабатывать ответы *протокол*.348349 Подробнее см. [`BaseHandler.<protocol>_response()`](https://python-all.ru/3.9/library/urllib.request.html#protocol-response).350351#### `OpenerDirector.open(url, data=None[, timeout])`352353Открывает указанный *url* (который может быть объектом запроса или строкой), при необходимости передавая указанные *data*. Аргументы, возвращаемые значения и вызываемые исключения такие же, как у [`urlopen()`](https://python-all.ru/3.9/library/urllib.request.html#urllib.request.urlopen) (который просто вызывает метод [`open()`](https://python-all.ru/3.9/library/functions.html#open) текущего установленного глобального [`OpenerDirector`](https://python-all.ru/3.9/library/urllib.request.html#urllib.request.OpenerDirector)). Необязательный параметр *timeout* задаёт тайм-аут в секундах для блокирующих операций, таких как попытка подключения (если не указан, будет использоваться глобальная настройка тайм-аута по умолчанию). Функция тайм-аута на самом деле работает только для HTTP, HTTPS и FTP соединений.354355#### `OpenerDirector.error(proto, *args)`356357Обрабатывает ошибку указанного протокола. Вызывает зарегистрированные обработчики ошибок для данного протокола с указанными аргументами (зависящими от протокола). Протокол HTTP является особым случаем: для определения конкретного обработчика ошибок используется код ответа HTTP; обратитесь к методам `http_error_<type>()` классов обработчиков.358359Возвращаемые значения и вызываемые исключения такие же, как у [`urlopen()`](https://python-all.ru/3.9/library/urllib.request.html#urllib.request.urlopen).360361Объекты OpenerDirector открывают URL в три этапа:362363Порядок вызова этих методов в каждом этапе определяется сортировкой экземпляров обработчиков.3643651. Каждый обработчик, имеющий метод с именем `<protocol>_request()`, вызывает этот метод для предварительной обработки запроса.3662. Обработчики, имеющие метод с именем `<protocol>_open()`, вызываются для обработки запроса. Этот этап завершается, когда обработчик либо возвращает значение, отличное от [`None`](https://python-all.ru/3.9/library/constants.html#None) (т.е. ответ), либо вызывает исключение (обычно [`URLError`](https://python-all.ru/3.9/library/urllib.error.html#urllib.error.URLError)). Исключения могут распространяться дальше.367368 На самом деле, описанный выше алгоритм сначала применяется для методов с именем `default_open()`. Если все такие методы возвращают [`None`](https://python-all.ru/3.9/library/constants.html#None), алгоритм повторяется для методов с именем `<protocol>_open()`. Если все такие методы возвращают [`None`](https://python-all.ru/3.9/library/constants.html#None), алгоритм повторяется для методов с именем `unknown_open()`.369370 Обратите внимание, что реализация этих методов может включать вызовы методов [`open()`](https://python-all.ru/3.9/library/urllib.request.html#urllib.request.OpenerDirector.open) и [`error()`](https://python-all.ru/3.9/library/urllib.request.html#urllib.request.OpenerDirector.error) родительского экземпляра [`OpenerDirector`](https://python-all.ru/3.9/library/urllib.request.html#urllib.request.OpenerDirector).3713. Каждый обработчик, имеющий метод с именем `<protocol>_response()`, вызывает этот метод для постобработки ответа.372373## Объекты BaseHandler374375Объекты [`BaseHandler`](https://python-all.ru/3.9/library/urllib.request.html#urllib.request.BaseHandler) предоставляют несколько методов, которые непосредственно полезны, а также другие методы, предназначенные для использования производными классами. Они предназначены для прямого использования:376377#### `BaseHandler.add_parent(director)`378379Добавляет директор в качестве родителя.380381#### `BaseHandler.close()`382383Удаляет всех родителей.384385Следующие атрибут и методы должны использоваться только классами, производными от [`BaseHandler`](https://python-all.ru/3.9/library/urllib.request.html#urllib.request.BaseHandler).386387> **Примечание**388>389> Принято соглашение, что подклассы, определяющие методы `<protocol>_request()` или `<protocol>_response()`, называются `*Processor`; все остальные называются `*Handler`.390391#### `BaseHandler.parent`392393Действительный [`OpenerDirector`](https://python-all.ru/3.9/library/urllib.request.html#urllib.request.OpenerDirector), который можно использовать для открытия через другой протокол или для обработки ошибок.394395#### `BaseHandler.default_open(req)`396397Этот метод *не* определён в [`BaseHandler`](https://python-all.ru/3.9/library/urllib.request.html#urllib.request.BaseHandler), но подклассы должны определить его, если хотят перехватывать все URL.398399Если этот метод реализован, он будет вызван родительским [`OpenerDirector`](https://python-all.ru/3.9/library/urllib.request.html#urllib.request.OpenerDirector). Он должен возвращать файлоподобный объект, как описано в возвращаемом значении метода [`open()`](https://python-all.ru/3.9/library/urllib.request.html#urllib.request.OpenerDirector.open) класса [`OpenerDirector`](https://python-all.ru/3.9/library/urllib.request.html#urllib.request.OpenerDirector), или `None`. Он должен вызывать исключение [`URLError`](https://python-all.ru/3.9/library/urllib.error.html#urllib.error.URLError), если не происходит действительно исключительной ситуации (например, [`MemoryError`](https://python-all.ru/3.9/library/exceptions.html#MemoryError) не должен отображаться на `URLError`).400401Этот метод будет вызван перед любым методом открытия, специфичным для протокола.402403#### `BaseHandler.<protocol>_open(req)`404405Этот метод *не* определён в [`BaseHandler`](https://python-all.ru/3.9/library/urllib.request.html#urllib.request.BaseHandler), но подклассы должны определить его, если хотят обрабатывать URL с указанным протоколом.406407Если этот метод определён, он будет вызван родительским [`OpenerDirector`](https://python-all.ru/3.9/library/urllib.request.html#urllib.request.OpenerDirector). Возвращаемые значения должны быть такими же, как для `default_open()`.408409#### `BaseHandler.unknown_open(req)`410411Этот метод *не* определён в [`BaseHandler`](https://python-all.ru/3.9/library/urllib.request.html#urllib.request.BaseHandler), но подклассы должны определить его, если хотят перехватывать все URL, для которых нет зарегистрированного обработчика для открытия.412413Если этот метод реализован, он будет вызван [`parent`](https://python-all.ru/3.9/library/urllib.request.html#urllib.request.BaseHandler.parent) [`OpenerDirector`](https://python-all.ru/3.9/library/urllib.request.html#urllib.request.OpenerDirector). Возвращаемые значения должны быть такими же, как для [`default_open()`](https://python-all.ru/3.9/library/urllib.request.html#urllib.request.BaseHandler.default_open).414415#### `BaseHandler.http_error_default(req, fp, code, msg, hdrs)`416417Этот метод *не* определён в [`BaseHandler`](https://python-all.ru/3.9/library/urllib.request.html#urllib.request.BaseHandler), но подклассы должны переопределить его, если они намерены обеспечить всеобъемлющую обработку для иначе необработанных HTTP-ошибок. Он будет автоматически вызван [`OpenerDirector`](https://python-all.ru/3.9/library/urllib.request.html#urllib.request.OpenerDirector) при получении ошибки и обычно не должен вызываться в других обстоятельствах.418419*req* будет объектом [`Request`](https://python-all.ru/3.9/library/urllib.request.html#urllib.request.Request), *fp* будет файлоподобным объектом с телом HTTP-ошибки, *code* будет трёхзначным кодом ошибки, *msg* будет видимым пользователю пояснением кода, а *hdrs* будет объектом отображения, содержащим заголовки ошибки.420421Возвращаемые значения и вызываемые исключения должны быть такими же, как у [`urlopen()`](https://python-all.ru/3.9/library/urllib.request.html#urllib.request.urlopen).422423#### `BaseHandler.http_error_<nnn>(req, fp, code, msg, hdrs)`424425*nnn* должен быть трёхзначным HTTP-кодом ошибки. Этот метод также не определён в [`BaseHandler`](https://python-all.ru/3.9/library/urllib.request.html#urllib.request.BaseHandler), но будет вызван, если он существует, на экземпляре подкласса, когда возникает HTTP-ошибка с кодом *nnn*.426427Подклассы должны переопределить этот метод для обработки конкретных HTTP-ошибок.428429Аргументы, возвращаемые значения и вызываемые исключения должны быть такими же, как для `http_error_default()`.430431#### `BaseHandler.<protocol>_request(req)`432433Этот метод *не* определён в [`BaseHandler`](https://python-all.ru/3.9/library/urllib.request.html#urllib.request.BaseHandler), но подклассы должны определить его, если хотят предварительно обрабатывать запросы заданного протокола.434435Если этот метод определён, он будет вызван родительским [`OpenerDirector`](https://python-all.ru/3.9/library/urllib.request.html#urllib.request.OpenerDirector). *req* будет объектом [`Request`](https://python-all.ru/3.9/library/urllib.request.html#urllib.request.Request). Возвращаемое значение должно быть объектом [`Request`](https://python-all.ru/3.9/library/urllib.request.html#urllib.request.Request).436437#### `BaseHandler.<protocol>_response(req, response)`438439Этот метод *не* определён в [`BaseHandler`](https://python-all.ru/3.9/library/urllib.request.html#urllib.request.BaseHandler), но подклассы должны определить его, если хотят выполнять постобработку ответов заданного протокола.440441Этот метод, если он определён, будет вызван родительским [`OpenerDirector`](https://python-all.ru/3.9/library/urllib.request.html#urllib.request.OpenerDirector). *req* будет объектом [`Request`](https://python-all.ru/3.9/library/urllib.request.html#urllib.request.Request). *response* будет объектом, реализующим тот же интерфейс, что и возвращаемое значение [`urlopen()`](https://python-all.ru/3.9/library/urllib.request.html#urllib.request.urlopen). Возвращаемое значение должно реализовывать тот же интерфейс, что и возвращаемое значение [`urlopen()`](https://python-all.ru/3.9/library/urllib.request.html#urllib.request.urlopen).442443## Объекты HTTPRedirectHandler444445> **Примечание**446>447> Некоторые HTTP-перенаправления требуют действий от клиентского кода этого модуля. В таком случае возбуждается [`HTTPError`](https://python-all.ru/3.9/library/urllib.error.html#urllib.error.HTTPError). См. [**RFC 2616**](https://python-all.ru/3.9/library/urllib.request.html) для подробностей о точном значении различных кодов перенаправления.448>449> Исключение `HTTPError`, возбуждаемое по соображениям безопасности, если HTTPRedirectHandler получает URL перенаправления, который не является HTTP, HTTPS или FTP URL.450451#### `HTTPRedirectHandler.redirect_request(req, fp, code, msg, hdrs, newurl)`452453Возвращает [`Request`](https://python-all.ru/3.9/library/urllib.request.html#urllib.request.Request) или `None` в ответ на перенаправление. Этот метод вызывается реализациями по умолчанию методов `http_error_30*()`, когда от сервера получено перенаправление. Если перенаправление должно произойти, верните новый [`Request`](https://python-all.ru/3.9/library/urllib.request.html#urllib.request.Request), чтобы `http_error_30*()` смог выполнить перенаправление на *newurl*. В противном случае возбудите [`HTTPError`](https://python-all.ru/3.9/library/urllib.error.html#urllib.error.HTTPError), если никакой другой обработчик не должен пытаться обработать этот URL, или верните `None`, если вы не можете, но другой обработчик смог бы.454455> **Примечание**456>457> Реализация по умолчанию этого метода не следует строго [**RFC 2616**](https://python-all.ru/3.9/library/urllib.request.html), который говорит, что ответы 301 и 302 на запросы `POST` не должны автоматически перенаправляться без подтверждения пользователем. В действительности браузеры разрешают автоматическое перенаправление таких ответов, меняя POST на `GET`, и реализация по умолчанию воспроизводит такое поведение.458459#### `HTTPRedirectHandler.http_error_301(req, fp, code, msg, hdrs)`460461Перенаправляет на URL `Location:` или `URI:`. Этот метод вызывается родительским [`OpenerDirector`](https://python-all.ru/3.9/library/urllib.request.html#urllib.request.OpenerDirector) при получении HTTP-ответа «Moved Permanently».462463#### `HTTPRedirectHandler.http_error_302(req, fp, code, msg, hdrs)`464465То же, что и [`http_error_301()`](https://python-all.ru/3.9/library/urllib.request.html#urllib.request.HTTPRedirectHandler.http_error_301), но вызывается для ответа «Found».466467#### `HTTPRedirectHandler.http_error_303(req, fp, code, msg, hdrs)`468469То же, что и [`http_error_301()`](https://python-all.ru/3.9/library/urllib.request.html#urllib.request.HTTPRedirectHandler.http_error_301), но вызывается для ответа «See Other».470471#### `HTTPRedirectHandler.http_error_307(req, fp, code, msg, hdrs)`472473То же, что и [`http_error_301()`](https://python-all.ru/3.9/library/urllib.request.html#urllib.request.HTTPRedirectHandler.http_error_301), но вызывается для ответа «временное перенаправление».474475## Объекты HTTPCookieProcessor476477Экземпляры [`HTTPCookieProcessor`](https://python-all.ru/3.9/library/urllib.request.html#urllib.request.HTTPCookieProcessor) имеют один атрибут:478479#### `HTTPCookieProcessor.cookiejar`480481[`http.cookiejar.CookieJar`](https://python-all.ru/3.9/library/http.cookiejar.html#http.cookiejar.CookieJar), в котором хранятся куки.482483## Объекты ProxyHandler484485#### `ProxyHandler.<protocol>_open(request)`486487Объект [`ProxyHandler`](https://python-all.ru/3.9/library/urllib.request.html#urllib.request.ProxyHandler) будет иметь метод `<protocol>_open()` для каждого *протокол*, для которого есть прокси в словаре *proxies*, переданном в конструктор. Метод будет изменять запросы для прохождения через прокси, вызывая `request.set_proxy()`, и вызывать следующий обработчик в цепочке для непосредственного выполнения протокола.488489## Объекты HTTPPasswordMgr490491Эти методы доступны у объектов [`HTTPPasswordMgr`](https://python-all.ru/3.9/library/urllib.request.html#urllib.request.HTTPPasswordMgr) и [`HTTPPasswordMgrWithDefaultRealm`](https://python-all.ru/3.9/library/urllib.request.html#urllib.request.HTTPPasswordMgrWithDefaultRealm).492493#### `HTTPPasswordMgr.add_password(realm, uri, user, passwd)`494495*uri* может быть как одним URI, так и последовательностью URI. *realm*, *user* и *passwd* должны быть строками. В результате `(user, passwd)` будет использоваться в качестве токенов аутентификации, когда запрашивается аутентификация для *realm* и супер-URI любого из заданных URI.496497#### `HTTPPasswordMgr.find_user_password(realm, authuri)`498499Получает имя пользователя/пароль для заданных realm и URI, если они есть. Этот метод вернёт `(None, None)`, если нет соответствующей пары пользователь/пароль.500501Для объектов [`HTTPPasswordMgrWithDefaultRealm`](https://python-all.ru/3.9/library/urllib.request.html#urllib.request.HTTPPasswordMgrWithDefaultRealm) область `None` будет проверена, если заданная *realm* не имеет соответствующей пары пользователь/пароль.502503## Объекты HTTPPasswordMgrWithPriorAuth504505Этот менеджер паролей расширяет [`HTTPPasswordMgrWithDefaultRealm`](https://python-all.ru/3.9/library/urllib.request.html#urllib.request.HTTPPasswordMgrWithDefaultRealm), чтобы поддерживать отслеживание URI, для которых учётные данные аутентификации должны всегда отправляться.506507#### `HTTPPasswordMgrWithPriorAuth.add_password(realm, uri, user, passwd, is_authenticated=False)`508509*realm*, *uri*, *user*, *passwd* – как и для [`HTTPPasswordMgr.add_password()`](https://python-all.ru/3.9/library/urllib.request.html#urllib.request.HTTPPasswordMgr.add_password). *is\_authenticated* устанавливает начальное значение флага `is_authenticated` для указанного URI или списка URI. Если *is\_authenticated* указан как `True`, *realm* игнорируется.510511#### `HTTPPasswordMgrWithPriorAuth.find_user_password(realm, authuri)`512513То же, что и для объектов [`HTTPPasswordMgrWithDefaultRealm`](https://python-all.ru/3.9/library/urllib.request.html#urllib.request.HTTPPasswordMgrWithDefaultRealm)514515#### `HTTPPasswordMgrWithPriorAuth.update_authenticated(self, uri, is_authenticated=False)`516517Обновляет флаг `is_authenticated` для указанного *uri* или списка URI.518519#### `HTTPPasswordMgrWithPriorAuth.is_authenticated(self, authuri)`520521Возвращает текущее состояние флага `is_authenticated` для указанного URI.522523## Объекты AbstractBasicAuthHandler524525#### `AbstractBasicAuthHandler.http_error_auth_reqed(authreq, host, req, headers)`526527Обрабатывает запрос аутентификации, получая пару пользователь/пароль и повторяя запрос. *authreq* должен быть именем заголовка, в котором содержится информация о realm в запросе, *host* указывает URL и путь для аутентификации, *req* должен быть (неудачным) объектом [`Request`](https://python-all.ru/3.9/library/urllib.request.html#urllib.request.Request), а *headers* – заголовками ошибки.528529*host* – это либо authority (например, `"python.org"`), либо URL, содержащий компонент authority (например, `"http://python.org/"`). В любом случае, authority не должен содержать компонент userinfo (поэтому `"python.org"` и `"python.org:80"` подходят, а `"joe:password@python.org"` – нет).530531## Объекты HTTPBasicAuthHandler532533#### `HTTPBasicAuthHandler.http_error_401(req, fp, code, msg, hdrs)`534535Повторяет запрос с информацией аутентификации, если она доступна.536537## Объекты ProxyBasicAuthHandler538539#### `ProxyBasicAuthHandler.http_error_407(req, fp, code, msg, hdrs)`540541Повторяет запрос с информацией аутентификации, если она доступна.542543## Объекты AbstractDigestAuthHandler544545#### `AbstractDigestAuthHandler.http_error_auth_reqed(authreq, host, req, headers)`546547*authreq* должен быть именем заголовка, в котором содержится информация о realm в запросе, *host* должен быть хостом для аутентификации, *req* должен быть (неудачным) объектом [`Request`](https://python-all.ru/3.9/library/urllib.request.html#urllib.request.Request), а *headers* – заголовками ошибки.548549## Объекты HTTPDigestAuthHandler550551#### `HTTPDigestAuthHandler.http_error_401(req, fp, code, msg, hdrs)`552553Повторяет запрос с информацией аутентификации, если она доступна.554555## Объекты ProxyDigestAuthHandler556557#### `ProxyDigestAuthHandler.http_error_407(req, fp, code, msg, hdrs)`558559Повторяет запрос с информацией аутентификации, если она доступна.560561## Объекты HTTPHandler562563#### `HTTPHandler.http_open(req)`564565Отправляет HTTP-запрос, который может быть GET или POST, в зависимости от `req.has_data()`.566567## Объекты HTTPSHandler568569#### `HTTPSHandler.https_open(req)`570571Отправляет HTTPS-запрос, который может быть GET или POST, в зависимости от `req.has_data()`.572573## Объекты FileHandler574575#### `FileHandler.file_open(req)`576577Открывает файл локально, если имя хоста отсутствует или равно `'localhost'`.578579Изменено в версии 3.2: Этот метод применим только для локальных имен хоста. Если указано удаленное имя хоста, возникает исключение [`URLError`](https://python-all.ru/3.9/library/urllib.error.html#urllib.error.URLError).580581## Объекты DataHandler582583#### `DataHandler.data_open(req)`584585Читает data URL. Такой URL содержит контент, закодированный в самом URL. Синтаксис data URL описан в [**RFC 2397**](https://python-all.ru/3.9/library/urllib.request.html). Данная реализация игнорирует пробелы в data URL, закодированных в base64, поэтому URL может быть перенесен в любом исходном файле, откуда он взят. Но хотя некоторые браузеры не обращают внимания на отсутствие дополнения в конце URL в base64, эта реализация в таком случае возбудит исключение [`ValueError`](https://python-all.ru/3.9/library/exceptions.html#ValueError).586587## Объекты FTPHandler588589#### `FTPHandler.ftp_open(req)`590591Открывает FTP-файл, указанный *req*. Вход всегда выполняется с пустыми именем пользователя и паролем.592593## Объекты CacheFTPHandler594595Объекты [`CacheFTPHandler`](https://python-all.ru/3.9/library/urllib.request.html#urllib.request.CacheFTPHandler) являются объектами [`FTPHandler`](https://python-all.ru/3.9/library/urllib.request.html#urllib.request.FTPHandler) со следующими дополнительными методами:596597#### `CacheFTPHandler.setTimeout(t)`598599Устанавливает тайм-аут соединений равным *t* секунд.600601#### `CacheFTPHandler.setMaxConns(m)`602603Устанавливает максимальное количество кэшированных соединений равным *m*.604605## Объекты UnknownHandler606607#### `UnknownHandler.unknown_open()`608609Вызывает исключение [`URLError`](https://python-all.ru/3.9/library/urllib.error.html#urllib.error.URLError).610611## Объекты HTTPErrorProcessor612613#### `HTTPErrorProcessor.http_response(request, response)`614615Обрабатывает ошибочные HTTP-ответы.616617Для кода 200 объект ответа возвращается немедленно.618619Для кодов ошибок, отличных от 200, этот метод просто передаёт задачу методам обработчика `http_error_<type>()` через [`OpenerDirector.error()`](https://python-all.ru/3.9/library/urllib.request.html#urllib.request.OpenerDirector.error). В конечном счёте, [`HTTPDefaultErrorHandler`](https://python-all.ru/3.9/library/urllib.request.html#urllib.request.HTTPDefaultErrorHandler) вызовет исключение [`HTTPError`](https://python-all.ru/3.9/library/urllib.error.html#urllib.error.HTTPError), если ни один другой обработчик не обработает ошибку.620621#### `HTTPErrorProcessor.https_response(request, response)`622623Обрабатывает ошибочные HTTPS-ответы.624625Поведение аналогично [`http_response()`](https://python-all.ru/3.9/library/urllib.request.html#urllib.request.HTTPErrorProcessor.http_response).626627## Примеры628629В дополнение к примерам ниже, больше примеров приведено в [HOWTO Fetch Internet Resources Using The urllib Package](https://python-all.ru/3.9/howto/urllib2.html#urllib-howto).630631Этот пример получает главную страницу python.org и отображает первые 300 байт этой страницы.632633```python634>>> import urllib.request635>>> with urllib.request.urlopen('http://www.python.org/') as f:636... print(f.read(300))637...638b'<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"639"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">\n\n\n<html640xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">\n\n<head>\n641<meta http-equiv="content-type" content="text/html; charset=utf-8" />\n642<title>Python Programming '643```644645Обратите внимание, что urlopen возвращает объект bytes. Это связано с тем, что urlopen не может автоматически определить кодировку байтового потока, полученного от HTTP-сервера. Как правило, программа декодирует возвращённый объект bytes в строку, как только определит или угадает подходящую кодировку.646647Следующий документ W3C, [https://www.w3.org/International/O-charset](https://python-all.ru/3.9/library/urllib.request.html), перечисляет различные способы, которыми (X)HTML или XML-документ может задать информацию о своей кодировке.648649Поскольку веб-сайт python.org использует кодировку *utf-8*, как указано в его метатеге, мы будем использовать ту же кодировку для декодирования объекта bytes.650651```python652>>> with urllib.request.urlopen('http://www.python.org/') as f:653... print(f.read(100).decode('utf-8'))654...655<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"656"http://www.w3.org/TR/xhtml1/DTD/xhtm657```658659Тот же результат можно получить и без использования [менеджера контекста](https://python-all.ru/3.9/glossary.html#term-context-manager) подхода.660661```python662>>> import urllib.request663>>> f = urllib.request.urlopen('http://www.python.org/')664>>> print(f.read(100).decode('utf-8'))665<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"666"http://www.w3.org/TR/xhtml1/DTD/xhtm667```668669В следующем примере мы отправляем поток данных на стандартный ввод CGI и читаем данные, которые он возвращает. Обратите внимание: этот пример будет работать только в том случае, если установка Python поддерживает SSL.670671```python672>>> import urllib.request673>>> req = urllib.request.Request(url='https://localhost/cgi-bin/test.cgi',674... data=b'This data is passed to stdin of the CGI')675>>> with urllib.request.urlopen(req) as f:676... print(f.read().decode('utf-8'))677...678Got Data: "This data is passed to stdin of the CGI"679```680681Код образца CGI, использованного в приведённом выше примере:682683```python684#!/usr/bin/env python685import sys686data = sys.stdin.read()687print('Content-type: text/plain\n\nGot Data: "%s"' % data)688```689690Вот пример выполнения запроса `PUT` с помощью [`Request`](https://python-all.ru/3.9/library/urllib.request.html#urllib.request.Request):691692```python693import urllib.request694DATA = b'some data'695req = urllib.request.Request(url='http://localhost:8080', data=DATA,method='PUT')696with urllib.request.urlopen(req) as f:697 pass698print(f.status)699print(f.reason)700```701702Использование базовой HTTP-аутентификации:703704```python705import urllib.request706# Создать OpenerDirector с поддержкой базовой HTTP-аутентификации...707auth_handler = urllib.request.HTTPBasicAuthHandler()708auth_handler.add_password(realm='PDQ Application',709 uri='https://mahler:8092/site-updates.py',710 user='klem',711 passwd='kadidd!ehopper')712opener = urllib.request.build_opener(auth_handler)713# ...и установить его глобально, чтобы его можно было использовать с urlopen.714urllib.request.install_opener(opener)715urllib.request.urlopen('http://www.example.com/login.html')716```717718[`build_opener()`](https://python-all.ru/3.9/library/urllib.request.html#urllib.request.build_opener) предоставляет множество обработчиков по умолчанию, включая [`ProxyHandler`](https://python-all.ru/3.9/library/urllib.request.html#urllib.request.ProxyHandler). По умолчанию [`ProxyHandler`](https://python-all.ru/3.9/library/urllib.request.html#urllib.request.ProxyHandler) использует переменные окружения с именами `<scheme>_proxy`, где `<scheme>` – это схема URL. Например, переменная окружения `http_proxy` читается для получения URL HTTP-прокси.719720В этом примере стандартный [`ProxyHandler`](https://python-all.ru/3.9/library/urllib.request.html#urllib.request.ProxyHandler) заменяется на тот, который использует программно заданные URL прокси, а также добавляется поддержка авторизации прокси с помощью [`ProxyBasicAuthHandler`](https://python-all.ru/3.9/library/urllib.request.html#urllib.request.ProxyBasicAuthHandler).721722```python723proxy_handler = urllib.request.ProxyHandler({'http': 'http://www.example.com:3128/'})724proxy_auth_handler = urllib.request.ProxyBasicAuthHandler()725proxy_auth_handler.add_password('realm', 'host', 'username', 'password')726727opener = urllib.request.build_opener(proxy_handler, proxy_auth_handler)728# На этот раз, вместо установки OpenerDirector, используется напрямую:729opener.open('http://www.example.com/login.html')730```731732Добавление HTTP-заголовков:733734Используйте аргумент *headers* конструктора [`Request`](https://python-all.ru/3.9/library/urllib.request.html#urllib.request.Request) или:735736```python737import urllib.request738req = urllib.request.Request('http://www.example.com/')739req.add_header('Referer', 'http://www.python.org/')740# Настроить значение заголовка User-Agent по умолчанию:741req.add_header('User-Agent', 'urllib-example/0.1 (Contact: . . .)')742r = urllib.request.urlopen(req)743```744745[`OpenerDirector`](https://python-all.ru/3.9/library/urllib.request.html#urllib.request.OpenerDirector) автоматически добавляет заголовок *User-Agent* к каждому запросу [`Request`](https://python-all.ru/3.9/library/urllib.request.html#urllib.request.Request). Чтобы изменить это:746747```python748import urllib.request749opener = urllib.request.build_opener()750opener.addheaders = [('User-agent', 'Mozilla/5.0')]751opener.open('http://www.example.com/')752```753754Также помните, что несколько стандартных заголовков (*Content-Length*, *Content-Type* и *Host*) добавляются, когда [`Request`](https://python-all.ru/3.9/library/urllib.request.html#urllib.request.Request) передаётся в [`urlopen()`](https://python-all.ru/3.9/library/urllib.request.html#urllib.request.urlopen) (или [`OpenerDirector.open()`](https://python-all.ru/3.9/library/urllib.request.html#urllib.request.OpenerDirector.open)).755756Вот пример сеанса, в котором используется метод `GET` для получения URL с параметрами:757758```python759>>> import urllib.request760>>> import urllib.parse761>>> params = urllib.parse.urlencode({'spam': 1, 'eggs': 2, 'bacon': 0})762>>> url = "http://www.musi-cal.com/cgi-bin/query?%s" % params763>>> with urllib.request.urlopen(url) as f:764... print(f.read().decode('utf-8'))765...766```767768В следующем примере вместо этого используется метод `POST`. Обратите внимание, что вывод параметров из urlencode кодируется в байты перед отправкой в urlopen в качестве данных:769770```python771>>> import urllib.request772>>> import urllib.parse773>>> data = urllib.parse.urlencode({'spam': 1, 'eggs': 2, 'bacon': 0})774>>> data = data.encode('ascii')775>>> with urllib.request.urlopen("http://requestb.in/xrbl82xr", data) as f:776... print(f.read().decode('utf-8'))777...778```779780В следующем примере используется явно указанный HTTP-прокси, переопределяющий настройки окружения:781782```python783>>> import urllib.request784>>> proxies = {'http': 'http://proxy.example.com:8080/'}785>>> opener = urllib.request.FancyURLopener(proxies)786>>> with opener.open("http://www.python.org") as f:787... f.read().decode('utf-8')788...789```790791В следующем примере прокси не используются вовсе, переопределяя настройки окружения:792793```python794>>> import urllib.request795>>> opener = urllib.request.FancyURLopener({})796>>> with opener.open("http://www.python.org/") as f:797... f.read().decode('utf-8')798...799```800801## Устаревший интерфейс802803Следующие функции и классы перенесены из модуля Python 2 `urllib` (в отличие от `urllib2`). В будущем они могут стать устаревшими.804805#### `urllib.request.urlretrieve(url, filename=None, reporthook=None, data=None)`806807Копирует сетевой объект, заданный URL, в локальный файл. Если URL указывает на локальный файл, объект не будет скопирован, если не указан filename. Возвращает кортеж `(filename, headers)`, где *filename* – это имя локального файла, под которым можно найти объект, а *headers* – то, что вернул метод `info()` объекта, возвращённого [`urlopen()`](https://python-all.ru/3.9/library/urllib.request.html#urllib.request.urlopen) (для удалённого объекта). Исключения те же, что и для [`urlopen()`](https://python-all.ru/3.9/library/urllib.request.html#urllib.request.urlopen).808809Второй аргумент, если присутствует, задаёт местоположение файла для копирования (если отсутствует, местоположением будет временный файл с автоматически сгенерированным именем). Третий аргумент, если присутствует, является вызываемым объектом, который будет вызван один раз при установлении сетевого соединения и один раз после каждого последующего чтения блока. Вызываемый объект будет получать три аргумента: количество переданных блоков на данный момент, размер блока в байтах и общий размер файла. Третий аргумент может быть `-1` на старых FTP-серверах, которые не возвращают размер файла в ответ на запрос получения.810811Следующий пример иллюстрирует наиболее распространённый сценарий использования:812813```python814>>> import urllib.request815>>> local_filename, headers = urllib.request.urlretrieve('http://python.org/')816>>> html = open(local_filename)817>>> html.close()818```819820Если *url* использует идентификатор схемы `http:`, необязательный аргумент *data* может быть передан для указания запроса `POST` (обычно тип запроса – `GET`). Аргумент *data* должен быть байтовым объектом в стандартном формате *application/x-www-form-urlencoded*; см. функцию [`urllib.parse.urlencode()`](https://python-all.ru/3.9/library/urllib.parse.html#urllib.parse.urlencode).821822[`urlretrieve()`](https://python-all.ru/3.9/library/urllib.request.html#urllib.request.urlretrieve) вызовет исключение `ContentTooShortError`, когда обнаружит, что объём доступных данных меньше ожидаемого (который указан в заголовке *Content-Length*). Это может произойти, например, при прерывании загрузки.823824Заголовок *Content-Length* рассматривается как нижняя граница: если доступно больше данных для чтения, urlretrieve читает больше данных, но если данных меньше, он вызывает исключение.825826В этом случае вы всё ещё можете получить загруженные данные – они хранятся в атрибуте `content` экземпляра исключения.827828Если заголовок *Content-Length* не был передан, urlretrieve не может проверить размер загруженных данных и просто возвращает их. В этом случае остаётся только предполагать, что загрузка прошла успешно.829830#### `urllib.request.urlcleanup()`831832Очищает временные файлы, которые могли остаться от предыдущих вызовов [`urlretrieve()`](https://python-all.ru/3.9/library/urllib.request.html#urllib.request.urlretrieve).833834#### `class urllib.request.URLopener(proxies=None, **x509)`835836Устарело с версии 3.3.837838Базовый класс для открытия и чтения URL. Если не требуется поддержка открытия объектов с использованием схем, отличных от `http:`, `ftp:` или `file:`, вероятно, стоит использовать [`FancyURLopener`](https://python-all.ru/3.9/library/urllib.request.html#urllib.request.FancyURLopener).839840По умолчанию класс [`URLopener`](https://python-all.ru/3.9/library/urllib.request.html#urllib.request.URLopener) отправляет заголовок *User-Agent* со значением `urllib/VVV`, где *VVV* – это номер версии [`urllib`](https://python-all.ru/3.9/library/urllib.html#module-urllib). Приложения могут задать собственный заголовок *User-Agent*, создав подкласс [`URLopener`](https://python-all.ru/3.9/library/urllib.request.html#urllib.request.URLopener) или [`FancyURLopener`](https://python-all.ru/3.9/library/urllib.request.html#urllib.request.FancyURLopener) и установив атрибут класса [`version`](https://python-all.ru/3.9/library/urllib.request.html#urllib.request.URLopener.version) в соответствующее строковое значение в определении подкласса.841842Необязательный параметр *proxies* должен быть словарём, сопоставляющим имена схем с URL прокси. Пустой словарь полностью отключает прокси. Значение по умолчанию – `None`; в этом случае используются настройки прокси из окружения (если они есть), как описано выше в определении [`urlopen()`](https://python-all.ru/3.9/library/urllib.request.html#urllib.request.urlopen).843844Дополнительные именованные параметры, собранные в *x509*, могут использоваться для аутентификации клиента при использовании схемы `https:`. Поддерживаются ключевые слова *key\_file* и *cert\_file* для указания SSL-ключа и сертификата; оба необходимы для поддержки аутентификации клиента.845846Объекты [`URLopener`](https://python-all.ru/3.9/library/urllib.request.html#urllib.request.URLopener) возбуждают исключение [`OSError`](https://python-all.ru/3.9/library/exceptions.html#OSError), если сервер возвращает код ошибки.847848#### `open(fullurl, data=None)`849850Открывает *fullurl*, используя соответствующий протокол. Этот метод настраивает кеш и информацию о прокси, а затем вызывает соответствующий метод open с переданными аргументами. Если схема не распознана, вызывается [`open_unknown()`](https://python-all.ru/3.9/library/urllib.request.html#urllib.request.URLopener.open_unknown). Аргумент *data* имеет то же значение, что и аргумент *data* метода [`urlopen()`](https://python-all.ru/3.9/library/urllib.request.html#urllib.request.urlopen).851852Этот метод всегда экранирует *fullurl* с помощью [`quote()`](https://python-all.ru/3.9/library/urllib.parse.html#urllib.parse.quote).853854#### `open_unknown(fullurl, data=None)`855856Переопределяемый интерфейс для открытия неизвестных типов URL.857858#### `retrieve(url, filename=None, reporthook=None, data=None)`859860Извлекает содержимое *url* и помещает его в *filename*. Возвращаемое значение – кортеж из локального имени файла и либо объекта [`email.message.Message`](https://python-all.ru/3.9/library/email.compat32-message.html#email.message.Message), содержащего заголовки ответа (для удалённых URL), либо `None` (для локальных URL). После этого вызывающий код должен открыть и прочитать содержимое *filename*. Если *filename* не указан и URL ссылается на локальный файл, возвращается имя входного файла. Если URL не является локальным и *filename* не указан, имя файла формируется вызовом [`tempfile.mktemp()`](https://python-all.ru/3.9/library/tempfile.html#tempfile.mktemp) с суффиксом, соответствующим суффиксу последнего компонента пути входного URL. Если передан *reporthook*, это должна быть функция, принимающая три числовых параметра: номер чанка, максимальный размер читаемых чанков и общий размер загрузки (-1, если неизвестен). Она будет вызвана один раз в начале и после каждого чтения чанка данных из сети. Для локальных URL параметр *reporthook* игнорируется.861862Если *url* использует идентификатор схемы `http:`, можно указать необязательный аргумент *data* для задания `POST`-запроса (обычно тип запроса – `GET`). Аргумент *data* должен быть в стандартном формате *application/x-www-form-urlencoded*; см. функцию [`urllib.parse.urlencode()`](https://python-all.ru/3.9/library/urllib.parse.html#urllib.parse.urlencode).863864#### `version`865866Переменная, задающая пользовательский агент объекта opener. Чтобы [`urllib`](https://python-all.ru/3.9/library/urllib.html#module-urllib) сообщал серверам, что он является определённым пользовательским агентом, установите это значение в подклассе как переменную класса или в конструкторе перед вызовом конструктора базового класса.867868#### `class urllib.request.FancyURLopener(...)`869870Устарело с версии 3.3.871872[`FancyURLopener`](https://python-all.ru/3.9/library/urllib.request.html#urllib.request.FancyURLopener) является подклассом [`URLopener`](https://python-all.ru/3.9/library/urllib.request.html#urllib.request.URLopener), обеспечивающим стандартную обработку следующих HTTP-кодов ответа: 301, 302, 303, 307 и 401. Для перечисленных кодов 30x используется заголовок *Location* для получения фактического URL. Для кода 401 (требуется аутентификация) выполняется базовая HTTP-аутентификация. Для кодов 30x количество рекурсий ограничено значением атрибута *maxtries*, которое по умолчанию равно 10.873874Для всех остальных кодов ответа вызывается метод `http_error_default()`, который можно переопределить в подклассах для соответствующей обработки ошибки.875876> **Примечание**877>878> В соответствии с буквой [**RFC 2616**](https://python-all.ru/3.9/library/urllib.request.html), ответы 301 и 302 на POST-запросы не должны автоматически перенаправляться без подтверждения пользователем. На практике браузеры всё же допускают автоматическое перенаправление таких ответов, заменяя POST на GET, и [`urllib`](https://python-all.ru/3.9/library/urllib.html#module-urllib) воспроизводит это поведение.879880Параметры конструктора такие же, как для [`URLopener`](https://python-all.ru/3.9/library/urllib.request.html#urllib.request.URLopener).881882> **Примечание**883>884> При выполнении базовой аутентификации экземпляр [`FancyURLopener`](https://python-all.ru/3.9/library/urllib.request.html#urllib.request.FancyURLopener) вызывает свой метод [`prompt_user_passwd()`](https://python-all.ru/3.9/library/urllib.request.html#urllib.request.FancyURLopener.prompt_user_passwd). Реализация по умолчанию запрашивает у пользователя необходимую информацию на управляющем терминале. Подкласс может переопределить этот метод для обеспечения более подходящего поведения, если это необходимо.885886Класс [`FancyURLopener`](https://python-all.ru/3.9/library/urllib.request.html#urllib.request.FancyURLopener) предоставляет один дополнительный метод, который следует перегрузить для обеспечения соответствующего поведения:887888#### `prompt_user_passwd(host, realm)`889890Возвращает информацию, необходимую для аутентификации пользователя на указанном хосте в заданной области безопасности. Возвращаемое значение должно быть кортежем `(user, password)`, который можно использовать для базовой аутентификации.891892Реализация запрашивает эту информацию на терминале; приложение должно переопределить этот метод, чтобы использовать подходящую модель взаимодействия в локальной среде.893894## Ограничения [`urllib.request`](https://python-all.ru/3.9/library/urllib.request.html#module-urllib.request)895896>897898- В настоящее время поддерживаются только следующие протоколы: HTTP (версии 0.9 и 1.0), FTP, локальные файлы и data-URL.899900 Изменено в версии 3.4: Добавлена поддержка data-URL.901- Функция кэширования [`urlretrieve()`](https://python-all.ru/3.9/library/urllib.request.html#urllib.request.urlretrieve) отключена, пока не будет реализована правильная обработка заголовков Expiration time.902- Должна быть функция для проверки, находится ли определённый URL в кэше.903- Для обратной совместимости, если URL указывает на локальный файл, но файл не удаётся открыть, URL интерпретируется заново с использованием протокола FTP. Это иногда может приводить к запутанным сообщениям об ошибках.904- Функции [`urlopen()`](https://python-all.ru/3.9/library/urllib.request.html#urllib.request.urlopen) и [`urlretrieve()`](https://python-all.ru/3.9/library/urllib.request.html#urllib.request.urlretrieve) могут вызывать произвольно длинные задержки при ожидании установки сетевого соединения. Это означает, что с помощью этих функций сложно построить интерактивный веб-клиент без использования потоков.905- Данные, возвращаемые [`urlopen()`](https://python-all.ru/3.9/library/urllib.request.html#urllib.request.urlopen) или [`urlretrieve()`](https://python-all.ru/3.9/library/urllib.request.html#urllib.request.urlretrieve), представляют собой необработанные данные, возвращённые сервером. Это могут быть бинарные данные (например, изображение), обычный текст или, к примеру, HTML. Протокол HTTP передаёт информацию о типе в заголовке ответа, который можно проверить, взглянув на заголовок *Content-Type*. Если возвращённые данные являются HTML, можно использовать модуль [`html.parser`](https://python-all.ru/3.9/library/html.parser.html#module-html.parser) для его разбора.906- Код, обрабатывающий протокол FTP, не может различить файл и каталог. Это может привести к неожиданному поведению при попытке чтения URL, указывающего на недоступный файл. Если URL заканчивается на `/`, предполагается, что он ссылается на каталог, и будет обработан соответствующим образом. Но если попытка чтения файла приводит к ошибке 550 (означает, что URL не найден или недоступен, часто из-за прав доступа), то путь рассматривается как каталог, чтобы обработать случай, когда каталог указан URL, но завершающий `/` опущен. Это может привести к вводящим в заблуждение результатам при попытке получить файл, права на чтение которого делают его недоступным; FTP-код попытается прочитать его, завершится ошибкой 550, а затем выполнит вывод списка каталога для этого недоступного файла. Если требуется тонкий контроль, стоит рассмотреть использование модуля [`ftplib`](https://python-all.ru/3.9/library/ftplib.html#module-ftplib), создание подкласса [`FancyURLopener`](https://python-all.ru/3.9/library/urllib.request.html#urllib.request.FancyURLopener) или изменение *\_urlopener* в соответствии со своими потребностями.907908# [`urllib.response`](https://python-all.ru/3.9/library/urllib.request.html#module-urllib.response) – Классы ответов, используемые urllib909910Модуль [`urllib.response`](https://python-all.ru/3.9/library/urllib.request.html#module-urllib.response) определяет функции и классы, которые предоставляют минимальный файлоподобный интерфейс, включая `read()` и `readline()`. Функции, определённые в этом модуле, используются внутри модуля [`urllib.request`](https://python-all.ru/3.9/library/urllib.request.html#module-urllib.request). Типичный объект ответа – экземпляр [`urllib.response.addinfourl`](https://python-all.ru/3.9/library/urllib.request.html#urllib.response.addinfourl):911912#### `class urllib.response.addinfourl`913914#### `url`915916URL полученного ресурса, обычно используется для определения, был ли выполнен редирект.917918#### `headers`919920Возвращает заголовки ответа в виде экземпляра [`EmailMessage`](https://python-all.ru/3.9/library/email.message.html#email.message.EmailMessage).921922#### `status`923924Новое в версии 3.9.925926Код состояния, возвращаемый сервером.927928#### `geturl()`929930Устарело с версии 3.9: Устарело в пользу [`url`](https://python-all.ru/3.9/library/urllib.request.html#urllib.response.addinfourl.url).931932#### `info()`933934Устарело с версии 3.9: Устарело в пользу [`headers`](https://python-all.ru/3.9/library/urllib.request.html#urllib.response.addinfourl.headers).935936#### `code`937938Устарело с версии 3.9: Устарело в пользу [`status`](https://python-all.ru/3.9/library/urllib.request.html#urllib.response.addinfourl.status).939940#### `getstatus()`941942Устарело с версии 3.9: Устарело в пользу [`status`](https://python-all.ru/3.9/library/urllib.request.html#urllib.response.addinfourl.status).943