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

20.6. urllib2 – расширяемая библиотека для открытия URL-адресовurllib2 – extensible library for opening URLs

Примечание

Модуль urllib2 был разделён на несколько модулей в Python 3 с именами urllib.request и urllib.error. Инструмент 2to3 автоматически адаптирует импорты при преобразовании исходного кода в Python 3.

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

См. также

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

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

urllib2.urlopen(url[, data[, timeout[, cafile[, capath[, cadefault[, context]]]]])

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

data может быть строкой, задающей дополнительные данные для отправки на сервер, или None, если такие данные не нужны. В настоящее время только HTTP-запросы используют data; HTTP-запрос будет POST вместо GET, когда указан параметр data. data должен быть буфером в стандартном формате application/x-www-form-urlencoded. Функция urllib.urlencode() принимает отображение или последовательность пар и возвращает строку в этом формате. Модуль urllib2 отправляет HTTP/1.1-запросы с заголовком Connection:close.

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

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

Необязательные параметры cafile и capath задают набор доверенных сертификатов ЦС для HTTPS-запросов. cafile должен указывать на один файл, содержащий набор сертификатов ЦС, тогда как capath должен указывать на каталог хешированных файлов сертификатов. Дополнительную информацию можно найти в ssl.SSLContext.load_verify_locations().

Параметр cadefault игнорируется.

Эта функция возвращает файлоподобный объект с тремя дополнительными методами:

  • geturl() – возвращает URL полученного ресурса, обычно используется для определения, было ли выполнено перенаправление

  • info() – возвращает метаинформацию страницы, такую как заголовки, в виде экземпляра mimetools.Message (см. Краткий справочник по HTTP-заголовкам)

  • getcode() – возвращает код состояния HTTP ответа.

Вызывает URLError при ошибках.

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

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

Изменено в версии 2.6: добавлен параметр timeout.

Изменено в версии 2.7.9: добавлены cafile, capath, cadefault и context.

urllib2.install_opener(opener)

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

urllib2.build_opener([handler, ...])

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

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

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

При необходимости генерируются следующие исключения:

exception urllib2.URLError

Обработчики вызывают это исключение (или производные от него) при возникновении проблемы. Оно является подклассом IOError.

reason

Причина этой ошибки. Это может быть строка сообщения или другой экземпляр исключения (socket.error для удалённых URL, OSError для локальных URL).

exception urllib2.HTTPError

Хотя HTTPError является исключением (подклассом URLError), он также может работать как неисключительное файлоподобное возвращаемое значение (то же самое, что возвращает urlopen()). Это полезно при обработке необычных HTTP-ошибок, таких как запросы аутентификации.

code

Код состояния HTTP, как определено в RFC 2616. Это числовое значение соответствует значению из словаря кодов, как указано в BaseHTTPServer.BaseHTTPRequestHandler.responses.

reason

Причина этой ошибки. Это может быть строка сообщения или другой экземпляр исключения.

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

class urllib2.Request(url[, data][, headers][, origin_req_host][, unverifiable])

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

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

data может быть строкой, задающей дополнительные данные для отправки на сервер, или None, если такие данные не нужны. В настоящее время только HTTP-запросы используют data; HTTP-запрос будет POST вместо GET, когда указан параметр data. data должен быть буфером в стандартном формате application/x-www-form-urlencoded. Функция urllib.urlencode() принимает отображение или последовательность пар и возвращает строку в этом формате.

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

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

origin_req_host должен быть хостом запроса исходной транзакции, как определено в RFC 2965. По умолчанию он равен cookielib.request_host(self). Это имя хоста или IP-адрес исходного запроса, инициированного пользователем. Например, если запрос делается для изображения в HTML-документе, это должен быть хост запроса страницы, содержащей изображение.

unverifiable должен указывать, является ли запрос непроверяемым, как это определено в RFC 2965. По умолчанию он равен False. Непроверяемый запрос – это запрос, URL которого пользователь не имел возможности одобрить. Например, если запрос выполняется для изображения в HTML-документе и пользователь не имел возможности одобрить автоматическую загрузку этого изображения, параметр должен быть истинным.

class urllib2.OpenerDirector

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

class urllib2.BaseHandler

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

class urllib2.HTTPDefaultErrorHandler

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

class urllib2.HTTPRedirectHandler

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

class urllib2.HTTPCookieProcessor([cookiejar])

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

class urllib2.ProxyHandler([proxies])

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

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

Примечание

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

class urllib2.HTTPPasswordMgr

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

class urllib2.HTTPPasswordMgrWithDefaultRealm

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

class urllib2.AbstractBasicAuthHandler([password_mgr])

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

class urllib2.HTTPBasicAuthHandler([password_mgr])

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

class urllib2.ProxyBasicAuthHandler([password_mgr])

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

class urllib2.AbstractDigestAuthHandler([password_mgr])

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

class urllib2.HTTPDigestAuthHandler([password_mgr])

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

class urllib2.ProxyDigestAuthHandler([password_mgr])

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

class urllib2.HTTPHandler

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

class urllib2.HTTPSHandler([debuglevel[, context]])

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

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

class urllib2.FileHandler

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

class urllib2.FTPHandler

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

class urllib2.CacheFTPHandler

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

class urllib2.UnknownHandler

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

class urllib2.HTTPErrorProcessor

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

20.6.1. Объекты RequestRequest Objects

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

Request.add_data(data)

Устанавливает данные Request в data. Этот параметр игнорируется всеми обработчиками, кроме HTTP-обработчиков, – там он должен быть байтовой строкой и изменит запрос на POST вместо GET.

Request.get_method()

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

Request.has_data()

Возвращает, есть ли у экземпляра данные, отличные от None.

Request.get_data()

Возвращает данные экземпляра.

Request.add_header(key, val)

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

Request.add_unredirected_header(key, header)

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

Новое в версии 2.4.

Request.has_header(header)

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

Новое в версии 2.4.

Request.get_full_url()

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

Request.get_type()

Возвращает тип URL – также известный как схема.

Request.get_host()

Возвращает хост, к которому будет установлено соединение.

Request.get_selector()

Возвращает селектор – часть URL, которая отправляется серверу.

Request.get_header(header_name, default=None)

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

Request.header_items()

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

Request.set_proxy(host, type)

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

Request.get_origin_req_host()

Возвращает хост запроса исходной транзакции, как определено в RFC 2965. См. документацию конструктора Request.

Request.is_unverifiable()

Возвращает, является ли запрос непроверяемым, как определено в RFC 2965. См. документацию конструктора Request.

20.6.2. Объекты OpenerDirectorOpenerDirector Objects

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

OpenerDirector.add_handler(handler)

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

  • protocol_open – сигнализирует, что обработчик умеет открывать URL протокола протокол.

  • http_error_type – сигнализирует, что обработчик умеет обрабатывать HTTP-ошибки с кодом HTTP type.

  • protocol_error – сигнализирует, что обработчик умеет обрабатывать ошибки от протокол (кроме http).

  • protocol_request – сигнализирует, что обработчик умеет предварительно обрабатывать запросы протокол.

  • protocol_response – сигнал о том, что обработчик умеет постобрабатывать ответы протокол.

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

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

Изменено в версии 2.6: добавлен параметр timeout.

OpenerDirector.error(proto, argarg, [...]])

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

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

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

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

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

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

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

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

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

20.6.3. Объекты BaseHandlerBaseHandler Objects

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

BaseHandler.add_parent(director)

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

BaseHandler.close()

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

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

Примечание

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

BaseHandler.parent

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

BaseHandler.default_open(req)

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

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

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

BaseHandler.protocol_open(req)

(«протокол» следует заменить на имя протокола.)

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

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

BaseHandler.unknown_open(req)

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

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

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

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

req будет объектом Request, fp будет файлоподобным объектом с телом HTTP-ошибки, code будет трёхзначным кодом ошибки, msg будет видимым пользователю пояснением кода, а hdrs будет объектом отображения, содержащим заголовки ошибки.

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

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

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

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

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

BaseHandler.protocol_request(req)

(«протокол» следует заменить на имя протокола.)

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

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

BaseHandler.protocol_response(req, response)

(«протокол» следует заменить на имя протокола.)

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

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

20.6.4. Объекты HTTPRedirectHandlerHTTPRedirectHandler Objects

Примечание

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

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

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

Примечание

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

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

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

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

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

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

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

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

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

20.6.5. Объекты HTTPCookieProcessorHTTPCookieProcessor Objects

Новое в версии 2.4.

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

HTTPCookieProcessor.cookiejar

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

20.6.6. Объекты ProxyHandlerProxyHandler Objects

ProxyHandler.protocol_open(request)

(«протокол» следует заменить на имя протокола.)

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

20.6.7. Объекты HTTPPasswordMgrHTTPPasswordMgr Objects

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

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

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

HTTPPasswordMgr.find_user_password(realm, authuri)

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

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

20.6.8. Объекты AbstractBasicAuthHandlerAbstractBasicAuthHandler Objects

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

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

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

20.6.9. Объекты HTTPBasicAuthHandlerHTTPBasicAuthHandler Objects

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

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

20.6.10. Объекты ProxyBasicAuthHandlerProxyBasicAuthHandler Objects

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

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

20.6.11. Объекты AbstractDigestAuthHandlerAbstractDigestAuthHandler Objects

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

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

20.6.12. Объекты HTTPDigestAuthHandlerHTTPDigestAuthHandler Objects

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

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

20.6.13. Объекты ProxyDigestAuthHandlerProxyDigestAuthHandler Objects

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

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

20.6.14. Объекты HTTPHandlerHTTPHandler Objects

HTTPHandler.http_open(req)

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

20.6.15. Объекты HTTPSHandlerHTTPSHandler Objects

HTTPSHandler.https_open(req)

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

20.6.16. Объекты FileHandlerFileHandler Objects

FileHandler.file_open(req)

Если имя хоста не указано или имя хоста равно 'localhost', файл открывается локально. В противном случае протокол меняется на ftp, и открытие повторяется с помощью parent.

20.6.17. Объекты FTPHandlerFTPHandler Objects

FTPHandler.ftp_open(req)

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

20.6.18. Объекты CacheFTPHandlerCacheFTPHandler Objects

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

CacheFTPHandler.setTimeout(t)

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

CacheFTPHandler.setMaxConns(m)

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

20.6.19. Объекты UnknownHandlerUnknownHandler Objects

UnknownHandler.unknown_open()

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

20.6.20. Объекты HTTPErrorProcessorHTTPErrorProcessor Objects

Новое в версии 2.4.

HTTPErrorProcessor.http_response()

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

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

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

HTTPErrorProcessor.https_response()

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

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

20.6.21. ПримерыExamples

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

В этом примере загружается главная страница python.org и выводятся первые 100 байт её содержимого:

>>> import urllib2
>>> f = urllib2.urlopen('http://www.python.org/')
>>> print f.read(100)
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<?xml-stylesheet href="./css/ht2html

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

>>> import urllib2
>>> req = urllib2.Request(url='https://localhost/cgi-bin/test.cgi',
...                       data='This data is passed to stdin of the CGI')
>>> f = urllib2.urlopen(req)
>>> print f.read()
Got Data: "This data is passed to stdin of the CGI"

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

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

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

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

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

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

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

opener = urllib2.build_opener(proxy_handler, proxy_auth_handler)
# На этот раз, вместо установки OpenerDirector, используется напрямую:
opener.open('http://www.example.com/login.html')

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

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

import urllib2
req = urllib2.Request('http://www.example.com/')
req.add_header('Referer', 'http://www.python.org/')
# Настроить значение заголовка User-Agent по умолчанию:
req.add_header('User-Agent', 'urllib-example/0.1 (Contact: . . .)')
r = urllib2.urlopen(req)

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

import urllib2
opener = urllib2.build_opener()
opener.addheaders = [('User-agent', 'Mozilla/5.0')]
opener.open('http://www.example.com/')

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