urllib.request — Расширяемая библиотека для открытия URL-адресов
Исходный код: Lib/urllib/request.py
Модуль urllib.request определяет функции и классы, которые помогают открывать URL-адреса (в основном HTTP) в сложном мире — базовая и дайджест-аутентификация, перенаправления, куки и многое другое.
См. также
Для более высокого уровня интерфейса HTTP-клиента рекомендуется пакет Requests.
Модуль urllib.request определяет следующие функции:
-
urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None) -
Открывает URL-адрес url, который может быть строкой или объектом
Request.data должен быть объектом, определяющим дополнительные данные, которые будут отправлены на сервер, или
Noneесли такие данные не нужны. Подробности см. вRequest.Модуль urllib.request использует HTTP/1.1 и включает заголовок
Connection:closeв своих HTTP-запросах.Необязательный параметр timeout задаёт время ожидания в секундах для блокирующих операций, таких как попытка подключения (если не указано, используется глобальное значение по умолчанию). Это фактически работает только для HTTP, HTTPS и FTP-соединений.
Если задан параметр context, он должен быть экземпляром
ssl.SSLContext, описывающим различные параметры SSL. Более подробная информация приведена вHTTPSConnection.Необязательные параметры cafile и capath задают набор доверенных сертификатов CA для HTTPS-запросов. cafile должен указывать на один файл, содержащий набор сертификатов CA, а capath — на каталог с хэшированными файлами сертификатов. Дополнительная информация доступна в
ssl.SSLContext.load_verify_locations().Параметр cadefault игнорируется.
Эта функция всегда возвращает объект, который может работать как менеджер контекста и имеет такие методы, как
-
geturl()— возвращает URL ресурса, полученного, обычно используется для определения, было ли выполнено перенаправление -
info()— возвращает метаинформацию страницы, такую как заголовки, в виде экземпляраemail.message_from_string()(см. Быстрое справочное руководство по HTTP-заголовкам) -
getcode()— возвращает HTTP-код состояния ответа.
Для HTTP- и HTTPS-URL эта функция возвращает слегка изменённый объект
http.client.HTTPResponse. В дополнение к трём новым методам выше, атрибут msg содержит ту же информацию, что и атрибутreason— фразу причины, возвращённую сервером — вместо заголовков ответа, как указано в документации дляHTTPResponse.Для FTP, file и data URL и запросов, явно обрабатываемых устаревшими классами
URLopenerиFancyURLopener, эта функция возвращает объектurllib.response.addinfourl.Возбуждает исключение
URLErrorпри ошибках протокола.Обратите внимание, что
Noneможет быть возвращено, если ни один обработчик не обработает запрос (хотя установленный по умолчанию глобальныйOpenerDirectorиспользуетUnknownHandler, чтобы гарантировать, что этого никогда не произойдёт).Кроме того, если обнаружены настройки прокси (например, при установке переменной среды
*_proxyтипаhttp_proxy), по умолчанию устанавливаетсяProxyHandlerи гарантируется, что запросы обрабатываются через прокси.Устаревшая функция
urllib.urlopenиз Python 2.6 и более ранних версий была прекращена;urllib.request.urlopen()соответствует старойurllib2.urlopen. Обработку прокси, которая выполнялась путём передачи параметра словаря вurllib.urlopen, можно получить, используя объектыProxyHandler.Изменено в версии 3.2: Добавлены cafile и capath.
Изменено в версии 3.2: Теперь поддерживаются виртуальные хосты HTTPS, если это возможно (то есть, если
ssl.HAS_SNIистинно).Добавлена в версии 3.2: data может быть итерируемым объектом.
Изменено в версии 3.3: Добавлен cadefault.
Изменено в версии 3.4.3: Добавлен context.
Устарело начиная с версии 3.6: cafile, capath и cadefault устарели в пользу context. Используйте вместо этого
ssl.SSLContext.load_cert_chain()или позвольтеssl.create_default_context()выбрать доверенные сертификаты CA системы. -
-
urllib.request.install_opener(opener) -
Устанавливает экземпляр
OpenerDirectorв качестве глобального обработчика по умолчанию. Установка обработчика необходима только если вы хотите, чтобы urlopen использовал этот обработчик; в противном случае просто вызовитеOpenerDirector.open()вместоurlopen(). Код не проверяет реальныйOpenerDirector, и любой класс с соответствующим интерфейсом будет работать.
-
urllib.request.build_opener([handler, ...]) -
Возвращает экземпляр
OpenerDirector, который связывает обработчики в заданном порядке. handler могут быть экземплярамиBaseHandlerили подклассамиBaseHandler(в этом случае конструктор должен быть вызываем без параметров). Экземпляры следующих классов будут находиться перед handler, если они не содержатся в handler, или их подклассы:ProxyHandler(если обнаружены настройки прокси),UnknownHandler,HTTPHandler,HTTPDefaultErrorHandler,HTTPRedirectHandler,FTPHandler,FileHandler,HTTPErrorProcessor.Если в установке Python есть поддержка SSL (то есть, если модуль
sslможет быть импортирован), также будет добавленHTTPSHandler.Подкласс
BaseHandlerтакже может изменить свой атрибутhandler_orderдля изменения своего положения в списке обработчиков.
-
urllib.request.pathname2url(path) -
Преобразует путь path из локального синтаксиса пути в форму, используемую в компонент пути URL. Это не создаёт полный URL. Возвращаемое значение уже будет закодировано с использованием функции
quote().
-
urllib.request.url2pathname(path) -
Преобразует компонент пути path из URL с проценто-кодированием в локальный синтаксис пути. Эта функция не принимает полный URL. Эта функция использует
unquote()для декодирования path.
-
urllib.request.getproxies() -
Эта вспомогательная функция возвращает словарь сопоставлений схем с URL-адресами прокси-серверов. Она сканирует среду поиска переменных с именами
<scheme>_proxy, применяя регистронезависимый поиск, сначала для всех операционных систем, и если не находит, ищет информацию о прокси из Mac OSX System Configuration для Mac OS X и системного реестра Windows для Windows. Если существуют переменные окружения как в нижнем, так и в верхнем регистре (и они различаются), предпочтение отдаётся переменной в нижнем регистре.Примечание
Если переменная окружения
REQUEST_METHODустановлена, что обычно указывает на запуск скрипта в среде CGI, переменная окруженияHTTP_PROXY(в верхнем регистре_PROXY) будет проигнорирована. Это связано с тем, что эта переменная может быть внедрена клиентом с помощью заголовка HTTP «Proxy:». Если вам необходимо использовать HTTP-прокси в среде CGI, используйтеProxyHandlerявно или убедитесь, что имя переменной находится в нижнем регистре (или, по крайней мере, содержит суффикс_proxy).
Предоставляются следующие классы:
-
class urllib.request.Request(url, data=None, headers={}, origin_req_host=None, unverifiable=False, method=None) -
Этот класс представляет собой абстракцию запроса к URL.
url должен быть строкой, содержащей корректный URL.
data должен быть объектом, определяющим дополнительные данные для отправки на сервер, или
Noneесли такие данные не требуются. В настоящее время HTTP-запросы — единственные, которые используют data. Поддерживаемые типы объектов включают байты, объекты типа «подобные файлам» и итерируемые объекты. Если не указан заголовокContent-LengthилиTransfer-Encoding,HTTPHandlerустановит эти заголовки в соответствии с типом data.Content-Lengthбудет использоваться для отправки объектов типа байты, аTransfer-Encoding: chunked— как указано в RFC 7230, Раздел 3.3.1, для отправки файлов и других итерируемых объектов.Для HTTP-запроса методом POST data должен быть буфером в стандартном формате application/x-www-form-urlencoded. Функция
urllib.parse.urlencode()принимает отображение или последовательность пар 2-х элементов и возвращает строку ASCII в этом формате. Она должна быть закодирована в байты перед использованием в качестве параметра data.headers должен быть словарем, и будет обрабатываться так, как будто вызвана
add_header()с каждой парой ключ-значение в качестве аргументов. Это часто используется для «подделки» значения заголовкаUser-Agent, используемого браузером для идентификации — некоторые HTTP-серверы допускают запросы только от обычных браузеров, а не от скриптов. Например, Mozilla Firefox может идентифицироваться как"Mozilla/5.0 (X11; U; Linux i686) Gecko/20071127 Firefox/2.0.0.11", в то время как строка пользователя-агента по умолчанию дляurllib—"Python-urllib/2.6"(в Python 2.6).Необходимо включить соответствующий заголовок
Content-Type, если аргумент data присутствует. Если этот заголовок не предоставлен, а data не равно None,Content-Type: application/x-www-form-urlencodedбудет добавлен по умолчанию.Следующие два аргумента важны только для правильной обработки сторонних HTTP-cookies:
origin_req_host должен быть хостом запроса источника, как определено в RFC 2965. По умолчанию он равен
http.cookiejar.request_host(self). Это имя хоста или IP-адрес исходного запроса, инициированного пользователем. Например, если запрос относится к изображению в документе HTML, это должен быть хост запроса для страницы, содержащей изображение.unverifiable должен указывать, является ли запрос недопустимым, как определено в RFC 2965. По умолчанию он равен
False. Недопустимый запрос — это запрос, URL которого пользователь не имел возможности одобрить. Например, если запрос относится к изображению в HTML-документе, а пользователь не имел возможности одобрить автоматическую загрузку изображения, это должно быть True.method должна быть строкой, указывающей метод HTTP-запроса, который будет использован (например,
'HEAD'). Если указано, её значение хранится в атрибутеmethodи используетсяget_method(). По умолчанию это'GET'если data равноNoneили'POST'в противном случае. Подклассы могут указать другой метод по умолчанию, установив атрибутmethodв самом классе.Примечание
Запрос не будет работать должным образом, если объект данных не может передать содержимое более одного раза (например, файл или итерируемый объект, которые могут сгенерировать содержимое только один раз), и запрос повторяется из-за HTTP-перенаправлений или аутентификации. data отправляется на HTTP-сервер сразу после заголовков. В библиотеке нет поддержки ожидания 100-continue.
Изменено в версии 3.3: Аргумент
Request.methodдобавлен в класс Request.Изменено в версии 3.4: Метод по умолчанию
Request.methodможет быть указан на уровне класса.Изменено в версии 3.6: Не генерировать ошибку, если заголовок
Content-Lengthне предоставлен, а data не являетсяNoneили объектом типа байты. Используйте кодирование с фрагментами вместо этого.
-
class urllib.request.OpenerDirector -
Класс
OpenerDirectorоткрывает URL-адреса с помощьюBaseHandler, объединённых в цепочку. Он управляет связыванием обработчиков и восстановлением после ошибок.
-
class urllib.request.BaseHandler -
Это базовый класс для всех зарегистрированных обработчиков — и обрабатывает только простые механизмы регистрации.
-
class urllib.request.HTTPDefaultErrorHandler -
Класс, определяющий обработчик по умолчанию для HTTP-ответов с ошибками; все ответы преобразуются в исключения
HTTPError.
-
class urllib.request.HTTPRedirectHandler -
Класс для обработки перенаправлений.
-
class urllib.request.HTTPCookieProcessor(cookiejar=None) -
Класс для обработки HTTP-cookies.
-
class urllib.request.ProxyHandler(proxies=None) -
Принуждает запросы проходить через прокси. Если указан proxies, он должен быть словарем, сопоставляющим имена протоколов с URL-адресами прокси-серверов. По умолчанию он считывает список прокси из переменных окружения
<protocol>_proxy. Если переменные окружения прокси не установлены, то в среде Windows настройки прокси извлекаются из раздела Настройки интернета реестра, а в среде Mac OS X информация о прокси извлекается из фреймворка конфигурации системы Mac OS X.Для отключения автоматически обнаруженных прокси передайте пустой словарь.
Переменная окружения
no_proxyможет использоваться для указания хостов, которые не должны достигаться через прокси; если она установлена, она должна быть запятой-разделенным списком суффиксов имён хостов, с необязательным добавлением:port, например,cern.ch,ncsa.uiuc.edu,some.host:8080.Примечание
HTTP_PROXYбудет проигнорировано, если установлена переменнаяREQUEST_METHOD; см. документацию поgetproxies().
-
class urllib.request.HTTPPasswordMgr -
Хранит базу данных сопоставлений
(realm, uri) -> (user, password).
-
class urllib.request.HTTPPasswordMgrWithDefaultRealm -
Хранит базу данных сопоставлений
(realm, uri) -> (user, password). СфераNoneсчитается универсальной областью, которая ищется, если ни одна другая область не подходит.
-
class urllib.request.HTTPPasswordMgrWithPriorAuth -
Вариант
HTTPPasswordMgrWithDefaultRealm, который также хранит базу данных сопоставленийuri -> is_authenticated. Может использоваться обработчиком BasicAuth для определения момента отправки учетных данных аутентификации немедленно вместо ожидания ответа401.Введено в версии 3.5.
-
class urllib.request.AbstractBasicAuthHandler(password_mgr=None) -
Это миксин-класс, который помогает с аутентификацией HTTP, как к удалённому хосту, так и к прокси. password_mgr, если задан, должен быть совместим с
HTTPPasswordMgr; см. раздел Объекты HTTPPasswordMgr для информации об интерфейсе, который должен поддерживаться. Если passwd_mgr также предоставляет методыis_authenticatedиupdate_authenticated(см. Объекты HTTPPasswordMgrWithPriorAuth), то обработчик будет использовать результатis_authenticatedдля заданного URI, чтобы определить, следует ли отправлять учетные данные для аутентификации вместе с запросом. Еслиis_authenticatedвозвращаетTrueдля URI, учетные данные отправляются. Еслиis_authenticatedравноFalse, учетные данные не отправляются, а затем, если получен ответ401, запрос повторно отправляется с учетными данными для аутентификации. Если аутентификация проходит успешно, вызываетсяupdate_authenticated, чтобы установитьis_authenticatedTrueдля URI, так что последующие запросы к URI или любому из его супер-URI будут автоматически включать учетные данные для аутентификации.Добавлена в версии 3.5: Поддержка
is_authenticated.
-
class urllib.request.HTTPBasicAuthHandler(password_mgr=None) -
Обработка аутентификации с удалённым хостом. password_mgr, если задан, должен быть совместим с
HTTPPasswordMgr; см. раздел Объекты HTTPPasswordMgr для информации об интерфейсе, который должен поддерживаться. HTTPBasicAuthHandler будет генерировать исключениеValueErrorпри обнаружении неверной схемы аутентификации.
-
class urllib.request.ProxyBasicAuthHandler(password_mgr=None) -
Обработка аутентификации с прокси-сервером. password_mgr, если задан, должен быть совместим с
HTTPPasswordMgr; см. раздел Объекты HTTPPasswordMgr для информации об интерфейсе, который должен поддерживаться.
-
class urllib.request.AbstractDigestAuthHandler(password_mgr=None) -
Это миксин-класс, который помогает с аутентификацией HTTP, как к удалённому хосту, так и к прокси. password_mgr, если задан, должен быть совместим с
HTTPPasswordMgr; см. раздел Объекты HTTPPasswordMgr для информации об интерфейсе, который должен поддерживаться.
-
class urllib.request.HTTPDigestAuthHandler(password_mgr=None) -
Обработка аутентификации с удалённым хостом. password_mgr, если задан, должен быть совместим с
HTTPPasswordMgr; см. раздел Объекты HTTPPasswordMgr для информации об интерфейсе, который должен поддерживаться. Если обработчик аутентификации Digest и обработчик аутентификации Basic оба добавлены, то Digest аутентификация всегда пробуется первой. Если Digest аутентификация снова возвращает ответ 40x, он передаётся обработчику Basic для обработки. Этот метод обработчика генерирует исключениеValueErrorпри получении схемы аутентификации, отличной от Digest или Basic.Изменено в версии 3.3: Генерировать
ValueErrorпри работе со схемой аутентификации, которая не поддерживается.
-
class urllib.request.ProxyDigestAuthHandler(password_mgr=None) -
Обработка аутентификации с прокси-сервером. password_mgr, если задан, должен быть совместим с
HTTPPasswordMgr; см. раздел Объекты HTTPPasswordMgr для информации об интерфейсе, который должен поддерживаться.
-
class urllib.request.HTTPHandler -
Класс для обработки открытия HTTP-URL.
-
class urllib.request.HTTPSHandler(debuglevel=0, context=None, check_hostname=None) -
Класс для обработки открытия HTTPS-URL. context и check_hostname имеют такое же значение, как и в
http.client.HTTPSConnection.Изменено в версии 3.2: Добавлены context и check_hostname.
-
class urllib.request.FileHandler -
Открытие локальных файлов.
-
class urllib.request.DataHandler -
Открытие URL-адресов данных.
Добавлена в версии 3.4.
-
class urllib.request.FTPHandler -
Открытие FTP-URL.
-
class urllib.request.CacheFTPHandler -
Открытие FTP-URL, сохраняя кэш открытых FTP-соединений для минимизации задержек.
-
class urllib.request.UnknownHandler -
Универсальный класс для обработки неизвестных URL.
-
class urllib.request.HTTPErrorProcessor -
Обработка ответов HTTP с ошибками.
Объекты запросов
Следующие методы описывают общедоступный интерфейс Request, и поэтому все они могут быть переопределены в подклассах. Он также определяет несколько общедоступных атрибутов, которые могут использоваться клиентами для проверки разбора запроса.
-
Request.full_url -
Исходный URL, переданный конструктору.
Изменено в версии 3.4.
Request.full_url — свойство с установщиком, получателем и удалителем. Получение
full_urlвозвращает исходный URL запроса с фрагментом, если он был присутствовал.
-
Request.type -
Схема URI.
-
Request.host -
Авторитет URI, обычно хост, но может также содержать порт, разделённый двоеточием.
-
Request.origin_req_host -
Исходный хост для запроса без порта.
-
Request.selector -
Путь URI. Если
Requestиспользует прокси, то selector будет полным URL, который передаётся прокси.
-
Request.data -
Тело сущности для запроса или
None, если не указано.Изменено в версии 3.4: Изменение значения
Request.dataтеперь удаляет заголовок «Content-Length», если он был ранее задан или рассчитан.
-
Request.unverifiable -
булево, указывает, является ли запрос недостоверным, как определено в RFC 2965.
-
Request.method -
HTTP-метод запроса, который необходимо использовать. По умолчанию его значение равно
None, что означает, чтоget_method()выполнит стандартное вычисление метода, который необходимо использовать. Его значение можно установить (тем самым переопределяя стандартное вычисление вget_method()), либо задав значение по умолчанию на уровне класса в подклассеRequest, либо передав значение в конструкторRequestчерез аргумент method.Добавлена в версии 3.3.
Изменено в версии 3.4: Теперь можно задать значение по умолчанию в подклассах; ранее это можно было сделать только через аргумент конструктора.
-
Request.get_method() -
Возвращает строку, обозначающую метод HTTP-запроса. Если
Request.methodнеNone, возвращает его значение, иначе возвращает'GET'еслиRequest.dataNone, или'POST'если нет. Это имеет смысл только для HTTP-запросов.Изменено в версии 3.3: get_method теперь проверяет значение
Request.method.
-
Request.add_header(key, val) -
Добавляет заголовок к запросу. В настоящее время все обработчики, кроме HTTP-обработчиков, игнорируют заголовки, где они добавляются в список заголовков, отправляемых серверу. Обратите внимание, что не может быть более одного заголовка с одинаковым именем, и последующие вызовы будут перезаписывать предыдущие вызовы в случае совпадения ключ. В настоящее время это не приводит к потере функциональности HTTP, так как все заголовки, имеющие значение при использовании более одного раза, имеют (специфичный для заголовка) способ получения той же функциональности с использованием только одного заголовка.
-
Request.add_unredirected_header(key, header) -
Добавляет заголовок, который не будет добавлен к перенаправленному запросу.
-
Request.has_header(header) -
Возвращает, содержит ли экземпляр указанный заголовок (проверяет как обычные, так и незавершенные перенаправления).
-
Request.remove_header(header) -
Удаляет указанный заголовок из экземпляра запроса (как из обычных, так и из незавершенных перенаправлений).
Введено в версии 3.4.
-
Request.get_full_url() -
Возвращает URL, заданный в конструкторе.
Изменено в версии 3.4.
Возвращает
Request.full_url
-
Request.set_proxy(host, type) -
Подготавливает запрос, соединяясь с прокси-сервером. host и type заменят соответствующие значения экземпляра, а селектор экземпляра будет исходным URL, заданным в конструкторе.
-
Request.get_header(header_name, default=None) -
Возвращает значение заданного заголовка. Если заголовок отсутствует, возвращает значение по умолчанию.
-
Request.header_items() -
Возвращает список кортежей (имя_заголовка, значение_заголовка) заголовков запроса.
Изменено в версии 3.4: Методы запроса add_data, has_data, get_data, get_type, get_host, get_selector, get_origin_req_host и is_unverifiable, которые были устаревшими с 3.3, были удалены.
Объекты OpenerDirector
OpenerDirector экземпляры имеют следующие методы:
-
OpenerDirector.add_handler(handler) -
handler должен быть экземпляром
BaseHandler. Ищутся следующие методы и добавляются в возможные цепочки (обратите внимание, что HTTP-ошибки — особый случай). Обратите внимание, что в следующем protocol следует заменить фактическим протоколом для обработки, например,http_response()будет обработчиком ответа HTTP-протокола. Также type следует заменить фактическим HTTP-кодом, например,http_error_404()будет обрабатывать HTTP-ошибки 404.-
<protocol>_open()— указывает, что обработчик знает, как открыть URL-адреса protocol.См.
BaseHandler.<protocol>_open()для получения дополнительной информации. -
http_error_<type>()— указывает, что обработчик знает, как обрабатывать HTTP-ошибки с кодом HTTP-ошибки type.См.
BaseHandler.http_error_<nnn>()для получения дополнительной информации. -
<protocol>_error()— указывает, что обработчик знает, как обрабатывать ошибки из (не-http) protocol. -
<protocol>_request()— указывает, что обработчик знает, как предварительно обработать запросы protocol.См.
BaseHandler.<protocol>_request()для получения дополнительной информации. -
<protocol>_response()— указывает, что обработчик знает, как послеобработать ответы protocol.См.
BaseHandler.<protocol>_response()для получения дополнительной информации.
-
-
OpenerDirector.open(url, data=None[, timeout]) -
Открывает заданный url (который может быть объектом запроса или строкой), необязательно передавая заданные data. Аргументы, возвращаемые значения и исключения, которые могут быть подняты, аналогичны тем, которые используются в
urlopen()(который просто вызывает методopen()в текущем установленной глобальнойOpenerDirector). Необязательный параметр timeout указывает время ожидания в секундах для блокирующих операций, таких как попытка подключения (если не указано, будет использоваться глобальное значение по умолчанию для таймаута). Функция таймаута фактически работает только для подключений HTTP, HTTPS и FTP.
-
OpenerDirector.error(proto, *args) -
Обрабатывает ошибку заданного протокола. Это вызовет зарегистрированные обработчики ошибок для данного протокола с указанными аргументами (которые специфичны для протокола). Протокол HTTP является особым случаем, который использует код HTTP-ответа для определения конкретного обработчика ошибок; см. методы
http_error_<type>()классов обработчиков.Возвращаемые значения и поднимаемые исключения аналогичны тем, что используются в
urlopen().
Объекты OpenerDirector открывают URL-адреса в три этапа:
Порядок вызова этих методов в каждом этапе определяется сортировкой экземпляров обработчика.
- Каждый обработчик с методом, названным как
<protocol>_request(), вызывает этот метод для предварительной обработки запроса. -
Обработчики с методом, названным как
<protocol>_open(), вызываются для обработки запроса. Этот этап завершается, когда обработчик либо возвращает значение, отличное отNone(т. е. ответ), либо вызывает исключение (обычноURLError). Исключение разрешается распространяться.Фактически, вышеописанный алгоритм сначала проверяется для методов, названных
default_open(). Если все такие методы возвращаютNone, алгоритм повторяется для методов, названных как<protocol>_open(). Если все такие методы возвращаютNone, алгоритм повторяется для методов, названныхunknown_open().Обратите внимание, что реализация этих методов может включать вызовы родительского экземпляра
OpenerDirectorметодаopen()иerror(). - Каждый обработчик с методом, названным как
<protocol>_response(), вызывает этот метод для последующей обработки ответа.
Объекты BaseHandler
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 без зарегистрированного обработчика открытия.Если реализован, этот метод будет вызван родительским элементом
parentOpenerDirector. Значения возврата должны быть такими же, как для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().
Обработчики перенаправлений HTTP
Примечание
Некоторые перенаправления HTTP требуют действий от клиентского кода этого модуля. В этом случае возбуждается HTTPError. Подробнее см. RFC 2616.
Возбуждается исключение HTTPError в качестве меры безопасности, если HTTPRedirectHandler получает перенаправленный URL, который не является URL HTTP, HTTPS или FTP.
-
HTTPRedirectHandler.redirect_request(req, fp, code, msg, hdrs, newurl) -
Возвращает
RequestилиNoneв ответ на перенаправление. Вызывается в результате перенаправления, полученного от сервера, по умолчанию. Если перенаправление должно произойти, верните новыйRequest, чтобыhttp_error_30*()смог выполнить перенаправление на newurl. В противном случае вызовитеHTTPError, если ни один другой обработчик не должен обрабатывать этот URL, или вернитеNone, если это невозможно, но другой обработчик может.Примечание
Реализация этого метода по умолчанию не полностью соответствует RFC 2616, которая гласит, что ответы 301 и 302 на
POSTзапросы не должны автоматически перенаправляться без подтверждения пользователя. На практике браузеры допускают автоматическое перенаправление этих ответов, изменяя POST наGET, и реализация по умолчанию воспроизводит это поведение.
-
HTTPRedirectHandler.http_error_301(req, fp, code, msg, hdrs) -
Перенаправление на
Location:илиURI:URL. Этот метод вызывается родительскимOpenerDirectorпри получении ответа HTTP «перемещено навсегда».
-
HTTPRedirectHandler.http_error_302(req, fp, code, msg, hdrs) -
То же, что и
http_error_301(), но вызывается для ответа «найдено».
-
HTTPRedirectHandler.http_error_303(req, fp, code, msg, hdrs) -
То же, что и
http_error_301(), но вызывается для ответа «см. другое».
-
HTTPRedirectHandler.http_error_307(req, fp, code, msg, hdrs) -
То же, что и
http_error_301(), но вызывается для ответа «временное перенаправление».
Обработчики файлов cookie HTTP
-
Объект
http.cookiejar.CookieJarдля хранения файлов cookie.
Обработчик прокси
-
ProxyHandler.<protocol>_open(request) -
У
ProxyHandlerбудет метод<protocol>_open()для каждого протокола, у которого есть прокси в словаре proxies, заданном в конструкторе. Метод изменит запросы, чтобы они проходили через прокси, вызвавrequest.set_proxy(), и вызовет следующий обработчик в цепочке, чтобы фактически выполнить протокол.
Менеджер паролей HTTP
Эти методы доступны для объектов 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будет осуществлен поиск realmNoneесли для заданного realm нет соответствующей пары имя пользователя/пароль.
Объекты HTTPPasswordMgrWithPriorAuth
Этот менеджер паролей расширяет HTTPPasswordMgrWithDefaultRealm, чтобы поддерживать отслеживание URI, для которых учётные данные аутентификации всегда должны отправляться.
-
HTTPPasswordMgrWithPriorAuth.add_password(realm, uri, user, passwd, is_authenticated=False) -
realm, uri, user, passwd — такие же, как для
HTTPPasswordMgr.add_password(). is_authenticated устанавливает начальное значение флагаis_authenticatedдля данного URI или списка URI. Если is_authenticated задано какTrue, realm игнорируется.
-
HTTPPasswordMgr.find_user_password(realm, authuri) -
То же, что и для объектов
HTTPPasswordMgrWithDefaultRealm
-
HTTPPasswordMgrWithPriorAuth.update_authenticated(self, uri, is_authenticated=False) -
Обновление флага
is_authenticatedдля данного uri или списка URI.
-
HTTPPasswordMgrWithPriorAuth.is_authenticated(self, authuri) -
Возвращает текущее состояние флага
is_authenticatedдля данного URI.
Объекты AbstractBasicAuthHandler
-
AbstractBasicAuthHandler.http_error_auth_reqed(authreq, host, req, headers) -
Обработка запроса на аутентификацию, получая пару имя пользователя/пароль и повторно выполняя запрос. authreq должен быть именем заголовка, где в запросе содержится информация о realm, host определяет URL и путь для аутентификации, req должен быть объектом (неудачного)
Request, а headers — заголовки ошибки.host — это либо авторитет (например,
"python.org"), либо URL, содержащий компонент авторитета (например,"http://python.org/"). В обоих случаях компонент авторитета не должен содержать компонент userinfo (то есть"python.org"и"python.org:80"в порядке,"joe:password@python.org"— нет).
Объекты HTTPBasicAuthHandler
-
HTTPBasicAuthHandler.http_error_401(req, fp, code, msg, hdrs) -
Повторный запрос с информацией об аутентификации, если она доступна.
Объекты ProxyBasicAuthHandler
-
ProxyBasicAuthHandler.http_error_407(req, fp, code, msg, hdrs) -
Повторный запрос с информацией об аутентификации, если она доступна.
Объекты AbstractDigestAuthHandler
-
AbstractDigestAuthHandler.http_error_auth_reqed(authreq, host, req, headers) -
authreq должен быть именем заголовка, где в запросе содержится информация о realm, host — хост, к которому требуется аутентификация, req — объект (неудачного)
Request, а headers — заголовки ошибки.
Объекты HTTPDigestAuthHandler
-
HTTPDigestAuthHandler.http_error_401(req, fp, code, msg, hdrs) -
Повторный запрос с информацией об аутентификации, если она доступна.
Объекты ProxyDigestAuthHandler
-
ProxyDigestAuthHandler.http_error_407(req, fp, code, msg, hdrs) -
Повторный запрос с информацией об аутентификации, если она доступна.
Объекты HTTPHandler
-
HTTPHandler.http_open(req) -
Отправка HTTP-запроса, который может быть либо GET, либо POST, в зависимости от
req.has_data().
Объекты HTTPSHandler
-
HTTPSHandler.https_open(req) -
Отправка HTTPS-запроса, который может быть либо GET, либо POST, в зависимости от
req.has_data().
Объекты FileHandler
-
FileHandler.file_open(req) -
Открытие файла локально, если нет имени хоста или имя хоста равно
'localhost'.Изменено в версии 3.2: Этот метод применим только для локальных имён хостов. При указании удалённого имени хоста генерируется исключение
URLError.
Объекты DataHandler
-
DataHandler.data_open(req) -
Чтение URL-адреса данных. Такой URL содержит содержимое, закодированное в самом URL. Синтаксис URL-адресов данных указан в RFC 2397. Эта реализация игнорирует пробелы в закодированных в base64 данных URL, поэтому URL может быть обернут в любой исходный файл, откуда он происходит. Но даже если некоторые браузеры не возражают против отсутствующей подпаковки в конце закодированного в base64 URL-адреса данных, эта реализация вызовет
ValueErrorв таком случае.
Объекты FTPHandler
-
FTPHandler.ftp_open(req) -
Открытие FTP-файла, указанного в req. Вход выполняется всегда с пустыми именем пользователя и паролем.
Объекты CacheFTPHandler
CacheFTPHandler — это объекты FTPHandler со следующими дополнительными методами:
-
CacheFTPHandler.setTimeout(t) -
Установка таймаута подключений на t секунд.
-
CacheFTPHandler.setMaxConns(m) -
Установка максимального количества кэшированных подключений на m.
Объекты UnknownHandler
-
UnknownHandler.unknown_open() -
Вызов исключения
URLError.
Объекты HTTPErrorProcessor
-
HTTPErrorProcessor.http_response(request, response) -
Обработка HTTP-ответов об ошибках.
Для кода ошибки 200 объект ответа возвращается немедленно.
Для кодов ошибок, отличных от 200, эта функция просто передаёт задачу методам обработчика
http_error_<type>()черезOpenerDirector.error(). В конечном итоге,HTTPDefaultErrorHandlerсгенерируетHTTPError, если ни один другой обработчик не обработает ошибку.
-
HTTPErrorProcessor.https_response(request, response) -
Обработка HTTPS-ответов об ошибках.
Поведение аналогично
http_response().
Примеры
Помимо примеров ниже, дополнительные примеры приведены в ИНСТРУКЦИЯ Поиск ресурсов в Интернете с использованием пакета urllib.
В этом примере извлекается главная страница python.org и отображаются первые 300 байт.
>>> import urllib.request
>>> with urllib.request.urlopen('http://www.python.org/') as f:
... print(f.read(300))
...
b'<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">\n\n\n<html
xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">\n\n<head>\n
<meta http-equiv="content-type" content="text/html; charset=utf-8" />\n
<title>Python Programming '
Обратите внимание, что urlopen возвращает объект bytes. Это связано с тем, что urlopen не может автоматически определить кодировку потока байтов, полученного от HTTP-сервера. В общем случае программа декодирует возвращённый объект bytes в строку, как только определит или предположит соответствующую кодировку.
В следующем документе W3C, https://www.w3.org/International/O-charset, перечислены различные способы, которыми документ (X)HTML или XML может указать информацию об кодировке.
Поскольку веб-сайт python.org использует кодировку utf-8, как указано в его теге meta, мы будем использовать её же для декодирования объекта байтов.
>>> with urllib.request.urlopen('http://www.python.org/') as f:
... print(f.read(100).decode('utf-8'))
...
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtm
Также можно добиться того же результата без использования подхода с менеджером контекста.
>>> import urllib.request
>>> f = urllib.request.urlopen('http://www.python.org/')
>>> print(f.read(100).decode('utf-8'))
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtm
В следующем примере мы отправляем поток данных в стандартный ввод CGI и считываем данные, которые он возвращает. Обратите внимание, что этот пример будет работать только в том случае, если ваша установка Python поддерживает SSL.
>>> import urllib.request
>>> req = urllib.request.Request(url='https://localhost/cgi-bin/test.cgi',
... data=b'This data is passed to stdin of the CGI')
>>> with urllib.request.urlopen(req) as f:
... print(f.read().decode('utf-8'))
...
Got Data: "This data is passed to stdin of the CGI"
Код примера CGI, используемого в вышеприведённом примере:
#!/usr/bin/env python
import sys
data = sys.stdin.read()
print('Content-type: text/plain\n\nGot Data: "%s"' % data)
Вот пример выполнения запроса PUT с помощью Request:
import urllib.request
DATA = b'some data'
req = urllib.request.Request(url='http://localhost:8080', data=DATA,method='PUT')
with urllib.request.urlopen(req) as f:
pass
print(f.status)
print(f.reason)
Использование аутентификации HTTP Basic:
import urllib.request
# Create an OpenerDirector with support for Basic HTTP Authentication...
auth_handler = urllib.request.HTTPBasicAuthHandler()
auth_handler.add_password(realm='PDQ Application',
uri='https://mahler:8092/site-updates.py',
user='klem',
passwd='kadidd!ehopper')
opener = urllib.request.build_opener(auth_handler)
# ...and install it globally so it can be used with urlopen.
urllib.request.install_opener(opener)
urllib.request.urlopen('http://www.example.com/login.html')
build_opener() по умолчанию предоставляет множество обработчиков, включая ProxyHandler. По умолчанию ProxyHandler использует переменные среды, именованные <scheme>_proxy, где <scheme> — используемая схема URL. Например, переменная среды http_proxy используется для получения URL-адреса прокси-сервера HTTP.
В этом примере обработчик ProxyHandler заменяется на обработчик с программно заданными URL-адресами прокси и добавляется поддержка авторизации прокси с помощью ProxyBasicAuthHandler.
proxy_handler = urllib.request.ProxyHandler({'http': 'http://www.example.com:3128/'})
proxy_auth_handler = urllib.request.ProxyBasicAuthHandler()
proxy_auth_handler.add_password('realm', 'host', 'username', 'password')
opener = urllib.request.build_opener(proxy_handler, proxy_auth_handler)
# This time, rather than install the OpenerDirector, we use it directly:
opener.open('http://www.example.com/login.html')
Добавление заголовков HTTP:
Используйте аргумент headers конструктора Request или:
import urllib.request
req = urllib.request.Request('http://www.example.com/')
req.add_header('Referer', 'http://www.python.org/')
# Customize the default User-Agent header value:
req.add_header('User-Agent', 'urllib-example/0.1 (Contact: . . .)')
r = urllib.request.urlopen(req)
OpenerDirector автоматически добавляет заголовок User-Agent к каждому Request. Для изменения этого:
import urllib.request
opener = urllib.request.build_opener()
opener.addheaders = [('User-agent', 'Mozilla/5.0')]
opener.open('http://www.example.com/')
Также помните, что несколько стандартных заголовков (Content-Length, Content-Type и Host) добавляются, когда Request передаётся в urlopen() (или OpenerDirector.open()).
Вот пример сеанса, который использует метод GET для получения URL-адреса, содержащего параметры:
>>> import urllib.request
>>> import urllib.parse
>>> params = urllib.parse.urlencode({'spam': 1, 'eggs': 2, 'bacon': 0})
>>> url = "http://www.musi-cal.com/cgi-bin/query?%s" % params
>>> with urllib.request.urlopen(url) as f:
... print(f.read().decode('utf-8'))
...
Следующий пример использует метод POST вместо этого. Обратите внимание, что параметры, выводимые из urlencode, кодируются в байты перед отправкой в urlopen как данные:
>>> import urllib.request
>>> import urllib.parse
>>> data = urllib.parse.urlencode({'spam': 1, 'eggs': 2, 'bacon': 0})
>>> data = data.encode('ascii')
>>> with urllib.request.urlopen("http://requestb.in/xrbl82xr", data) as f:
... print(f.read().decode('utf-8'))
...
Следующий пример использует явно указанный прокси-сервер HTTP, игнорируя настройки среды:
>>> import urllib.request
>>> proxies = {'http': 'http://proxy.example.com:8080/'}
>>> opener = urllib.request.FancyURLopener(proxies)
>>> with opener.open("http://www.python.org") as f:
... f.read().decode('utf-8')
...
Следующий пример не использует прокси-серверы вообще, переопределяя настройки среды:
>>> import urllib.request
>>> opener = urllib.request.FancyURLopener({})
>>> with opener.open("http://www.python.org/") as f:
... f.read().decode('utf-8')
...
Легендарный интерфейс
Следующие функции и классы перенесены из модуля Python 2 urllib (в отличие от urllib2). Они могут быть устаревшими в будущем.
-
urllib.request.urlretrieve(url, filename=None, reporthook=None, data=None) -
Копирует сетевой объект, обозначенный URL-адресом, в локальный файл. Если URL указывает на локальный файл, объект не будет скопирован, если не указан параметр filename. Возвращает кортеж
(filename, headers), где filename — имя локального файла, в котором находится объект, а headers — всё, что вернул методinfo()объекта, возвращённогоurlopen()(для удалённого объекта). Исключение соответствуетurlopen().Второй аргумент, если он есть, указывает расположение файла для копирования (если отсутствует, расположение будет временным файлом с сгенерированным именем). Третий аргумент, если он есть, — вызываемый объект, который будет вызван один раз после установления сетевого соединения и один раз после каждого последующего чтения блока. Вызываемый объект будет получать три аргумента: количество переданных блоков до сих пор, размер блока в байтах и общий размер файла. Третий аргумент может быть
-1на более старых серверах FTP, которые не возвращают размер файла в ответ на запрос на извлечение.Следующий пример иллюстрирует наиболее распространённый сценарий использования:
>>> import urllib.request >>> local_filename, headers = urllib.request.urlretrieve('http://python.org/') >>> html = open(local_filename) >>> html.close()Если url использует идентификатор схемы
http:, необязательный аргумент data может быть передан для указания запросаPOST(обычно тип запросаGET). Аргумент data должен быть объектом байтов в стандартном формате application/x-www-form-urlencoded; см. функциюurllib.parse.urlencode().urlretrieve()будет подниматьContentTooShortErrorпри обнаружении того, что доступный объём данных был меньше ожидаемого объёма (который указан в заголовке Content-Length). Это может произойти, например, при прерывании загрузки.Content-Length рассматривается как нижняя граница: если нужно прочитать больше данных, urlretrieve прочитает больше данных, но если доступно меньше данных, то он поднимет исключение.
В этом случае вы всё ещё можете получить загруженные данные, они хранятся в атрибуте
contentэкземпляра исключения.Если заголовок Content-Length не был предоставлен, urlretrieve не может проверить размер загруженных данных и просто возвращает их. В этом случае вы просто можете предположить, что загрузка прошла успешно.
-
urllib.request.urlcleanup() -
Очищает временные файлы, которые могут остаться после предыдущих вызовов
urlretrieve().
-
class urllib.request.URLopener(proxies=None, **x509) -
Устарело начиная с версии 3.3.
Базовый класс для открытия и чтения URL-адресов. Если вам не нужно поддерживать открытие объектов, использующих схемы, отличные от
http:,ftp:, илиfile:, вы, вероятно, захотите использоватьFancyURLopener.По умолчанию класс
URLopenerотправляет заголовок User-Agent со значениемurllib/VVV, где VVV — номер версииurllib. Приложения могут определить свой собственный заголовок User-Agent, наследовавшись отURLopenerилиFancyURLopenerи установив атрибут классаversionв соответствующее строковое значение в определении подкласса.Необязательный параметр proxies должен быть словарем, сопоставляющим имена схем с URL-адресами прокси, где пустой словарь полностью отключает прокси. Его значение по умолчанию —
None, в этом случае будут использоваться системные настройки прокси, если они присутствуют, как обсуждается в определенииurlopen()выше.Дополнительные ключевые параметры, собранные в x509, могут использоваться для проверки подлинности клиента при использовании схемы
https:. Поддерживаются ключевые слова key_file и cert_file для предоставления SSL-ключа и сертификата; оба необходимы для поддержки проверки подлинности клиента.Объекты
URLopenerбудут генерировать исключениеOSError, если сервер вернёт код ошибки.-
open(fullurl, data=None) -
Открывает fullurl с использованием соответствующего протокола. Этот метод настраивает кеширование и прокси, а затем вызывает соответствующий метод open со своими входными аргументами. Если схема не распознаётся, вызывается
open_unknown(). Аргумент data имеет такое же значение, как и аргумент data вurlopen().Этот метод всегда использует функцию
quote()для экранирования fullurl.
-
open_unknown(fullurl, data=None) -
Переопределяемый интерфейс для открытия неизвестных типов URL.
-
retrieve(url, filename=None, reporthook=None, data=None) -
Извлекает содержимое url и помещает его в filename. Результатом является кортеж, состоящий из локального имени файла и объекта
email.message.Message(для удалённых URL), содержащего заголовки ответа, илиNone(для локальных URL). Затем вызывающая сторона должна открыть и прочитать содержимое filename. Если filename не указан и URL ссылается на локальный файл, возвращается имя входного файла. Если URL не локальный и filename не указан, имя файла — результат вызоваtempfile.mktemp()с суффиксом, соответствующим суффиксу последнего компонента пути входного URL. Если указан reporthook, он должен быть функцией, принимающей три числовых параметра: номер блока, максимальный размер блоков для чтения и общий размер загрузки (-1, если неизвестен). Он будет вызван один раз в начале и после каждого блока данных, прочитанных из сети. reporthook игнорируется для локальных URL.Если url использует схему
http:, необязательный аргумент data может быть указан для задания запросаPOST(обычно тип запросаGET). Аргумент data должен иметь стандартный формат application/x-www-form-urlencoded; см. функциюurllib.parse.urlencode().
-
version -
Переменная, которая определяет пользовательского агента объекта open-раскрывателя. Чтобы заставить
urllibсообщить серверам, что это определённый пользовательский агент, установите это значение в подклассе как переменную класса или в конструкторе перед вызовом базового конструктора.
-
-
class urllib.request.FancyURLopener(...) -
Устарело начиная с версии 3.3.
FancyURLopenerнаследуется отURLopenerи предоставляет обработку по умолчанию для следующих кодов HTTP-ответов: 301, 302, 303, 307 и 401. Для кодов ответов 30x, перечисленных выше, используется заголовок Location для получения фактического URL-адреса. Для кодов ответов 401 (требуется аутентификация) выполняется базовая аутентификация HTTP. Для кодов ответов 30x рекурсия ограничена значением атрибута maxtries, который по умолчанию равен 10.Для всех остальных кодов ответов вызывается метод
http_error_default(), который можно переопределить в подклассах для обработки ошибки соответствующим образом.Примечание
Согласно RFC 2616, ответы 301 и 302 на POST-запросы не должны автоматически перенаправляться без подтверждения от пользователя. На практике браузеры разрешают автоматическое перенаправление этих ответов, изменяя POST на GET, и
urllibвоспроизводит это поведение.Параметры конструктора такие же, как и для
URLopener.Примечание
При выполнении базовой аутентификации экземпляр
FancyURLopenerвызывает свой методprompt_user_passwd(). Реализация по умолчанию запрашивает у пользователей необходимую информацию на контролируемом терминале. Подкласс может переопределить этот метод, чтобы обеспечить более подходящее поведение при необходимости.Класс
FancyURLopenerпредлагает один дополнительный метод, который следует перегрузить, чтобы обеспечить нужное поведение:-
prompt_user_passwd(host, realm) -
Возвращает информацию, необходимую для аутентификации пользователя на заданном хосте в указанной области безопасности. Значение должно быть кортежем,
(user, password), который может быть использован для базовой аутентификации.Реализация запрашивает эту информацию на терминале; приложение должно переопределить этот метод, чтобы использовать подходящую модель взаимодействия в локальной среде.
-
Ограничения urllib.request
-
В настоящее время поддерживаются только следующие протоколы: HTTP (версии 0.9 и 1.0), FTP, локальные файлы и данные URL.
Изменено в версии 3.4: Добавлена поддержка данных URL.
- Функция кеширования
urlretrieve()отключена до тех пор, пока кто-то не найдёт время для реализации правильной обработки заголовков времени истечения срока действия. - Должна быть функция для проверки, присутствует ли определённый URL в кэше.
- Для обеспечения обратной совместимости, если URL, по-видимому, указывает на локальный файл, но файл не может быть открыт, URL повторно интерпретируется с использованием протокола FTP. Это может иногда вызывать путающие сообщения об ошибках.
- Функции
urlopen()иurlretrieve()могут вызывать произвольно длительные задержки при ожидании установки сетевого соединения. Это затрудняет создание интерактивного веб-клиента с использованием этих функций без использования потоков. - Данные, возвращаемые функциями
urlopen()илиurlretrieve(), представляют собой сырые данные, возвращённые сервером. Это могут быть двоичные данные (например, изображение), обычный текст или (например) HTML. Протокол HTTP предоставляет информацию о типе в заголовке ответа, которую можно проверить, посмотрев заголовок Content-Type. Если возвращённые данные являются HTML, вы можете использовать модульhtml.parserдля их разбора. - Код, обрабатывающий протокол FTP, не может различать файл и директорию. Это может привести к неожиданному поведению при попытке чтения URL, указывающего на файл, который недоступен. Если URL заканчивается на
/, предполагается, что он ссылается на директорию, и будет обработано соответствующим образом. Но если попытка чтения файла приводит к ошибке 550 (означающей, что URL не найден или недоступен, часто по причинам разрешений), то путь обрабатывается как директория, чтобы обработать случай, когда директория указана в URL, но заключительный/отсутствует. Это может привести к вводящим в заблуждение результатам, когда вы пытаетесь извлечь файл, чьи права доступа к чтению делают его недоступным; код FTP попытается прочитать его, потерпит неудачу с ошибкой 550, а затем выполнит список директорий для нечитаемого файла. Если требуется точный контроль, рассмотрите возможность использования модуляftplib, наследования классаFancyURLopenerили изменения _urlopener в соответствии со своими потребностями.
urllib.response — Классы ответов, используемые urllib
Модуль urllib.response определяет функции и классы, которые определяют минимальный интерфейс типа файла, включая read() и readline(). Типичный объект ответа — это экземпляр addinfourl, который определяет метод info() и возвращает заголовки, и метод geturl(), который возвращает URL. Функции, определённые в этом модуле, используются внутри модуля urllib.request.
© 2001–2020 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.7/library/urllib.request.html