urllib.request — Расширяемая библиотека для открытия URL-адресов
Исходный код: Lib/urllib/request.py
Модуль urllib.request определяет функции и классы, которые помогают открывать URL-адреса (в основном HTTP) в сложном мире — базовая и digest-аутентификация, перенаправления, куки и многое другое.
См. также
Для более высокого уровня интерфейса 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равно true).Добавлено в версии 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, который цепляет обработчики в заданном порядке. handlers могут быть либо экземплярамиBaseHandler, либо подклассамиBaseHandler(в этом случае конструктор должен быть вызываем без параметров). Экземпляры следующих классов будут стоять перед handlers, если они не содержат их, экземпляры или подклассы этих классов:ProxyHandler(если обнаружены настройки прокси),UnknownHandler,HTTPHandler,HTTPDefaultErrorHandler,HTTPRedirectHandler,FTPHandler,FileHandler,HTTPErrorProcessor.Если в установке Python есть поддержка SSL (то есть, модуль
sslможет быть импортирован), также будет добавленHTTPSHandler.Подкласс
BaseHandlerтакже может изменить свой атрибутhandler_orderдля изменения своего положения в списке обработчиков.
-
urllib.request.pathname2url(path) -
Преобразует путь path из локального синтаксиса пути в форму, используемую в компоненте пути URL. Это не создаёт полную ссылку. Возвращаемое значение уже закодировано с помощью функции
quote().
-
urllib.request.url2pathname(path) -
Преобразуйте компонент пути path из URL с кодировкой процентов в локальный синтаксис пути. Эта функция не принимает полный URL. Эта функция использует
unquote()для декодирования path.
-
urllib.request.getproxies() -
Эта вспомогательная функция возвращает словарь сопоставлений схем к URL-адресам прокси-серверов. Она сканирует среду переменных, названных
<scheme>_proxy, в регистронезависимом формате для всех операционных систем, а затем, при отсутствии информации, ищет данные прокси из настроек системы Mac OSX для 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-cookie:
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ни объекту байтов. Вместо этого используйте кодировку chunked transfer encoding по умолчанию.
-
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 Authentication Handler, так и Basic Authentication Handler добавлены, Digest Authentication всегда пробуется первой. Если Digest Authentication возвращает ответ 40x снова, он отправляется в Basic Authentication handler для обработки. Этот метод обработчика вызовет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-ошибок.
21.6.1. Объекты запроса
Следующие методы описывают публичный интерфейс 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, удалены.
21.6.2. Объекты OpenerDirector
OpenerDirector экземпляры имеют следующие методы:
-
OpenerDirector.add_handler(handler) -
handler должен быть экземпляром
BaseHandler. Ищутся следующие методы и добавляются в возможные цепочки (обратите внимание, что HTTP-ошибки являются особым случаем).-
protocol_open()— сигнал о том, что обработчик знает, как открыть URL-адреса протокола protocol. -
http_error_type()— сигнал о том, что обработчик знает, как обрабатывать HTTP-ошибки с кодом ошибки type. -
protocol_error()— сигнал о том, что обработчик знает, как обрабатывать ошибки из (не-http) protocol. -
protocol_request()— сигнал о том, что обработчик знает, как предварительно обрабатывать запросы protocol. -
protocol_response()— сигнал о том, что обработчик знает, как постобрабатывать ответы protocol.
-
-
OpenerDirector.open(url, data=None[, timeout]) -
Открывает указанный url (который может быть объектом запроса или строкой), необязательно передавая заданные data. Аргументы, возвращаемые значения и исключения, которые могут быть подняты, такие же, как у
urlopen()(который просто вызывает методopen()на текущем глобальномOpenerDirector). Необязательный параметр timeout задает время ожидания в секундах для блокирующих операций, таких как попытка соединения (если не указано, будет использоваться глобальное значение по умолчанию). Функция таймаута фактически работает только для соединений HTTP, HTTPS и FTP.
-
OpenerDirector.error(proto, *args) -
Обрабатывает ошибку указанного протокола. Это вызовет зарегистрированные обработчики ошибок для данного протокола с заданными аргументами (которые специфичны для протокола). Протокол HTTP является особым случаем, который использует код ответа HTTP для определения конкретного обработчика ошибок; обратитесь к методам
http_error_*()классов обработчиков.Возвращаемые значения и поднимаемые исключения такие же, как у
urlopen().
Объекты OpenerDirector открывают URL-адреса в трех этапах:
Порядок вызова этих методов в каждом этапе определяется сортировкой экземпляров обработчиков.
- Каждый обработчик с методом, подобным
protocol_request(), вызывает этот метод для предварительной обработки запроса. -
Обработчики с методом, подобным
protocol_open(), вызываются для обработки запроса. Этот этап завершается, когда обработчик возвращает значение, отличное отNone(т.е. ответ) или вызывает исключение (обычноURLError). Исключения допускается распространять.Фактически, алгоритм сначала пробуется для методов, подобных
default_open(). Если все такие методы возвращаютNone, алгоритм повторяется для методов, подобныхprotocol_open(). Если все такие методы возвращаютNone, алгоритм повторяется для методов, подобныхunknown_open().Обратите внимание, что реализация этих методов может включать вызовы метода
OpenerDirectorродительского экземпляраopen()иerror(). - Каждый обработчик с методом, подобным
protocol_response(), вызывает этот метод для постобработки ответа.
21.6.3. Объекты 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().
21.6.4. Объекты HTTPRedirectHandler
Примечание
Некоторые перенаправления HTTP требуют действий со стороны кода клиента данного модуля. В этом случае поднимается исключение HTTPError. Подробности о точном значении различных кодов перенаправления см. в RFC 2616.
Исключение HTTPError поднимается в качестве меры безопасности, если HTTPRedirectHandler получает перенаправленный URL, который не является URL-адресом HTTP, HTTPS или FTP.
-
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) -
Перенаправление на
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(), но вызывается для ответа ‘временное перенаправление’.
21.6.5. Объекты HTTPCookieProcessor
-
The
http.cookiejar.CookieJarв котором хранятся cookie.
21.6.6. Объекты ProxyHandler
-
ProxyHandler.protocol_open(request) -
У
ProxyHandlerбудет методprotocol_open()для каждого протокола, у которого есть прокси-сервер в словаре proxies, заданном в конструкторе. Метод будет изменять запросы, чтобы они проходили через прокси-сервер, вызываяrequest.set_proxy(), и вызовет следующий обработчик в цепочке для фактического выполнения протокола.
21.6.7. Объекты HTTPPasswordMgr
Эти методы доступны для объектов 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) -
Получить имя пользователя/пароль для заданного домена и URI, если они есть. Этот метод вернёт
(None, None)если нет соответствующего имени пользователя/пароля.Для объектов
HTTPPasswordMgrWithDefaultRealmбудет проверен доменNoneесли у заданного домена нет соответствующего имени пользователя/пароля.
21.6.8. Объекты HTTPPasswordMgrWithPriorAuth
Этот менеджер паролей расширяет HTTPPasswordMgrWithDefaultRealm для поддержки отслеживания URI, для которых данные аутентификации должны всегда отправляться.
-
HTTPPasswordMgrWithPriorAuth.add_password(realm, uri, user, passwd, is_authenticated=False) -
домен, uri, имя_пользователя, пароль — как для
HTTPPasswordMgr.add_password(). аутентифицирован устанавливает начальное значение флагаis_authenticatedдля заданного URI или списка URI. Если аутентифицирован указан какTrue, домен игнорируется.
-
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.
21.6.9. Объекты AbstractBasicAuthHandler
-
AbstractBasicAuthHandler.http_error_auth_reqed(authreq, host, req, headers) -
Обработка запроса на аутентификацию путём получения пары имя пользователя/пароль и повторной попытки запроса. authreq — имя заголовка, содержащего информацию о домене в запросе, host — URL и путь для аутентификации, req — (неуспешный) объект
Request, а headers — заголовки ошибки.host — это либо авторитет (например,
"python.org"), либо URL, содержащий компонент авторитета (например,"http://python.org/"). В любом случае, авторитет не должен содержать компонент userinfo (т.е."python.org"и"python.org:80"допустимы,"joe:password@python.org"— нет).
21.6.10. Объекты HTTPBasicAuthHandler
-
HTTPBasicAuthHandler.http_error_401(req, fp, code, msg, hdrs) -
Повторная попытка запроса с информацией об аутентификации, если она доступна.
21.6.11. Объекты ProxyBasicAuthHandler
-
ProxyBasicAuthHandler.http_error_407(req, fp, code, msg, hdrs) -
Повторная попытка запроса с информацией об аутентификации, если она доступна.
21.6.12. Объекты AbstractDigestAuthHandler
-
AbstractDigestAuthHandler.http_error_auth_reqed(authreq, host, req, headers) -
authreq — имя заголовка, содержащего информацию о домене в запросе, host — хост, к которому необходимо выполнить аутентификацию, req — (неуспешный) объект
Request, а headers — заголовки ошибки.
21.6.13. Объекты HTTPDigestAuthHandler
-
HTTPDigestAuthHandler.http_error_401(req, fp, code, msg, hdrs) -
Повторная попытка запроса с информацией об аутентификации, если она доступна.
21.6.14. Объекты ProxyDigestAuthHandler
-
ProxyDigestAuthHandler.http_error_407(req, fp, code, msg, hdrs) -
Повторная попытка запроса с информацией об аутентификации, если она доступна.
21.6.15. Объекты HTTPHandler
-
HTTPHandler.http_open(req) -
Отправка HTTP-запроса, который может быть GET или POST, в зависимости от
req.has_data().
21.6.16. Объекты HTTPSHandler
-
HTTPSHandler.https_open(req) -
Отправка HTTPS-запроса, который может быть GET или POST, в зависимости от
req.has_data().
21.6.17. Объекты FileHandler
-
FileHandler.file_open(req) -
Открытие файла локально, если нет имени хоста или имя хоста равно
'localhost'.Изменено в версии 3.2: Этот метод применим только к локальным именам хоста. При указании удалённого имени хоста возбуждается исключение
URLError.
21.6.18. Объекты DataHandler
-
DataHandler.data_open(req) -
Чтение URL данных. Такой URL содержит закодированное в нём содержание. Синтаксис URL данных определён в RFC 2397. Эта реализация игнорирует пробелы в закодированных данными base64 URL, поэтому URL может быть обернут в любой исходный файл, откуда он взялся. Но даже если некоторые браузеры не обращают внимания на отсутствие завершающего заполнения в закодированных данными base64 URL, эта реализация будет возбуждать
ValueErrorв этом случае.
21.6.19. Объекты FTPHandler
-
FTPHandler.ftp_open(req) -
Открытие FTP-файла, указанного в req. Авторизация всегда выполняется с пустым именем пользователя и паролем.
21.6.20. Объекты CacheFTPHandler
Объекты CacheFTPHandler — это объекты FTPHandler с дополнительными методами:
-
CacheFTPHandler.setTimeout(t) -
Установить таймаут подключений до t секунд.
-
CacheFTPHandler.setMaxConns(m) -
Установить максимальное количество кэшированных подключений до m.
21.6.21. Объекты UnknownHandler
-
UnknownHandler.unknown_open() -
Возбудить исключение
URLError.
21.6.22. Объекты HTTPErrorProcessor
-
HTTPErrorProcessor.http_response(request, response) -
Обработка ответов с HTTP-ошибками.
Для кодов ошибок 200 ответ возвращается немедленно.
Для кодов ошибок, отличных от 200, эта функция просто перенаправляет задачу методам обработчика
protocol_error_code()черезOpenerDirector.error(). В конечном счёте,HTTPDefaultErrorHandlerвозбудитHTTPError, если никакой другой обработчик не обработает ошибку.
-
HTTPErrorProcessor.https_response(request, response) -
Обработка ответов с HTTPS-ошибками.
Поведение аналогично
http_response().
21.6.23. Примеры
Помимо примеров ниже, больше примеров приведены в HOWTO Сбор данных из Интернета с помощью модуля 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 возвращает объект байтов. Это связано с тем, что urlopen не может автоматически определить кодировку потока байтов, полученного от HTTP-сервера. В целом, программа декодирует возвращённый объект байтов в строку, как только определит или предположит подходящую кодировку.
В следующем документе W3C, https://www.w3.org/International/O-charset, перечислены различные способы, которыми документ (X)HTML или XML может указать информацию о своей кодировке.
Так как веб-сайт python.org использует кодировку utf-8, как указано в его теге meta, мы будем использовать её же для декодирования объекта bytes.
>>> 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
В следующем примере мы отправляем поток данных в stdin CGI и считываем возвращенные данные. Обратите внимание, что этот пример будет работать только в том случае, если установка Python поддерживает SSL.
>>> import urllib.request
>>> req = urllib.request.Request(url='https://localhost/cgi-bin/test.cgi',
... data=b'This data is passed to stdin of the CGI')
>>> with urllib.request.urlopen(req) as f:
... print(f.read().decode('utf-8'))
...
Got Data: "This data is passed to stdin of the CGI"
Код образца CGI, используемого в вышеприведённом примере:
#!/usr/bin/env python
import sys
data = sys.stdin.read()
print('Content-type: text/plain\n\nGot Data: "%s"' % data)
Вот пример выполнения PUT запроса с помощью Request:
import urllib.request
DATA = b'some data'
req = urllib.request.Request(url='http://localhost:8080', data=DATA,method='PUT')
with urllib.request.urlopen(req) as f:
pass
print(f.status)
print(f.reason)
Использование базовой аутентификации HTTP:
import urllib.request
# 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.
В этом примере используется прокси, использующий URL-адреса, задаваемые программно, вместо стандартного ProxyHandler, и добавляет поддержку аутентификации прокси с помощью 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')
...
21.6.24. Интерфейс устаревшего типа
Следующие функции и классы перенесены из модуля 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 должен быть объектом bytes в стандартном формате 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().
-
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 -
Переменная, задающая пользовательского агента объекта открывателя. Для того, чтобы
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), который может быть использован для базовой аутентификации.Реализация запрашивает эту информацию на терминале; приложение должно переопределить этот метод для использования соответствующей модели взаимодействия в локальной среде.
-
21.6.25. Ограничения 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.6/library/urllib.request.html