Содержание страницы
urllib.request – Расширяемая библиотека для открытия URL¶urllib.request – Extensible library for opening URLs
Исходный код: 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 задают набор доверенных сертификатов ЦС для HTTPS-запросов. cafile должен указывать на один файл, содержащий набор сертификатов ЦС, а 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.Для URL с протоколами FTP, file и data, а также для запросов, явно обрабатываемых устаревшими классами
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.Стандартный открыватель возбуждает событие аудита
urllib.Requestс аргументамиfullurl,data,headers,method, взятыми из объекта запроса.Изменено в версии 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()выбрать доверенные сертификаты ЦС системы за вас.
-
urllib.request.install_opener(opener)¶ Устанавливает экземпляр
OpenerDirectorв качестве глобального открывателя по умолчанию. Установка открывателя необходима только в том случае, если требуется, чтобы urlopen использовал именно его; в противном случае просто вызывайтеOpenerDirector.open()вместоurlopen(). Код не проверяет, является ли объект настоящимOpenerDirector; подойдет любой класс с соответствующим интерфейсом.
-
urllib.request.build_opener([handler, ...])¶ Возвращает экземпляр
OpenerDirector, который объединяет обработчики в заданном порядке. обработчики могут быть либо экземплярамиBaseHandler, либо подклассамиBaseHandler(в этом случае должна быть возможность вызвать конструктор без параметров). Экземпляры следующих классов будут помещены перед обработчиками, если только обработчики не содержат их, их экземпляры или подклассы: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. Для декодирования path используется
unquote().
-
urllib.request.getproxies()¶ Эта вспомогательная функция возвращает словарь, отображающий схемы в URL-адреса прокси-серверов. Она сканирует окружение на наличие переменных с именем
<scheme>_proxy, без учета регистра, сначала для всех операционных систем, а если не находит, ищет информацию о прокси в настройках System Configuration для Mac OS X и в реестре для 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 must be an object specifying additional data to send to the server, or
Noneif no such data is needed. Currently HTTP requests are the only ones that use data. The supported object types include bytes, file-like objects, and iterables of bytes-like objects. If noContent-LengthnorTransfer-Encodingheader field has been provided,HTTPHandlerwill set these headers according to the type of data.Content-Lengthwill be used to send bytes objects, whileTransfer-Encoding: chunkedas specified in RFC 7230, Section 3.3.1 will be used to send files and other iterables.Для метода запроса HTTP POST data должен быть буфером в стандартном формате application/x-www-form-urlencoded. Функция
urllib.parse.urlencode()принимает отображение или последовательность кортежей из двух элементов и возвращает строку 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-куки:
origin_req_host should be the request-host of the origin transaction, as defined by RFC 2965. It defaults to
http.cookiejar.request_host(self). This is the host name or IP address of the original request that was initiated by the user. For example, if the request is for an image in an HTML document, this should be the request-host of the request for the page containing the image.unverifiable should indicate whether the request is unverifiable, as defined by RFC 2965. It defaults to
False. An unverifiable request is one whose URL the user did not have the option to approve. For example, if the request is for an image in an HTML document, and the user had no option to approve the automatic fetching of the image, this should be true.method должен быть строкой, указывающей метод HTTP-запроса, который будет использоваться (например,
'HEAD'). Если указан, его значение сохраняется в атрибутеmethodи используетсяget_method(). По умолчанию используется'GET', если data равенNone, и'POST'в противном случае. Подклассы могут указать другой метод по умолчанию, установив атрибутmethodв самом классе.Примечание
Запрос не будет работать должным образом, если объект data не может предоставить своё содержимое более одного раза (например, файл или итерируемый объект, который может создать содержимое только один раз), и запрос повторяется из-за HTTP-перенаправлений или аутентификации. data отправляется на HTTP-сервер сразу после заголовков. В библиотеке нет поддержки ожидания 100-continue.
Изменено в версии 3.3: Добавлен аргумент
Request.methodв класс Request.Изменено в версии 3.4: Метод по умолчанию
Request.methodможет быть указан на уровне класса.Изменено в версии 3.6: Не вызывать ошибку, если
Content-Lengthне был предоставлен, а data не является ниNone, ни объектом bytes. Вместо этого использовать чанкованное кодирование передачи.
-
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-куки.
-
class
urllib.request.ProxyHandler(proxies=None)¶ Заставляет запросы проходить через прокси. Если указан proxies, это должен быть словарь, отображающий имена протоколов в URL-адреса прокси. По умолчанию список прокси читается из переменных окружения
<protocol>_proxy. Если переменные окружения для прокси не заданы, то в среде Windows настройки прокси берутся из раздела Internet Settings реестра, а в среде Mac OS X информация о прокси извлекается из OS X System Configuration Framework.Чтобы отключить автоматически обнаруженный прокси, передайте пустой словарь.
Переменная окружения
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). Область (realm)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 Objects для получения информации об интерфейсе, который необходимо поддерживать. Если passwd_mgr также предоставляет методыis_authenticatedиupdate_authenticated(см. HTTPPasswordMgrWithPriorAuth Objects), то обработчик будет использовать результат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 Objects для получения информации об интерфейсе, который необходимо поддерживать. HTTPBasicAuthHandler вызоветValueErrorпри получении неправильной схемы аутентификации.
-
class
urllib.request.ProxyBasicAuthHandler(password_mgr=None)¶ Управляет аутентификацией с прокси. password_mgr, если указан, должен быть совместим с
HTTPPasswordMgr; обращайтесь к разделу HTTPPasswordMgr Objects за информацией об интерфейсе, который должен поддерживаться.
-
class
urllib.request.AbstractDigestAuthHandler(password_mgr=None)¶ Это миксин-класс, который помогает с HTTP-аутентификацией как на удалённом хосте, так и через прокси. Если передан password_mgr, он должен быть совместимым с
HTTPPasswordMgr; обратитесь к разделу HTTPPasswordMgr Objects для получения информации об интерфейсе, который необходимо поддерживать.
-
class
urllib.request.HTTPDigestAuthHandler(password_mgr=None)¶ Управляет аутентификацией с удалённым хостом. password_mgr, если указан, должен быть совместим с
HTTPPasswordMgr; обращайтесь к разделу HTTPPasswordMgr Objects за информацией об интерфейсе, который должен поддерживаться. Когда добавлены обработчик дайджест-аутентификации (Digest Authentication Handler) и обработчик базовой аутентификации (Basic Authentication Handler), дайджест-аутентификация всегда выполняется первой. Если дайджест-аутентификация снова возвращает ответ 40x, он передаётся обработчику базовой аутентификации. Этот метод обработчика вызовет исключениеValueErrorпри использовании схемы аутентификации, отличной от Digest или Basic.Изменено в версии 3.3: Возбуждает исключение
ValueErrorпри неподдерживаемой схеме аутентификации.
-
class
urllib.request.ProxyDigestAuthHandler(password_mgr=None)¶ Управляет аутентификацией с прокси. password_mgr, если указан, должен быть совместим с
HTTPPasswordMgr; обращайтесь к разделу HTTPPasswordMgr Objects за информацией об интерфейсе, который должен поддерживаться.
-
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¶ Открывает data-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 Objects
Следующие методы описывают открытый интерфейс 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.dataравноNone, или'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 заменят соответствующие значения экземпляра, а selector экземпляра будет содержать исходный 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 Objects
Экземпляры OpenerDirector имеют следующие методы:
-
OpenerDirector.add_handler(handler)¶ handler должен быть экземпляром
BaseHandler. Поиск осуществляется среди следующих методов, и они добавляются в возможные цепочки (обратите внимание: ошибки HTTP являются особым случаем). Обратите внимание, что в следующих методах протокол следует заменить на фактический обрабатываемый протокол, напримерhttp_response()будет обработчиком ответа протокола HTTP. Кроме того, type следует заменить на фактический код HTTP, напримерhttp_error_404()будет обрабатывать ошибки HTTP 404.<protocol>_open()– сигнал о том, что обработчик умеет открывать URL протокол.Подробнее см.
BaseHandler.<protocol>_open().http_error_<type>()– сигнал о том, что обработчик умеет обрабатывать ошибки HTTP с кодом ошибки HTTP type.Подробнее см.
BaseHandler.http_error_<nnn>().<protocol>_error()– сигнал о том, что обработчик умеет обрабатывать ошибки от (не-http) протокол.<protocol>_request()– сигнал о том, что обработчик умеет предварительно обрабатывать запросы протокол.Подробнее см.
BaseHandler.<protocol>_request().<protocol>_response()– сигнал о том, что обработчик умеет постобрабатывать ответы протокол.Подробнее см.
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().Обратите внимание, что реализация этих методов может включать вызовы методов
open()иerror()родительского экземпляраOpenerDirector.Каждый обработчик, имеющий метод с именем
<protocol>_response(), вызывает этот метод для постобработки ответа.
Объекты BaseHandler¶BaseHandler Objects
Объекты BaseHandler предоставляют несколько методов, которые непосредственно полезны, а также другие методы, предназначенные для использования производными классами. Они предназначены для прямого использования:
-
BaseHandler.add_parent(director)¶ Добавляет директор в качестве родителя.
-
BaseHandler.close()¶ Удаляет всех родителей.
Следующие атрибут и методы должны использоваться только классами, производными от
BaseHandler.
Примечание
Принято соглашение, что подклассы, определяющие методы <protocol>_request() или <protocol>_response(), называются *Processor; все остальные называются *Handler.
-
BaseHandler.parent¶ Действительный
OpenerDirector, который можно использовать для открытия через другой протокол или для обработки ошибок.
-
BaseHandler.default_open(req)¶ Этот метод не определён в
BaseHandler, но подклассы должны определить его, если хотят перехватывать все URL.Этот метод, если он реализован, будет вызван родительским
OpenerDirector. Он должен вернуть файлоподобный объект, как описано в возвращаемом значенииopen()изOpenerDirector, илиNone. Он должен возбуждатьURLError, если только не происходит действительно исключительная ситуация (например,MemoryErrorне следует отображать вURLError).Этот метод будет вызван перед любым методом открытия, специфичным для протокола.
-
BaseHandler.<protocol>_open(req) Этот метод не определён в
BaseHandler, но подклассы должны определить его, если хотят обрабатывать URL с указанным протоколом.Если этот метод определён, он будет вызван родительским
OpenerDirector. Возвращаемые значения должны быть такими же, как дляdefault_open().
-
BaseHandler.unknown_open(req)¶ Этот метод не определён в
BaseHandler, но подклассы должны определить его, если хотят перехватывать все URL, для которых нет зарегистрированного обработчика для открытия.Если этот метод реализован, он будет вызван
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().
Объекты HTTPRedirectHandler¶HTTPRedirectHandler Objects
Примечание
Некоторые HTTP-перенаправления требуют действий от клиентского кода этого модуля. В таком случае
возбуждается HTTPError. См. RFC 2616 для
подробностей о точном значении различных кодов перенаправления.
Исключение HTTPError, возбуждаемое по соображениям безопасности, если
HTTPRedirectHandler получает URL перенаправления, который не является HTTP,
HTTPS или FTP URL.
-
HTTPRedirectHandler.redirect_request(req, fp, code, msg, hdrs, newurl)¶ Возвращает
RequestилиNoneв ответ на перенаправление. Этот метод вызывается реализациями по умолчанию методовhttp_error_30*(), когда от сервера получено перенаправление. Если перенаправление должно произойти, верните новыйRequest, чтобыhttp_error_30*()смог выполнить перенаправление на newurl. В противном случае возбудитеHTTPError, если никакой другой обработчик не должен пытаться обработать этот URL, или вернитеNone, если вы не можете, но другой обработчик смог бы.Примечание
Реализация по умолчанию этого метода не следует строго RFC 2616, который говорит, что ответы 301 и 302 на запросы
POSTне должны автоматически перенаправляться без подтверждения пользователем. В действительности браузеры разрешают автоматическое перенаправление таких ответов, меняя POST наGET, и реализация по умолчанию воспроизводит такое поведение.
-
HTTPRedirectHandler.http_error_301(req, fp, code, msg, hdrs)¶ Перенаправляет на URL
Location:илиURI:. Этот метод вызывается родительскимOpenerDirectorпри получении HTTP-ответа «Moved Permanently».
-
HTTPRedirectHandler.http_error_302(req, fp, code, msg, hdrs)¶ То же, что и
http_error_301(), но вызывается для ответа «Found».
-
HTTPRedirectHandler.http_error_303(req, fp, code, msg, hdrs)¶ То же, что и
http_error_301(), но вызывается для ответа «See Other».
-
HTTPRedirectHandler.http_error_307(req, fp, code, msg, hdrs)¶ То же, что и
http_error_301(), но вызывается для ответа «временное перенаправление».
Объекты ProxyHandler¶ProxyHandler Objects
-
ProxyHandler.<protocol>_open(request) Объект
ProxyHandlerбудет иметь метод<protocol>_open()для каждого протокол, для которого есть прокси в словаре proxies, переданном в конструктор. Метод будет изменять запросы для прохождения через прокси, вызываяrequest.set_proxy(), и вызывать следующий обработчик в цепочке для непосредственного выполнения протокола.
Объекты HTTPPasswordMgr¶HTTPPasswordMgr Objects
Эти методы доступны у объектов HTTPPasswordMgr и HTTPPasswordMgrWithDefaultRealm.
-
HTTPPasswordMgr.add_password(realm, uri, user, passwd)¶ uri может быть как одним URI, так и последовательностью URI. realm, user и passwd должны быть строками. В результате
(user, passwd)будет использоваться в качестве токенов аутентификации, когда запрашивается аутентификация для realm и супер-URI любого из заданных URI.
-
HTTPPasswordMgr.find_user_password(realm, authuri)¶ Получает имя пользователя/пароль для заданных realm и URI, если они есть. Этот метод вернёт
(None, None), если нет соответствующей пары пользователь/пароль.Для объектов
HTTPPasswordMgrWithDefaultRealmобластьNoneбудет проверена, если заданная realm не имеет соответствующей пары пользователь/пароль.
Объекты HTTPPasswordMgrWithPriorAuth¶HTTPPasswordMgrWithPriorAuth Objects
Этот менеджер паролей расширяет 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 игнорируется.
-
HTTPPasswordMgrWithPriorAuth.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 Objects
-
AbstractBasicAuthHandler.http_error_auth_reqed(authreq, host, req, headers)¶ Обрабатывает запрос аутентификации, получая пару пользователь/пароль и повторяя запрос. authreq должен быть именем заголовка, в котором содержится информация о realm в запросе, host указывает URL и путь для аутентификации, req должен быть (неудачным) объектом
Request, а headers – заголовками ошибки.host – это либо authority (например,
"python.org"), либо URL, содержащий компонент authority (например,"http://python.org/"). В любом случае, authority не должен содержать компонент userinfo (поэтому"python.org"и"python.org:80"подходят, а"joe:password@python.org"– нет).
Объекты HTTPBasicAuthHandler¶HTTPBasicAuthHandler Objects
-
HTTPBasicAuthHandler.http_error_401(req, fp, code, msg, hdrs)¶ Повторяет запрос с информацией аутентификации, если она доступна.
Объекты ProxyBasicAuthHandler¶ProxyBasicAuthHandler Objects
-
ProxyBasicAuthHandler.http_error_407(req, fp, code, msg, hdrs)¶ Повторяет запрос с информацией аутентификации, если она доступна.
Объекты AbstractDigestAuthHandler¶AbstractDigestAuthHandler Objects
Объекты HTTPDigestAuthHandler¶HTTPDigestAuthHandler Objects
-
HTTPDigestAuthHandler.http_error_401(req, fp, code, msg, hdrs)¶ Повторяет запрос с информацией аутентификации, если она доступна.
Объекты ProxyDigestAuthHandler¶ProxyDigestAuthHandler Objects
-
ProxyDigestAuthHandler.http_error_407(req, fp, code, msg, hdrs)¶ Повторяет запрос с информацией аутентификации, если она доступна.
Объекты HTTPHandler¶HTTPHandler Objects
-
HTTPHandler.http_open(req)¶ Отправляет HTTP-запрос, который может быть GET или POST, в зависимости от
req.has_data().
Объекты HTTPSHandler¶HTTPSHandler Objects
-
HTTPSHandler.https_open(req)¶ Отправляет HTTPS-запрос, который может быть GET или POST, в зависимости от
req.has_data().
Объекты FileHandler¶FileHandler Objects
Объекты DataHandler¶DataHandler Objects
-
DataHandler.data_open(req)¶ Читает data URL. Такой URL содержит контент, закодированный в самом URL. Синтаксис data URL описан в RFC 2397. Данная реализация игнорирует пробелы в data URL, закодированных в base64, поэтому URL может быть перенесен в любом исходном файле, откуда он взят. Но хотя некоторые браузеры не обращают внимания на отсутствие дополнения в конце URL в base64, эта реализация в таком случае возбудит исключение
ValueError.
Объекты FTPHandler¶FTPHandler Objects
-
FTPHandler.ftp_open(req)¶ Открывает FTP-файл, указанный req. Вход всегда выполняется с пустыми именем пользователя и паролем.
Объекты CacheFTPHandler¶CacheFTPHandler Objects
Объекты CacheFTPHandler являются объектами FTPHandler со следующими дополнительными методами:
-
CacheFTPHandler.setTimeout(t)¶ Устанавливает тайм-аут соединений равным t секунд.
-
CacheFTPHandler.setMaxConns(m)¶ Устанавливает максимальное количество кэшированных соединений равным m.
Объекты UnknownHandler¶UnknownHandler Objects
Объекты HTTPErrorProcessor¶HTTPErrorProcessor Objects
-
HTTPErrorProcessor.http_response(request, response)¶ Обрабатывает ошибочные HTTP-ответы.
Для кода 200 объект ответа возвращается немедленно.
Для кодов ошибок, отличных от 200, этот метод просто передаёт задачу методам обработчика
http_error_<type>()черезOpenerDirector.error(). В конечном счёте,HTTPDefaultErrorHandlerвызовет исключениеHTTPError, если ни один другой обработчик не обработает ошибку.
-
HTTPErrorProcessor.https_response(request, response)¶ Обрабатывает ошибочные HTTPS-ответы.
Поведение аналогично
http_response().
Примеры¶Examples
В дополнение к примерам ниже, больше примеров приведено в HOWTO Fetch Internet Resources Using The urllib Package.
Этот пример получает главную страницу 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, как указано в его метатеге, мы будем использовать ту же кодировку для декодирования объекта 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
В следующем примере мы отправляем поток данных на стандартный ввод 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
# Создать OpenerDirector с поддержкой базовой HTTP-аутентификации...
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)
# ...и установить его глобально, чтобы его можно было использовать с 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)
# На этот раз, вместо установки OpenerDirector, используется напрямую:
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/')
# Настроить значение заголовка User-Agent по умолчанию:
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')
...
Устаревший интерфейс¶Legacy interface
Следующие функции и классы перенесены из модуля 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().Этот метод всегда экранирует fullurl с помощью
quote().
-
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, если неизвестен). Она будет вызвана один раз в начале и после каждого чтения чанка данных из сети. Для локальных URL параметр reporthook игнорируется.Если url использует идентификатор схемы
http:, можно указать необязательный аргумент data для заданияPOST-запроса (обычно тип запроса –GET). Аргумент data должен быть в стандартном формате application/x-www-form-urlencoded; см. функциюurllib.parse.urlencode().
-
-
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¶urllib.request Restrictions
В настоящее время поддерживаются только следующие протоколы: HTTP (версии 0.9 и 1.0), FTP, локальные файлы и data-URL.
Изменено в версии 3.4: Добавлена поддержка data-URL.
Функция кэширования
urlretrieve()отключена, пока не будет реализована правильная обработка заголовков Expiration time.Должна быть функция для проверки, находится ли определённый 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 – Response classes used by urllib
Модуль urllib.response определяет функции и классы, реализующие минимальный файлоподобный интерфейс, включая read() и readline(). Типичный объект ответа – это экземпляр addinfourl, который определяет метод info(), возвращающий заголовки, и метод geturl(), возвращающий URL. Функции, определённые в этом модуле, используются внутри модуля urllib.request.