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

urllib2.md

628 строк · 59.3 КБ · обычная страница · сырой текст · скачать

1> **Источник:** https://python-all.ru/2.7/library/urllib2.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 20.6. [`urllib2`](https://python-all.ru/2.7/library/urllib2.html#module-urllib2) – расширяемая библиотека для открытия URL-адресов89> **Примечание**10>11> Модуль [`urllib2`](https://python-all.ru/2.7/library/urllib2.html#module-urllib2) был разделён на несколько модулей в Python 3 с именами `urllib.request` и `urllib.error`. Инструмент [2to3](https://python-all.ru/2.7/glossary.html#term-2to3) автоматически адаптирует импорты при преобразовании исходного кода в Python 3.1213Модуль [`urllib2`](https://python-all.ru/2.7/library/urllib2.html#module-urllib2) определяет функции и классы, которые помогают открывать URL-адреса (в основном HTTP) в сложных условиях – базовая и дайджест-аутентификация, перенаправления, куки и другое.1415> **См. также**16>17> Для высокоуровневого интерфейса HTTP-клиента рекомендуется [пакет Requests](https://python-all.ru/2.7/library/urllib2.html).1819Модуль [`urllib2`](https://python-all.ru/2.7/library/urllib2.html#module-urllib2) определяет следующие функции:2021#### `urllib2.urlopen(url[, data[, timeout[, cafile[, capath[, cadefault[, context]]]]])`2223Открывает URL *url*, который может быть либо строкой, либо объектом [`Request`](https://python-all.ru/2.7/library/urllib2.html#urllib2.Request).2425*data* может быть строкой, задающей дополнительные данные для отправки на сервер, или `None`, если такие данные не нужны. В настоящее время только HTTP-запросы используют *data*; HTTP-запрос будет POST вместо GET, когда указан параметр *data*. *data* должен быть буфером в стандартном формате *application/x-www-form-urlencoded*. Функция [`urllib.urlencode()`](https://python-all.ru/2.7/library/urllib.html#urllib.urlencode) принимает отображение или последовательность пар и возвращает строку в этом формате. Модуль urllib2 отправляет HTTP/1.1-запросы с заголовком `Connection:close`.2627Необязательный параметр *timeout* задаёт тайм-аут в секундах для блокирующих операций, таких как попытка соединения (если не указан, используется глобальная настройка тайм-аута по умолчанию). Фактически это работает только для HTTP, HTTPS и FTP-соединений.2829Если указан *context*, он должен быть экземпляром [`ssl.SSLContext`](https://python-all.ru/2.7/library/ssl.html#ssl.SSLContext), описывающим различные параметры SSL. Подробнее см. [`HTTPSConnection`](https://python-all.ru/2.7/library/httplib.html#httplib.HTTPSConnection).3031Необязательные параметры *cafile* и *capath* задают набор доверенных сертификатов ЦС для HTTPS-запросов. *cafile* должен указывать на один файл, содержащий набор сертификатов ЦС, тогда как *capath* должен указывать на каталог хешированных файлов сертификатов. Дополнительную информацию можно найти в [`ssl.SSLContext.load_verify_locations()`](https://python-all.ru/2.7/library/ssl.html#ssl.SSLContext.load_verify_locations).3233Параметр *cadefault* игнорируется.3435Эта функция возвращает файлоподобный объект с тремя дополнительными методами:3637- `geturl()` – возвращает URL полученного ресурса, обычно используется для определения, было ли выполнено перенаправление38- `info()` – возвращает метаинформацию страницы, такую как заголовки, в виде экземпляра [`mimetools.Message`](https://python-all.ru/2.7/library/mimetools.html#mimetools.Message) (см. [Краткий справочник по HTTP-заголовкам](https://python-all.ru/2.7/library/urllib2.html))39- `getcode()` – возвращает код состояния HTTP ответа.4041Вызывает [`URLError`](https://python-all.ru/2.7/library/urllib2.html#urllib2.URLError) при ошибках.4243Обратите внимание, что `None` может быть возвращён, если ни один обработчик не обработал запрос (хотя установленный по умолчанию глобальный [`OpenerDirector`](https://python-all.ru/2.7/library/urllib2.html#urllib2.OpenerDirector) использует [`UnknownHandler`](https://python-all.ru/2.7/library/urllib2.html#urllib2.UnknownHandler), чтобы этого не произошло).4445Кроме того, если обнаружены настройки прокси (например, когда установлена переменная окружения `*_proxy` такая, как `http_proxy`), [`ProxyHandler`](https://python-all.ru/2.7/library/urllib2.html#urllib2.ProxyHandler) устанавливается по умолчанию и обрабатывает запросы через прокси.4647Изменено в версии 2.6: добавлен параметр *timeout*.4849Изменено в версии 2.7.9: добавлены *cafile*, *capath*, *cadefault* и *context*.5051#### `urllib2.install_opener(opener)`5253Устанавливает экземпляр [`OpenerDirector`](https://python-all.ru/2.7/library/urllib2.html#urllib2.OpenerDirector) в качестве глобального открывателя по умолчанию. Установка открывателя необходима только в том случае, если требуется, чтобы urlopen использовал этот открыватель; в противном случае просто вызывайте [`OpenerDirector.open()`](https://python-all.ru/2.7/library/urllib2.html#urllib2.OpenerDirector.open) вместо [`urlopen()`](https://python-all.ru/2.7/library/urllib2.html#urllib2.urlopen). Код не проверяет наличие настоящего [`OpenerDirector`](https://python-all.ru/2.7/library/urllib2.html#urllib2.OpenerDirector); подойдёт любой класс с соответствующим интерфейсом.5455#### `urllib2.build_opener([handler, ...])`5657Возвращает экземпляр [`OpenerDirector`](https://python-all.ru/2.7/library/urllib2.html#urllib2.OpenerDirector), который объединяет обработчики в заданном порядке. *handler*ы могут быть как экземплярами [`BaseHandler`](https://python-all.ru/2.7/library/urllib2.html#urllib2.BaseHandler), так и подклассами [`BaseHandler`](https://python-all.ru/2.7/library/urllib2.html#urllib2.BaseHandler) (в этом случае должен быть возможен вызов конструктора без параметров). Экземпляры следующих классов будут располагаться перед обработчиками *handler*, если только *handler*ы не содержат их, их экземпляры или подклассы: [`ProxyHandler`](https://python-all.ru/2.7/library/urllib2.html#urllib2.ProxyHandler) (если обнаружены настройки прокси), [`UnknownHandler`](https://python-all.ru/2.7/library/urllib2.html#urllib2.UnknownHandler), [`HTTPHandler`](https://python-all.ru/2.7/library/urllib2.html#urllib2.HTTPHandler), [`HTTPDefaultErrorHandler`](https://python-all.ru/2.7/library/urllib2.html#urllib2.HTTPDefaultErrorHandler), [`HTTPRedirectHandler`](https://python-all.ru/2.7/library/urllib2.html#urllib2.HTTPRedirectHandler), [`FTPHandler`](https://python-all.ru/2.7/library/urllib2.html#urllib2.FTPHandler), [`FileHandler`](https://python-all.ru/2.7/library/urllib2.html#urllib2.FileHandler), [`HTTPErrorProcessor`](https://python-all.ru/2.7/library/urllib2.html#urllib2.HTTPErrorProcessor).5859Если установка Python поддерживает SSL (т.е. если модуль [`ssl`](https://python-all.ru/2.7/library/ssl.html#module-ssl) может быть импортирован), [`HTTPSHandler`](https://python-all.ru/2.7/library/urllib2.html#urllib2.HTTPSHandler) также будет добавлен.6061Начиная с Python 2.3, подкласс [`BaseHandler`](https://python-all.ru/2.7/library/urllib2.html#urllib2.BaseHandler) может также изменять свой атрибут `handler_order`, чтобы изменить свою позицию в списке обработчиков.6263При необходимости генерируются следующие исключения:6465#### `exception urllib2.URLError`6667Обработчики вызывают это исключение (или производные от него) при возникновении проблемы. Оно является подклассом [`IOError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.IOError).6869#### `reason`7071Причина этой ошибки. Это может быть строка сообщения или другой экземпляр исключения ([`socket.error`](https://python-all.ru/2.7/library/socket.html#socket.error) для удалённых URL, [`OSError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.OSError) для локальных URL).7273#### `exception urllib2.HTTPError`7475Хотя [`HTTPError`](https://python-all.ru/2.7/library/urllib2.html#urllib2.HTTPError) является исключением (подклассом [`URLError`](https://python-all.ru/2.7/library/urllib2.html#urllib2.URLError)), он также может работать как неисключительное файлоподобное возвращаемое значение (то же самое, что возвращает [`urlopen()`](https://python-all.ru/2.7/library/urllib2.html#urllib2.urlopen)). Это полезно при обработке необычных HTTP-ошибок, таких как запросы аутентификации.7677#### `code`7879Код состояния HTTP, как определено в [RFC 2616](https://python-all.ru/2.7/library/urllib2.html). Это числовое значение соответствует значению из словаря кодов, как указано в [`BaseHTTPServer.BaseHTTPRequestHandler.responses`](https://python-all.ru/2.7/library/basehttpserver.html#BaseHTTPServer.BaseHTTPRequestHandler.responses).8081#### `reason`8283Причина этой ошибки. Это может быть строка сообщения или другой экземпляр исключения.8485Предоставляются следующие классы:8687#### `class urllib2.Request(url[, data][, headers][, origin_req_host][, unverifiable])`8889Этот класс представляет абстракцию URL-запроса.9091*url* должен быть строкой, содержащей корректный URL.9293*data* может быть строкой, задающей дополнительные данные для отправки на сервер, или `None`, если такие данные не нужны. В настоящее время только HTTP-запросы используют *data*; HTTP-запрос будет POST вместо GET, когда указан параметр *data*. *data* должен быть буфером в стандартном формате *application/x-www-form-urlencoded*. Функция [`urllib.urlencode()`](https://python-all.ru/2.7/library/urllib.html#urllib.urlencode) принимает отображение или последовательность пар и возвращает строку в этом формате.9495*headers* должен быть словарём и будет обрабатываться так, как если бы [`add_header()`](https://python-all.ru/2.7/library/urllib2.html#urllib2.Request.add_header) был вызван с каждым ключом и значением в качестве аргументов. Это часто используется для «подделки» значения заголовка `User-Agent`, который используется браузером для идентификации себя – некоторые HTTP-серверы разрешают запросы только от распространённых браузеров, а не от скриптов. Например, Mozilla Firefox может идентифицировать себя как `"Mozilla/5.0 (X11; U; Linux i686) Gecko/20071127 Firefox/2.0.0.11"`, в то время как строка агента пользователя по умолчанию для [`urllib2`](https://python-all.ru/2.7/library/urllib2.html#module-urllib2) – `"Python-urllib/2.6"` (в Python 2.6).9697Последние два аргумента представляют интерес только для корректной обработки сторонних HTTP-куки:9899*origin\_req\_host* должен быть хостом запроса исходной транзакции, как определено в [**RFC 2965**](https://python-all.ru/2.7/library/urllib2.html). По умолчанию он равен `cookielib.request_host(self)`. Это имя хоста или IP-адрес исходного запроса, инициированного пользователем. Например, если запрос делается для изображения в HTML-документе, это должен быть хост запроса страницы, содержащей изображение.100101*unverifiable* должен указывать, является ли запрос непроверяемым, как это определено в RFC 2965. По умолчанию он равен `False`. Непроверяемый запрос – это запрос, URL которого пользователь не имел возможности одобрить. Например, если запрос выполняется для изображения в HTML-документе и пользователь не имел возможности одобрить автоматическую загрузку этого изображения, параметр должен быть истинным.102103#### `class urllib2.OpenerDirector`104105Класс [`OpenerDirector`](https://python-all.ru/2.7/library/urllib2.html#urllib2.OpenerDirector) открывает URL-адреса через цепочку [`BaseHandler`](https://python-all.ru/2.7/library/urllib2.html#urllib2.BaseHandler). Он управляет объединением обработчиков в цепочку и восстановлением после ошибок.106107#### `class urllib2.BaseHandler`108109Это базовый класс для всех зарегистрированных обработчиков – он отвечает только за простую механику регистрации.110111#### `class urllib2.HTTPDefaultErrorHandler`112113Класс, определяющий обработчик по умолчанию для HTTP-ответов с ошибками; все ответы преобразуются в исключения [`HTTPError`](https://python-all.ru/2.7/library/urllib2.html#urllib2.HTTPError).114115#### `class urllib2.HTTPRedirectHandler`116117Класс для обработки перенаправлений.118119#### `class urllib2.HTTPCookieProcessor([cookiejar])`120121Класс для обработки HTTP-куки.122123#### `class urllib2.ProxyHandler([proxies])`124125Заставляет запросы проходить через прокси. Если указан *proxies*, он должен быть словарём, сопоставляющим имена протоколов с URL-адресами прокси. По умолчанию список прокси читается из переменных окружения `<protocol>_proxy`. Если переменные окружения для прокси не заданы, то в среде Windows настройки прокси берутся из раздела Internet Settings реестра, а в среде Mac OS X информация о прокси получается из фреймворка OS X System Configuration.126127Чтобы отключить автоматически обнаруженный прокси, передайте пустой словарь.128129> > **Примечание**130> >131> > `HTTP_PROXY` будет игнорироваться, если задана переменная `REQUEST_METHOD`; см. документацию по [`getproxies()`](https://python-all.ru/2.7/library/urllib.html#urllib.getproxies).132133#### `class urllib2.HTTPPasswordMgr`134135Хранит базу данных соответствий `(realm, uri) -> (user, password)`.136137#### `class urllib2.HTTPPasswordMgrWithDefaultRealm`138139Хранит базу данных соответствий `(realm, uri) -> (user, password)`. Область (realm) `None` считается универсальной областью, которая используется, если не подходит ни одна другая.140141#### `class urllib2.AbstractBasicAuthHandler([password_mgr])`142143Это миксин-класс, который помогает с HTTP-аутентификацией как на удалённом хосте, так и через прокси. Если передан *password\_mgr*, он должен быть совместимым с [`HTTPPasswordMgr`](https://python-all.ru/2.7/library/urllib2.html#urllib2.HTTPPasswordMgr); обратитесь к разделу [HTTPPasswordMgr Objects](https://python-all.ru/2.7/library/urllib2.html#http-password-mgr) для получения информации об интерфейсе, который необходимо поддерживать.144145#### `class urllib2.HTTPBasicAuthHandler([password_mgr])`146147Обрабатывает аутентификацию на удалённом хосте. *password\_mgr*, если передан, должен быть совместим с [`HTTPPasswordMgr`](https://python-all.ru/2.7/library/urllib2.html#urllib2.HTTPPasswordMgr); за информацией об интерфейсе, который должен поддерживаться, обратитесь к разделу [HTTPPasswordMgr Objects](https://python-all.ru/2.7/library/urllib2.html#http-password-mgr).148149#### `class urllib2.ProxyBasicAuthHandler([password_mgr])`150151Управляет аутентификацией с прокси. *password\_mgr*, если указан, должен быть совместим с [`HTTPPasswordMgr`](https://python-all.ru/2.7/library/urllib2.html#urllib2.HTTPPasswordMgr); обращайтесь к разделу [HTTPPasswordMgr Objects](https://python-all.ru/2.7/library/urllib2.html#http-password-mgr) за информацией об интерфейсе, который должен поддерживаться.152153#### `class urllib2.AbstractDigestAuthHandler([password_mgr])`154155Это миксин-класс, который помогает с HTTP-аутентификацией как на удалённом хосте, так и через прокси. Если передан *password\_mgr*, он должен быть совместимым с [`HTTPPasswordMgr`](https://python-all.ru/2.7/library/urllib2.html#urllib2.HTTPPasswordMgr); обратитесь к разделу [HTTPPasswordMgr Objects](https://python-all.ru/2.7/library/urllib2.html#http-password-mgr) для получения информации об интерфейсе, который необходимо поддерживать.156157#### `class urllib2.HTTPDigestAuthHandler([password_mgr])`158159Обрабатывает аутентификацию на удалённом хосте. *password\_mgr*, если передан, должен быть совместим с [`HTTPPasswordMgr`](https://python-all.ru/2.7/library/urllib2.html#urllib2.HTTPPasswordMgr); за информацией об интерфейсе, который должен поддерживаться, обратитесь к разделу [HTTPPasswordMgr Objects](https://python-all.ru/2.7/library/urllib2.html#http-password-mgr).160161#### `class urllib2.ProxyDigestAuthHandler([password_mgr])`162163Управляет аутентификацией с прокси. *password\_mgr*, если указан, должен быть совместим с [`HTTPPasswordMgr`](https://python-all.ru/2.7/library/urllib2.html#urllib2.HTTPPasswordMgr); обращайтесь к разделу [HTTPPasswordMgr Objects](https://python-all.ru/2.7/library/urllib2.html#http-password-mgr) за информацией об интерфейсе, который должен поддерживаться.164165#### `class urllib2.HTTPHandler`166167Класс для открытия HTTP-URL.168169#### `class urllib2.HTTPSHandler([debuglevel[, context]])`170171Класс для открытия HTTPS-URL. *context* имеет то же значение, что и в [`httplib.HTTPSConnection`](https://python-all.ru/2.7/library/httplib.html#httplib.HTTPSConnection).172173Изменено в версии 2.7.9: добавлен *context*.174175#### `class urllib2.FileHandler`176177Открывает локальные файлы.178179#### `class urllib2.FTPHandler`180181Открывает FTP-URL.182183#### `class urllib2.CacheFTPHandler`184185Открывает FTP-URL, сохраняя кеш открытых FTP-соединений для минимизации задержек.186187#### `class urllib2.UnknownHandler`188189Универсальный класс для обработки неизвестных URL.190191#### `class urllib2.HTTPErrorProcessor`192193Обрабатывает ошибочные HTTP-ответы.194195## 20.6.1. Объекты Request196197Следующие методы описывают весь открытый интерфейс [`Request`](https://python-all.ru/2.7/library/urllib2.html#urllib2.Request), и поэтому все они должны быть переопределены в подклассах.198199#### `Request.add_data(data)`200201Устанавливает данные [`Request`](https://python-all.ru/2.7/library/urllib2.html#urllib2.Request) в *data*. Этот параметр игнорируется всеми обработчиками, кроме HTTP-обработчиков, – там он должен быть байтовой строкой и изменит запрос на `POST` вместо `GET`.202203#### `Request.get_method()`204205Возвращает строку, указывающую метод HTTP-запроса. Это имеет смысл только для HTTP-запросов и в настоящее время всегда возвращает `'GET'` или `'POST'`.206207#### `Request.has_data()`208209Возвращает, есть ли у экземпляра данные, отличные от `None`.210211#### `Request.get_data()`212213Возвращает данные экземпляра.214215#### `Request.add_header(key, val)`216217Добавляет ещё один заголовок к запросу. В настоящее время заголовки игнорируются всеми обработчиками, кроме HTTP-обработчиков, где они добавляются в список заголовков, отправляемых серверу. Обратите внимание, что не может быть более одного заголовка с одним и тем же именем, и последующие вызовы перезапишут предыдущие в случае совпадения *ключа*. В настоящее время это не приводит к потере функциональности HTTP, поскольку все заголовки, имеющие смысл при многократном использовании, имеют (специфичный для заголовка) способ достижения той же функциональности с помощью только одного заголовка.218219#### `Request.add_unredirected_header(key, header)`220221Добавляет заголовок, который не будет добавлен в перенаправленный запрос.222223Новое в версии 2.4.224225#### `Request.has_header(header)`226227Возвращает, имеет ли экземпляр указанный заголовок (проверяет как обычные, так и неперенаправленные).228229Новое в версии 2.4.230231#### `Request.get_full_url()`232233Возвращает URL, переданный в конструктор.234235#### `Request.get_type()`236237Возвращает тип URL – также известный как схема.238239#### `Request.get_host()`240241Возвращает хост, к которому будет установлено соединение.242243#### `Request.get_selector()`244245Возвращает селектор – часть URL, которая отправляется серверу.246247#### `Request.get_header(header_name, default=None)`248249Возвращает значение указанного заголовка. Если заголовок отсутствует, возвращает значение по умолчанию.250251#### `Request.header_items()`252253Возвращает список кортежей (имя\_заголовка, значение\_заголовка) заголовков запроса.254255#### `Request.set_proxy(host, type)`256257Подготавливает запрос, подключаясь к прокси-серверу. *host* и *type* заменят соответствующие значения экземпляра, а selector экземпляра будет содержать исходный URL, переданный в конструктор.258259#### `Request.get_origin_req_host()`260261Возвращает хост запроса исходной транзакции, как определено в [**RFC 2965**](https://python-all.ru/2.7/library/urllib2.html). См. документацию конструктора [`Request`](https://python-all.ru/2.7/library/urllib2.html#urllib2.Request).262263#### `Request.is_unverifiable()`264265Возвращает, является ли запрос непроверяемым, как определено в RFC 2965. См. документацию конструктора [`Request`](https://python-all.ru/2.7/library/urllib2.html#urllib2.Request).266267## 20.6.2. Объекты OpenerDirector268269Экземпляры [`OpenerDirector`](https://python-all.ru/2.7/library/urllib2.html#urllib2.OpenerDirector) имеют следующие методы:270271#### `OpenerDirector.add_handler(handler)`272273*Обработчик* должен быть экземпляром [`BaseHandler`](https://python-all.ru/2.7/library/urllib2.html#urllib2.BaseHandler). Выполняется поиск следующих методов, и они добавляются в возможные цепочки (обратите внимание, что HTTP-ошибки являются особым случаем).274275- `protocol_open` – сигнализирует, что обработчик умеет открывать URL протокола *протокол*.276- `http_error_type` – сигнализирует, что обработчик умеет обрабатывать HTTP-ошибки с кодом HTTP *type*.277- `protocol_error` – сигнализирует, что обработчик умеет обрабатывать ошибки от *протокол* (кроме `http`).278- `protocol_request` – сигнализирует, что обработчик умеет предварительно обрабатывать запросы *протокол*.279- `protocol_response` – сигнал о том, что обработчик умеет постобрабатывать ответы *протокол*.280281#### `OpenerDirector.open(url[, data][, timeout])`282283Открывает указанный *url* (может быть объектом запроса или строкой), опционально передавая указанные *data*. Аргументы, возвращаемые значения и исключения такие же, как у [`urlopen()`](https://python-all.ru/2.7/library/urllib2.html#urllib2.urlopen) (которая просто вызывает метод [`open()`](https://python-all.ru/2.7/library/functions.html#open) на текущем установленном глобальном [`OpenerDirector`](https://python-all.ru/2.7/library/urllib2.html#urllib2.OpenerDirector)). Необязательный параметр *timeout* задаёт тайм-аут в секундах для блокирующих операций, таких как попытка соединения (если не указан, будет использоваться глобальная настройка тайм-аута по умолчанию). Функция тайм-аута фактически работает только для соединений HTTP, HTTPS и FTP.284285Изменено в версии 2.6: добавлен параметр *timeout*.286287#### `OpenerDirector.error(proto, argarg, [...]])`288289Обрабатывает ошибку указанного протокола. Вызывает зарегистрированные обработчики ошибок для данного протокола с указанными аргументами (зависящими от протокола). Протокол HTTP является особым случаем: для определения конкретного обработчика ошибок используется код ответа HTTP; обратитесь к методам `http_error_*()` классов обработчиков.290291Возвращаемые значения и вызываемые исключения такие же, как у [`urlopen()`](https://python-all.ru/2.7/library/urllib2.html#urllib2.urlopen).292293Объекты OpenerDirector открывают URL в три этапа:294295Порядок вызова этих методов в каждом этапе определяется сортировкой экземпляров обработчиков.2962971. Каждый обработчик, имеющий метод с именем `protocol_request`, вызывает этот метод для предварительной обработки запроса.2982. Обработчики с методом с именем вида `protocol_open` вызываются для обработки запроса. Этот этап завершается, когда обработчик возвращает не-[`None`](https://python-all.ru/2.7/library/constants.html#None) значение (т.е. ответ) или возбуждает исключение (обычно [`URLError`](https://python-all.ru/2.7/library/urllib2.html#urllib2.URLError)). Исключения могут распространяться.299300   На самом деле, описанный выше алгоритм сначала применяется к методам с именем `default_open()`. Если все такие методы возвращают [`None`](https://python-all.ru/2.7/library/constants.html#None), алгоритм повторяется для методов с именем вида `protocol_open`. Если все такие методы возвращают [`None`](https://python-all.ru/2.7/library/constants.html#None), алгоритм повторяется для методов с именем `unknown_open()`.301302   Обратите внимание, что реализация этих методов может включать вызовы методов [`open()`](https://python-all.ru/2.7/library/urllib2.html#urllib2.OpenerDirector.open) и [`error()`](https://python-all.ru/2.7/library/urllib2.html#urllib2.OpenerDirector.error) родительского экземпляра [`OpenerDirector`](https://python-all.ru/2.7/library/urllib2.html#urllib2.OpenerDirector).3033. Каждый обработчик, имеющий метод с именем `protocol_response`, вызывает этот метод для постобработки ответа.304305## 20.6.3. Объекты BaseHandler306307Объекты [`BaseHandler`](https://python-all.ru/2.7/library/urllib2.html#urllib2.BaseHandler) предоставляют несколько методов, которые непосредственно полезны, а также другие методы, предназначенные для использования производными классами. Они предназначены для прямого использования:308309#### `BaseHandler.add_parent(director)`310311Добавляет директор в качестве родителя.312313#### `BaseHandler.close()`314315Удаляет всех родителей.316317Следующие атрибуты и методы должны использоваться только классами, унаследованными от [`BaseHandler`](https://python-all.ru/2.7/library/urllib2.html#urllib2.BaseHandler).318319> **Примечание**320>321> Принято соглашение, что подклассы, определяющие методы `protocol_request()` или `protocol_response()`, называются `*Processor`; все остальные называются `*Handler`.322323#### `BaseHandler.parent`324325Действительный [`OpenerDirector`](https://python-all.ru/2.7/library/urllib2.html#urllib2.OpenerDirector), который можно использовать для открытия через другой протокол или для обработки ошибок.326327#### `BaseHandler.default_open(req)`328329Этот метод *не* определён в [`BaseHandler`](https://python-all.ru/2.7/library/urllib2.html#urllib2.BaseHandler), но подклассы должны определить его, если хотят перехватывать все URL.330331Этот метод, если он реализован, будет вызван родительским [`OpenerDirector`](https://python-all.ru/2.7/library/urllib2.html#urllib2.OpenerDirector). Он должен возвращать файлоподобный объект, как описано в возвращаемом значении [`open()`](https://python-all.ru/2.7/library/functions.html#open) из [`OpenerDirector`](https://python-all.ru/2.7/library/urllib2.html#urllib2.OpenerDirector), или `None`. Он должен возбуждать [`URLError`](https://python-all.ru/2.7/library/urllib2.html#urllib2.URLError), если только не произошло действительно исключительной ситуации (например, [`MemoryError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.MemoryError) не должно преобразовываться в [`URLError`](https://python-all.ru/2.7/library/urllib2.html#urllib2.URLError)).332333Этот метод будет вызван перед любым методом открытия, специфичным для протокола.334335#### `BaseHandler.protocol_open(req)`336337(«протокол» следует заменить на имя протокола.)338339Этот метод *не* определён в [`BaseHandler`](https://python-all.ru/2.7/library/urllib2.html#urllib2.BaseHandler), но подклассы должны определить его, если они хотят обрабатывать URL-адреса с указанным *протоколом*.340341Если этот метод определён, он будет вызван родительским [`OpenerDirector`](https://python-all.ru/2.7/library/urllib2.html#urllib2.OpenerDirector). Возвращаемые значения должны быть такими же, как для [`default_open()`](https://python-all.ru/2.7/library/urllib2.html#urllib2.BaseHandler.default_open).342343#### `BaseHandler.unknown_open(req)`344345Этот метод *не* определён в [`BaseHandler`](https://python-all.ru/2.7/library/urllib2.html#urllib2.BaseHandler), но подклассы должны определить его, если хотят перехватывать все URL, для которых нет зарегистрированного обработчика для открытия.346347Если этот метод реализован, он будет вызван [`parent`](https://python-all.ru/2.7/library/urllib2.html#urllib2.BaseHandler.parent) [`OpenerDirector`](https://python-all.ru/2.7/library/urllib2.html#urllib2.OpenerDirector). Возвращаемые значения должны быть такими же, как для [`default_open()`](https://python-all.ru/2.7/library/urllib2.html#urllib2.BaseHandler.default_open).348349#### `BaseHandler.http_error_default(req, fp, code, msg, hdrs)`350351Этот метод *не* определён в [`BaseHandler`](https://python-all.ru/2.7/library/urllib2.html#urllib2.BaseHandler), но подклассы должны переопределить его, если они намерены обеспечить всеобъемлющую обработку для иначе необработанных HTTP-ошибок. Он будет автоматически вызван [`OpenerDirector`](https://python-all.ru/2.7/library/urllib2.html#urllib2.OpenerDirector) при получении ошибки и обычно не должен вызываться в других обстоятельствах.352353*req* будет объектом [`Request`](https://python-all.ru/2.7/library/urllib2.html#urllib2.Request), *fp* будет файлоподобным объектом с телом HTTP-ошибки, *code* будет трёхзначным кодом ошибки, *msg* будет видимым пользователю пояснением кода, а *hdrs* будет объектом отображения, содержащим заголовки ошибки.354355Возвращаемые значения и вызываемые исключения должны быть такими же, как у [`urlopen()`](https://python-all.ru/2.7/library/urllib2.html#urllib2.urlopen).356357#### `BaseHandler.http_error_nnn(req, fp, code, msg, hdrs)`358359*nnn* должен быть трёхзначным HTTP-кодом ошибки. Этот метод также не определён в [`BaseHandler`](https://python-all.ru/2.7/library/urllib2.html#urllib2.BaseHandler), но будет вызван, если он существует, на экземпляре подкласса, когда возникает HTTP-ошибка с кодом *nnn*.360361Подклассы должны переопределить этот метод для обработки конкретных HTTP-ошибок.362363Аргументы, возвращаемые значения и вызываемые исключения должны быть такими же, как для [`http_error_default()`](https://python-all.ru/2.7/library/urllib2.html#urllib2.BaseHandler.http_error_default).364365#### `BaseHandler.protocol_request(req)`366367(«протокол» следует заменить на имя протокола.)368369Этот метод *не* определён в [`BaseHandler`](https://python-all.ru/2.7/library/urllib2.html#urllib2.BaseHandler), но подклассы должны определить его, если они хотят предварительно обрабатывать запросы указанного *протокола*.370371Если этот метод определён, он будет вызван родительским [`OpenerDirector`](https://python-all.ru/2.7/library/urllib2.html#urllib2.OpenerDirector). *req* будет объектом [`Request`](https://python-all.ru/2.7/library/urllib2.html#urllib2.Request). Возвращаемое значение должно быть объектом [`Request`](https://python-all.ru/2.7/library/urllib2.html#urllib2.Request).372373#### `BaseHandler.protocol_response(req, response)`374375(«протокол» следует заменить на имя протокола.)376377Этот метод *не* определён в [`BaseHandler`](https://python-all.ru/2.7/library/urllib2.html#urllib2.BaseHandler), но подклассы должны определить его, если они хотят выполнять постобработку ответов указанного *протокола*.378379Этот метод, если он определён, будет вызван родительским [`OpenerDirector`](https://python-all.ru/2.7/library/urllib2.html#urllib2.OpenerDirector). *req* будет объектом [`Request`](https://python-all.ru/2.7/library/urllib2.html#urllib2.Request). *response* будет объектом, реализующим тот же интерфейс, что и возвращаемое значение [`urlopen()`](https://python-all.ru/2.7/library/urllib2.html#urllib2.urlopen). Возвращаемое значение должно реализовывать тот же интерфейс, что и возвращаемое значение [`urlopen()`](https://python-all.ru/2.7/library/urllib2.html#urllib2.urlopen).380381## 20.6.4. Объекты HTTPRedirectHandler382383> **Примечание**384>385> Некоторые HTTP-перенаправления требуют действий от клиентского кода этого модуля. Если это так, возбуждается [`HTTPError`](https://python-all.ru/2.7/library/urllib2.html#urllib2.HTTPError). См. [**RFC 2616**](https://python-all.ru/2.7/library/urllib2.html) для получения подробной информации о точном значении различных кодов перенаправления.386387#### `HTTPRedirectHandler.redirect_request(req, fp, code, msg, hdrs, newurl)`388389Возвращает [`Request`](https://python-all.ru/2.7/library/urllib2.html#urllib2.Request) или `None` в ответ на перенаправление. Этот метод вызывается реализациями по умолчанию методов `http_error_30*()`, когда от сервера получено перенаправление. Если перенаправление должно произойти, верните новый [`Request`](https://python-all.ru/2.7/library/urllib2.html#urllib2.Request), чтобы позволить `http_error_30*()` выполнить перенаправление на *newurl*. В противном случае возбудите [`HTTPError`](https://python-all.ru/2.7/library/urllib2.html#urllib2.HTTPError), если никакой другой обработчик не должен пытаться обработать этот URL, или верните `None`, если вы не можете, но другой обработчик может.390391> **Примечание**392>393> Реализация по умолчанию этого метода не следует строго [**RFC 2616**](https://python-all.ru/2.7/library/urllib2.html), который говорит, что ответы 301 и 302 на запросы `POST` не должны автоматически перенаправляться без подтверждения пользователем. В действительности браузеры разрешают автоматическое перенаправление таких ответов, меняя POST на `GET`, и реализация по умолчанию воспроизводит такое поведение.394395#### `HTTPRedirectHandler.http_error_301(req, fp, code, msg, hdrs)`396397Перенаправляет на URL `Location:` или `URI:`. Этот метод вызывается родительским [`OpenerDirector`](https://python-all.ru/2.7/library/urllib2.html#urllib2.OpenerDirector) при получении HTTP-ответа «Moved Permanently».398399#### `HTTPRedirectHandler.http_error_302(req, fp, code, msg, hdrs)`400401То же, что и [`http_error_301()`](https://python-all.ru/2.7/library/urllib2.html#urllib2.HTTPRedirectHandler.http_error_301), но вызывается для ответа «Found».402403#### `HTTPRedirectHandler.http_error_303(req, fp, code, msg, hdrs)`404405То же, что и [`http_error_301()`](https://python-all.ru/2.7/library/urllib2.html#urllib2.HTTPRedirectHandler.http_error_301), но вызывается для ответа «See Other».406407#### `HTTPRedirectHandler.http_error_307(req, fp, code, msg, hdrs)`408409То же, что и [`http_error_301()`](https://python-all.ru/2.7/library/urllib2.html#urllib2.HTTPRedirectHandler.http_error_301), но вызывается для ответа «временное перенаправление».410411## 20.6.5. Объекты HTTPCookieProcessor412413Новое в версии 2.4.414415Экземпляры [`HTTPCookieProcessor`](https://python-all.ru/2.7/library/urllib2.html#urllib2.HTTPCookieProcessor) имеют один атрибут:416417#### `HTTPCookieProcessor.cookiejar`418419[`cookielib.CookieJar`](https://python-all.ru/2.7/library/cookielib.html#cookielib.CookieJar), в котором хранятся куки.420421## 20.6.6. Объекты ProxyHandler422423#### `ProxyHandler.protocol_open(request)`424425(«протокол» следует заменить на имя протокола.)426427Объект [`ProxyHandler`](https://python-all.ru/2.7/library/urllib2.html#urllib2.ProxyHandler) будет иметь метод `protocol_open` для каждого *протокол*, для которого есть прокси в словаре *proxies*, переданном в конструктор. Метод будет изменять запросы для прохождения через прокси, вызывая `request.set_proxy()`, и вызывать следующий обработчик в цепочке для непосредственного выполнения протокола.428429## 20.6.7. Объекты HTTPPasswordMgr430431Эти методы доступны у объектов [`HTTPPasswordMgr`](https://python-all.ru/2.7/library/urllib2.html#urllib2.HTTPPasswordMgr) и [`HTTPPasswordMgrWithDefaultRealm`](https://python-all.ru/2.7/library/urllib2.html#urllib2.HTTPPasswordMgrWithDefaultRealm).432433#### `HTTPPasswordMgr.add_password(realm, uri, user, passwd)`434435*uri* может быть как одним URI, так и последовательностью URI. *realm*, *user* и *passwd* должны быть строками. В результате `(user, passwd)` будет использоваться в качестве токенов аутентификации, когда запрашивается аутентификация для *realm* и супер-URI любого из заданных URI.436437#### `HTTPPasswordMgr.find_user_password(realm, authuri)`438439Получает имя пользователя/пароль для заданных realm и URI, если они есть. Этот метод вернёт `(None, None)`, если нет соответствующей пары пользователь/пароль.440441Для объектов [`HTTPPasswordMgrWithDefaultRealm`](https://python-all.ru/2.7/library/urllib2.html#urllib2.HTTPPasswordMgrWithDefaultRealm) область `None` будет проверена, если заданная *realm* не имеет соответствующей пары пользователь/пароль.442443## 20.6.8. Объекты AbstractBasicAuthHandler444445#### `AbstractBasicAuthHandler.http_error_auth_reqed(authreq, host, req, headers)`446447Обрабатывает запрос аутентификации, получая пару пользователь/пароль и повторяя запрос. *authreq* должен быть именем заголовка, в котором содержится информация о realm в запросе, *host* указывает URL и путь для аутентификации, *req* должен быть (неудачным) объектом [`Request`](https://python-all.ru/2.7/library/urllib2.html#urllib2.Request), а *headers* – заголовками ошибки.448449*host* – это либо authority (например, `"python.org"`), либо URL, содержащий компонент authority (например, `"http://python.org/"`). В любом случае, authority не должен содержать компонент userinfo (поэтому `"python.org"` и `"python.org:80"` подходят, а `"joe:password@python.org"` – нет).450451## 20.6.9. Объекты HTTPBasicAuthHandler452453#### `HTTPBasicAuthHandler.http_error_401(req, fp, code, msg, hdrs)`454455Повторяет запрос с информацией аутентификации, если она доступна.456457## 20.6.10. Объекты ProxyBasicAuthHandler458459#### `ProxyBasicAuthHandler.http_error_407(req, fp, code, msg, hdrs)`460461Повторяет запрос с информацией аутентификации, если она доступна.462463## 20.6.11. Объекты AbstractDigestAuthHandler464465#### `AbstractDigestAuthHandler.http_error_auth_reqed(authreq, host, req, headers)`466467*authreq* должен быть именем заголовка, в котором содержится информация о realm в запросе, *host* должен быть хостом для аутентификации, *req* должен быть (неудачным) объектом [`Request`](https://python-all.ru/2.7/library/urllib2.html#urllib2.Request), а *headers* – заголовками ошибки.468469## 20.6.12. Объекты HTTPDigestAuthHandler470471#### `HTTPDigestAuthHandler.http_error_401(req, fp, code, msg, hdrs)`472473Повторяет запрос с информацией аутентификации, если она доступна.474475## 20.6.13. Объекты ProxyDigestAuthHandler476477#### `ProxyDigestAuthHandler.http_error_407(req, fp, code, msg, hdrs)`478479Повторяет запрос с информацией аутентификации, если она доступна.480481## 20.6.14. Объекты HTTPHandler482483#### `HTTPHandler.http_open(req)`484485Отправляет HTTP-запрос, который может быть GET или POST, в зависимости от `req.has_data()`.486487## 20.6.15. Объекты HTTPSHandler488489#### `HTTPSHandler.https_open(req)`490491Отправляет HTTPS-запрос, который может быть GET или POST, в зависимости от `req.has_data()`.492493## 20.6.16. Объекты FileHandler494495#### `FileHandler.file_open(req)`496497Если имя хоста не указано или имя хоста равно `'localhost'`, файл открывается локально. В противном случае протокол меняется на `ftp`, и открытие повторяется с помощью `parent`.498499## 20.6.17. Объекты FTPHandler500501#### `FTPHandler.ftp_open(req)`502503Открывает FTP-файл, указанный *req*. Вход всегда выполняется с пустыми именем пользователя и паролем.504505## 20.6.18. Объекты CacheFTPHandler506507Объекты [`CacheFTPHandler`](https://python-all.ru/2.7/library/urllib2.html#urllib2.CacheFTPHandler) являются объектами [`FTPHandler`](https://python-all.ru/2.7/library/urllib2.html#urllib2.FTPHandler) со следующими дополнительными методами:508509#### `CacheFTPHandler.setTimeout(t)`510511Устанавливает тайм-аут соединений равным *t* секунд.512513#### `CacheFTPHandler.setMaxConns(m)`514515Устанавливает максимальное количество кэшированных соединений равным *m*.516517## 20.6.19. Объекты UnknownHandler518519#### `UnknownHandler.unknown_open()`520521Вызывает исключение [`URLError`](https://python-all.ru/2.7/library/urllib2.html#urllib2.URLError).522523## 20.6.20. Объекты HTTPErrorProcessor524525Новое в версии 2.4.526527#### `HTTPErrorProcessor.http_response()`528529Обрабатывает ошибочные HTTP-ответы.530531Для кода 200 объект ответа возвращается немедленно.532533Для кодов ошибок, отличных от 200, задача просто передаётся методам-обработчикам `protocol_error_code` через [`OpenerDirector.error()`](https://python-all.ru/2.7/library/urllib2.html#urllib2.OpenerDirector.error). В конечном итоге [`urllib2.HTTPDefaultErrorHandler`](https://python-all.ru/2.7/library/urllib2.html#urllib2.HTTPDefaultErrorHandler) возбудит [`HTTPError`](https://python-all.ru/2.7/library/urllib2.html#urllib2.HTTPError), если ни один другой обработчик не обработает ошибку.534535#### `HTTPErrorProcessor.https_response()`536537Обрабатывает ошибочные HTTPS-ответы.538539Поведение аналогично [`http_response()`](https://python-all.ru/2.7/library/urllib2.html#urllib2.HTTPErrorProcessor.http_response).540541## 20.6.21. Примеры542543В дополнение к приведённым ниже примерам, больше примеров приведено в [HOWTO Fetch Internet Resources Using urllib2](https://python-all.ru/2.7/howto/urllib2.html#urllib-howto).544545В этом примере загружается главная страница python.org и выводятся первые 100 байт её содержимого:546547```python548>>> import urllib2549>>> f = urllib2.urlopen('http://www.python.org/')550>>> print f.read(100)551<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">552<?xml-stylesheet href="./css/ht2html553```554555Здесь мы отправляем поток данных на stdin CGI и читаем данные, которые он возвращает. Обратите внимание: этот пример работает только при наличии поддержки SSL в установке Python.556557```python558>>> import urllib2559>>> req = urllib2.Request(url='https://localhost/cgi-bin/test.cgi',560...                       data='This data is passed to stdin of the CGI')561>>> f = urllib2.urlopen(req)562>>> print f.read()563Got Data: "This data is passed to stdin of the CGI"564```565566Код образца CGI, использованного в приведённом выше примере:567568```python569#!/usr/bin/env python570import sys571data = sys.stdin.read()572print 'Content-type: text-plain\n\nGot Data: "%s"' % data573```574575Использование базовой HTTP-аутентификации:576577```python578import urllib2579# Создать OpenerDirector с поддержкой базовой HTTP-аутентификации...580auth_handler = urllib2.HTTPBasicAuthHandler()581auth_handler.add_password(realm='PDQ Application',582                          uri='https://mahler:8092/site-updates.py',583                          user='klem',584                          passwd='kadidd!ehopper')585opener = urllib2.build_opener(auth_handler)586# ...и установить его глобально, чтобы его можно было использовать с urlopen.587urllib2.install_opener(opener)588urllib2.urlopen('http://www.example.com/login.html')589```590591[`build_opener()`](https://python-all.ru/2.7/library/urllib2.html#urllib2.build_opener) предоставляет множество обработчиков по умолчанию, включая [`ProxyHandler`](https://python-all.ru/2.7/library/urllib2.html#urllib2.ProxyHandler). По умолчанию [`ProxyHandler`](https://python-all.ru/2.7/library/urllib2.html#urllib2.ProxyHandler) использует переменные окружения с именами `<scheme>_proxy`, где `<scheme>` – это схема URL. Например, переменная окружения `http_proxy` читается для получения URL HTTP-прокси.592593В этом примере стандартный [`ProxyHandler`](https://python-all.ru/2.7/library/urllib2.html#urllib2.ProxyHandler) заменяется на тот, который использует программно заданные URL прокси, а также добавляется поддержка авторизации прокси с помощью [`ProxyBasicAuthHandler`](https://python-all.ru/2.7/library/urllib2.html#urllib2.ProxyBasicAuthHandler).594595```python596proxy_handler = urllib2.ProxyHandler({'http': 'http://www.example.com:3128/'})597proxy_auth_handler = urllib2.ProxyBasicAuthHandler()598proxy_auth_handler.add_password('realm', 'host', 'username', 'password')599600opener = urllib2.build_opener(proxy_handler, proxy_auth_handler)601# На этот раз, вместо установки OpenerDirector, используется напрямую:602opener.open('http://www.example.com/login.html')603```604605Добавление HTTP-заголовков:606607Используйте аргумент *headers* конструктора [`Request`](https://python-all.ru/2.7/library/urllib2.html#urllib2.Request) или:608609```python610import urllib2611req = urllib2.Request('http://www.example.com/')612req.add_header('Referer', 'http://www.python.org/')613# Настроить значение заголовка User-Agent по умолчанию:614req.add_header('User-Agent', 'urllib-example/0.1 (Contact: . . .)')615r = urllib2.urlopen(req)616```617618[`OpenerDirector`](https://python-all.ru/2.7/library/urllib2.html#urllib2.OpenerDirector) автоматически добавляет заголовок *User-Agent* к каждому запросу [`Request`](https://python-all.ru/2.7/library/urllib2.html#urllib2.Request). Чтобы изменить это:619620```python621import urllib2622opener = urllib2.build_opener()623opener.addheaders = [('User-agent', 'Mozilla/5.0')]624opener.open('http://www.example.com/')625```626627Также помните, что несколько стандартных заголовков (*Content-Length*, *Content-Type* и *Host*) добавляются, когда [`Request`](https://python-all.ru/2.7/library/urllib2.html#urllib2.Request) передаётся в [`urlopen()`](https://python-all.ru/2.7/library/urllib2.html#urllib2.urlopen) (или [`OpenerDirector.open()`](https://python-all.ru/2.7/library/urllib2.html#urllib2.OpenerDirector.open)).628