urllib.request — Расширяемая библиотека для открытия URL-адресов
Исходный код: Lib/urllib/request.py
Модуль urllib.request определяет функции и классы, которые помогают открывать URL-адреса (в основном HTTP) в сложном мире — базовая и дайджест-аутентификация, перенаправления, файлы cookie и многое другое.
См. также
Для интерфейса HTTP-клиента более высокого уровня рекомендуется пакет Requests.
Предупреждение
В macOS небезопасно использовать этот модуль в программах, применяющих os.fork(), поскольку реализация getproxies() для macOS использует системный API более высокого уровня. Чтобы избежать этой проблемы, установите переменную среды no_proxy в значение * (например, os.environ["no_proxy"] = "*").
Доступность: недоступен в Emscripten и WASI.
Этот модуль не работает или недоступен на платформах WebAssembly wasm32-emscripten и wasm32-wasi. Дополнительные сведения см. в разделе Платформы WebAssembly.
Модуль 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 игнорируется.
Эта функция всегда возвращает объект, который может работать как менеджер контекста и имеет свойства url, headers и status. Подробности об этих свойствах см. в разделе
urllib.response.addinfourl.Для URL-адресов HTTP и HTTPS эта функция возвращает несколько изменённый объект
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.Оп opener по умолчанию вызывает событие аудита
urllib.Requestс аргументамиfullurl,data,headers,method, полученными из объекта запроса.Изменено в версии 3.2: Добавлены cafile и capath.
Теперь поддерживаются виртуальные узлы HTTPS, если это возможно (то есть если
ssl.HAS_SNIимеет значение true).data может быть итерируемым объектом.
Изменено в версии 3.3: Добавлен cadefault.
Изменено в версии 3.4.3: Добавлен context.
Изменено в версии 3.10: Если context не задан, HTTPS-соединение теперь отправляет расширение ALPN с индикатором протокола
http/1.1. Пользовательский context должен задавать протоколы ALPN с помощьюset_alpn_protocols().Устарело начиная с версии 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, который объединяет обработчики в указанном порядке. handler могут быть экземплярамиBaseHandlerили подклассамиBaseHandler(в этом случае конструктор должен вызываться без параметров). Перед обработчиками handler будут размещены экземпляры следующих классов, если среди handler нет этих классов, их экземпляров или подклассов:ProxyHandler(если обнаружены настройки прокси-сервера),UnknownHandler,HTTPHandler,HTTPDefaultErrorHandler,HTTPRedirectHandler,FTPHandler,FileHandler,HTTPErrorProcessor.Если установка Python поддерживает SSL (то есть если можно импортировать модуль
ssl), будет также добавленHTTPSHandler.Подкласс
BaseHandlerможет также изменить свой атрибутhandler_order, чтобы изменить своё положение в списке обработчиков.
-
urllib.request.pathname2url(path) -
Преобразует указанный локальный путь в URL-адрес
file:. Эта функция используетquote()для кодирования пути. По историческим причинам возвращаемое значение не содержит префикс схемыfile:. В этом примере показано использование функции в Windows:>>> from urllib.request import pathname2url >>> path = 'C:\\Program Files' >>> 'file:' + pathname2url(path) 'file:///C:/Program%20Files'
-
urllib.request.url2pathname(url) -
Преобразует указанный URL-адрес
file:в локальный путь. Эта функция используетunquote()для декодирования URL-адреса. По историческим причинам указанное значение не должно содержать префикс схемыfile:. В этом примере показано использование функции в Windows:>>> from urllib.request import url2pathname >>> url = 'file:///C:/Program%20Files' >>> url2pathname(url.removeprefix('file:')) 'C:\\Program Files'
-
urllib.request.getproxies() -
Эта вспомогательная функция возвращает словарь соответствий схем и URL-адресов прокси-серверов. Сначала она просматривает переменные среды с именами
<scheme>_proxy, не учитывая регистр, во всех операционных системах, а если не находит их — ищет сведения о прокси-серверах в System Configuration для macOS и в разделе реестра Windows для сетевых настроек. Если существуют переменные среды в нижнем и верхнем регистре с разными значениями, предпочтение отдаётся варианту в нижнем регистре.Примечание
Если задана переменная среды
REQUEST_METHOD, что обычно означает запуск скрипта в среде CGI, переменная средыHTTP_PROXY(в верхнем регистре_PROXY) игнорируется. Это связано с тем, что клиент может внедрить эту переменную с помощью HTTP-заголовка «Proxy:». Если в среде CGI необходимо использовать HTTP-прокси, задайтеProxyHandlerявно или убедитесь, что имя переменной указано в нижнем регистре (либо что как минимум суффикс_proxyнаписан в нижнем регистре).
Предоставляются следующие классы:
-
class urllib.request.Request(url, data=None, headers={}, origin_req_host=None, unverifiable=False, method=None) -
Этот класс представляет собой абстракцию URL-запроса.
url должен быть строкой с корректным, правильно закодированным URL-адресом.
data должен быть объектом, задающим дополнительные данные для отправки серверу, либо
None, если такие данные не нужны. В настоящее время data используется только в запросах HTTP. Поддерживаются такие типы объектов, как bytes, файловые объекты и итерируемые объекты, содержащие объекты, подобные bytes. Если поля заголовкаContent-LengthиTransfer-Encodingне заданы,HTTPHandlerустановит эти заголовки в соответствии с типом data. Для отправки объектов bytes будет использоватьсяContent-Length, а для отправки файлов и других итерируемых объектов —Transfer-Encoding: chunked, как указано в разделе 3.3.1 RFC 7230.Для метода 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). Все ключи заголовков отправляются в регистре CamelCase.Если указан аргумент data, следует включить подходящий заголовок
Content-Type. Если этот заголовок не задан, а значение data не равноNone, по умолчанию будет добавленContent-Type: application/x-www-form-urlencoded.Следующие два аргумента важны только для правильной обработки сторонних файлов cookie HTTP:
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 добавлен аргумент
Request.method.Изменено в версии 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) -
Класс для обработки файлов cookie HTTP.
-
class urllib.request.ProxyHandler(proxies=None) -
Направляет запросы через прокси-сервер. Если задан параметр proxies, он должен быть словарём, сопоставляющим названия протоколов с URL-адресами прокси-серверов. По умолчанию список прокси-серверов считывается из переменных среды
<protocol>_proxy. Если переменные среды прокси-серверов не заданы, то в Windows настройки прокси-сервера берутся из раздела Internet Settings реестра, а в macOS сведения о прокси-сервере извлекаются из 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считается универсальным и используется, если не подходит ни один другой realm.
-
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. Если добавлены обработчики дайджест-аутентификации и базовой аутентификации, сначала всегда выполняется дайджест-аутентификация. Если она снова возвращает ответ 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 -
Класс для обработки открытия URL-адресов HTTP.
-
class urllib.request.HTTPSHandler(debuglevel=0, context=None, check_hostname=None) -
Класс для обработки открытия URL-адресов HTTPS. context и check_hostname имеют то же значение, что и в
http.client.HTTPSConnection.Изменено в версии 3.2: Добавлены context и check_hostname.
-
class urllib.request.FileHandler -
Открывает локальные файлы.
-
class urllib.request.DataHandler -
Открывает URL-адреса data.
Добавлено в версии 3.4.
-
class urllib.request.FTPHandler -
Открывает URL-адреса FTP.
-
class urllib.request.CacheFTPHandler -
Открывает URL-адреса FTP, сохраняя кэш открытых FTP-соединений для уменьшения задержек.
-
class urllib.request.UnknownHandler -
Универсальный класс для обработки неизвестных URL-адресов.
-
class urllib.request.HTTPErrorProcessor -
Обрабатывает ответы HTTP с ошибками.
Объекты Request
Следующие методы описывают публичный интерфейс 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, которые добавляют их в список заголовков, отправляемых серверу. Обратите внимание, что заголовки с одинаковым именем не могут встречаться более одного раза, а последующие вызовы перезапишут предыдущие, если совпадёт key. В настоящее время это не ограничивает возможности 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() -
Возвращает список кортежей (header_name, header_value) с заголовками Request.
Изменено в версии 3.4: Методы запроса add_data, has_data, get_data, get_type, get_host, get_selector, get_origin_req_host и is_unverifiable, объявленные устаревшими начиная с версии 3.3, удалены.
Объекты OpenerDirector
Экземпляры OpenerDirector имеют следующие методы:
-
OpenerDirector.add_handler(handler) -
handler должен быть экземпляром
BaseHandler. Выполняется поиск следующих методов, которые затем добавляются в возможные цепочки (обратите внимание, что ошибки HTTP являются особым случаем). Обратите внимание, что далее protocol следует заменить фактическим обрабатываемым протоколом; например,http_response()будет обработчиком ответов протокола HTTP. Также type следует заменить фактическим кодом HTTP; например,http_error_404()будет обрабатывать ошибки HTTP 404.-
<protocol>_open()— указывает, что обработчик умеет открывать URL-адреса protocol.Дополнительные сведения см. в разделе
BaseHandler.<protocol>_open(). -
http_error_<type>()— указывает, что обработчик умеет обрабатывать ошибки HTTP с кодом ошибки HTTP type.Дополнительные сведения см. в разделе
BaseHandler.http_error_<nnn>(). -
<protocol>_error()— указывает, что обработчик умеет обрабатывать ошибки протокола protocol (неhttp). -
<protocol>_request()— указывает, что обработчик умеет предварительно обрабатывать запросы protocol.Дополнительные сведения см. в разделе
BaseHandler.<protocol>_request(). -
<protocol>_response()— указывает, что обработчик умеет выполнять последующую обработку ответов protocol.Дополнительные сведения см. в разделе
BaseHandler.<protocol>_response().
-
-
OpenerDirector.open(url, data=None[, timeout]) -
Открывает указанный url (который может быть объектом запроса или строкой), при необходимости передавая указанное значение data. Аргументы, возвращаемые значения и возбуждаемые исключения совпадают с таковыми у
urlopen()(которая просто вызывает методopen()у текущего установленного глобальногоOpenerDirector). Необязательный параметр timeout задаёт время ожидания в секундах для блокирующих операций, таких как попытка соединения (если он не указан, используется глобальное значение времени ожидания по умолчанию). Функция тайм-аута работает только для соединений HTTP, HTTPS и FTP.
-
OpenerDirector.error(proto, *args) -
Обрабатывает ошибку указанного протокола. Этот метод вызывает зарегистрированные обработчики ошибок для указанного протокола с переданными аргументами (которые зависят от протокола). Протокол HTTP является особым случаем: для выбора конкретного обработчика ошибок используется код ответа HTTP; см. методы
http_error_<type>()классов обработчиков.Возвращаемые значения и возбуждаемые исключения совпадают с таковыми у
urlopen().
Объекты OpenerDirector открывают URL-адреса в три этапа:
Порядок вызова этих методов на каждом этапе определяется сортировкой экземпляров обработчиков.
- У каждого обработчика, имеющего метод с именем вида
<protocol>_request(), этот метод вызывается для предварительной обработки запроса. -
Для обработки запроса вызываются обработчики, имеющие метод с именем вида
<protocol>_open(). Этот этап завершается, когда обработчик либо возвращает ненулевое значениеNone(то есть ответ), либо возбуждает исключение (обычноURLError). Исключения могут распространяться дальше.На самом деле сначала описанный алгоритм применяется к методам с именем
default_open(). Если все такие методы возвращаютNone, алгоритм повторяется для методов с именами вида<protocol>_open(). Если все такие методы возвращаютNone, алгоритм повторяется для методов с именемunknown_open().Обратите внимание, что реализация этих методов может включать вызовы методов
open()иerror()родительского экземпляраOpenerDirector. - У каждого обработчика, имеющего метод с именем вида
<protocol>_response(), этот метод вызывается для последующей обработки ответа.
Объекты BaseHandler
Объекты BaseHandler предоставляют несколько непосредственно полезных методов, а также другие методы, предназначенные для использования производными классами. Эти методы предназначены для непосредственного использования:
-
BaseHandler.add_parent(director) -
Добавляет диспетчер в качестве родительского.
-
BaseHandler.close() -
Удаляет всех родительских элементов.
Следующий атрибут и следующие методы должны использоваться только классами, производными от BaseHandler.
Примечание
Принято соглашение, согласно которому подклассы, определяющие методы <protocol>_request() или <protocol>_response(), называются *Processor; все остальные называются *Handler.
-
BaseHandler.parent -
Действительный
OpenerDirector, который можно использовать для открытия с помощью другого протокола или обработки ошибок.
-
BaseHandler.default_open(req) -
Этот метод не определён в
BaseHandler, но подклассам следует определить его, если они хотят перехватывать все URL-адреса.Если этот метод реализован, он будет вызван родительским
OpenerDirector. Он должен возвращать файловоподобный объект, описанный в возвращаемом значении методаopen()классаOpenerDirector, илиNone. Он должен возбуждатьURLError, за исключением случаев, когда происходит действительно исключительное событие (например,MemoryErrorне следует преобразовывать вURLError).Этот метод будет вызван до любого метода открытия, специфичного для протокола.
- BaseHandler.<protocol>_open(req)
-
Этот метод не определён в
BaseHandler, но подклассам следует определить его, если они хотят обрабатывать URL-адреса с указанным протоколом.Если этот метод определён, он будет вызван родительским
OpenerDirector. Возвращаемые значения должны совпадать с возвращаемыми значениямиdefault_open().
-
BaseHandler.unknown_open(req) -
Этот метод не определён в
BaseHandler, но подклассам следует определить его, если они хотят перехватывать все URL-адреса, для открытия которых не зарегистрирован специальный обработчик.Если этот метод реализован, он будет вызван родительским
OpenerDirector, указанным вparent. Возвращаемые значения должны совпадать с возвращаемыми значениями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
Примечание
Некоторые перенаправления 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) -
Перенаправляет на URL-адрес
Location:илиURI:. Этот метод вызывается родительским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(), но вызывается для ответа «временное перенаправление». Метод запроса при этом нельзя изменить сPOSTнаGET.
-
HTTPRedirectHandler.http_error_308(req, fp, code, msg, hdrs) -
То же, что и
http_error_301(), но вызывается для ответа «постоянное перенаправление». Метод запроса при этом нельзя изменить сPOSTнаGET.Добавлено в версии 3.11.
Объекты ProxyHandler
- ProxyHandler.<protocol>_open(request)
-
У
ProxyHandlerбудет метод<protocol>_open()для каждого протокола, для которого в словаре proxies, переданном конструктору, указан прокси. Этот метод изменяет запросы, чтобы они проходили через прокси, вызываяrequest.set_proxy(), а затем вызывает следующий обработчик в цепочке для фактического выполнения протокола.
Объекты HTTPPasswordMgr
Эти методы доступны объектам HTTPPasswordMgr и HTTPPasswordMgrWithDefaultRealm.
-
HTTPPasswordMgr.add_password(realm, uri, user, passwd) -
uri может быть как отдельным URI, так и последовательностью URI. realm, user и passwd должны быть строками. Это позволяет использовать
(user, passwd)в качестве токенов аутентификации, когда запрашивается аутентификация для realm и супермножества любого из указанных URI.
-
HTTPPasswordMgr.find_user_password(realm, authuri) -
Получить имя пользователя и пароль для заданных области и URI, если они есть. Если подходящих имени пользователя и пароля нет, этот метод возвращает
(None, None).Для объектов
HTTPPasswordMgrWithDefaultRealm, если для заданного realm не найдены подходящие имя пользователя и пароль, выполняется поиск в областиNone.
Объекты HTTPPasswordMgrWithPriorAuth
Этот менеджер паролей расширяет HTTPPasswordMgrWithDefaultRealm, добавляя возможность отслеживать URI, для которых учетные данные аутентификации следует отправлять всегда.
-
HTTPPasswordMgrWithPriorAuth.add_password(realm, uri, user, passwd, is_authenticated=False) -
realm, uri, user и passwd имеют те же значения, что и для
HTTPPasswordMgr.add_password(). Параметр is_authenticated задает начальное значение флагаis_authenticatedдля указанного URI или списка URI. Если для is_authenticated указано значениеTrue, параметр realm игнорируется.
-
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.http_error_auth_reqed(authreq, host, req, headers) -
Обрабатывает запрос аутентификации: получает пару «имя пользователя/пароль» и повторяет запрос. authreq должно содержать имя заголовка, в котором в запросе указаны сведения об области, 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.http_error_401(req, fp, code, msg, hdrs) -
Повторяет запрос с данными аутентификации, если они доступны.
Объекты ProxyBasicAuthHandler
-
ProxyBasicAuthHandler.http_error_407(req, fp, code, msg, hdrs) -
Повторяет запрос с данными аутентификации, если они доступны.
Объекты AbstractDigestAuthHandler
-
AbstractDigestAuthHandler.http_error_auth_reqed(authreq, host, req, headers) -
authreq должно содержать имя заголовка, в котором в запросе указаны сведения об области, host должен задавать узел, для которого требуется аутентификация, req должен быть неудавшимся объектом
Request, а headers — заголовками ошибки.
Объекты HTTPDigestAuthHandler
-
HTTPDigestAuthHandler.http_error_401(req, fp, code, msg, hdrs) -
Повторяет запрос с данными аутентификации, если они доступны.
Объекты ProxyDigestAuthHandler
-
ProxyDigestAuthHandler.http_error_407(req, fp, code, msg, hdrs) -
Повторяет запрос с данными аутентификации, если они доступны.
Объекты HTTPHandler
-
HTTPHandler.http_open(req) -
Отправляет HTTP-запрос, который может быть запросом GET или POST в зависимости от
req.has_data().
Объекты HTTPSHandler
-
HTTPSHandler.https_open(req) -
Отправляет HTTPS-запрос, который может быть запросом GET или POST в зависимости от
req.has_data().
Объекты FileHandler
-
FileHandler.file_open(req) -
Открывает файл локально, если имя узла отсутствует или равно
'localhost'.Изменено в версии 3.2: Этот метод применим только к локальным именам узлов. Если указано удаленное имя узла, возникает исключение
URLError.
Объекты DataHandler
-
DataHandler.data_open(req) -
Читает URL-адрес data. URL-адрес этого типа содержит данные, закодированные непосредственно в самом URL. Синтаксис URL-адресов data описан в RFC 2397. Эта реализация игнорирует пробелы в URL-адресах data с данными в кодировке base64, поэтому URL можно переносить в исходном файле. Однако, хотя некоторые браузеры допускают отсутствие завершающих символов заполнения в URL-адресе data с данными в кодировке base64, в таком случае эта реализация вызывает исключение
ValueError.
Объекты FTPHandler
-
FTPHandler.ftp_open(req) -
Открывает FTP-файл, указанный в req. Вход в систему всегда выполняется с пустыми именем пользователя и паролем.
Объекты CacheFTPHandler
Объекты CacheFTPHandler являются объектами FTPHandler со следующими дополнительными методами:
-
CacheFTPHandler.setTimeout(t) -
Задает время ожидания соединений в секундах, равное t.
-
CacheFTPHandler.setMaxConns(m) -
Задает максимальное число кэшируемых соединений, равное m.
Объекты UnknownHandler
-
UnknownHandler.unknown_open() -
Вызывает исключение
URLError.
Объекты HTTPErrorProcessor
-
HTTPErrorProcessor.http_response(request, response) -
Обрабатывает ответы HTTP с ошибками.
Для кодов ответа 200 объект ответа возвращается немедленно.
Для кодов ответа, отличных от 200, эта функция просто передает обработку методам
http_error_<type>(), вызываяOpenerDirector.error(). В конечном итогеHTTPDefaultErrorHandlerвызовет исключениеHTTPError, если ошибку не обработает другой обработчик.
-
HTTPErrorProcessor.https_response(request, response) -
Обрабатывает ответы HTTPS с ошибками.
Поведение такое же, как у
http_response().
Примеры
Помимо приведенных ниже примеров, дополнительные примеры доступны в разделе 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 возвращает объект 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
# 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. Например, для получения URL HTTP-прокси считывается переменная среды http_proxy.
В этом примере стандартный ProxyHandler заменяется обработчиком, использующим заданные программно URL прокси, а поддержка аутентификации прокси добавляется с помощью ProxyBasicAuthHandler.
proxy_handler = urllib.request.ProxyHandler({'http': 'http://www.example.com:3128/'})
proxy_auth_handler = urllib.request.ProxyBasicAuthHandler()
proxy_auth_handler.add_password('realm', 'host', 'username', 'password')
opener = urllib.request.build_opener(proxy_handler, proxy_auth_handler)
# This time, rather than install the OpenerDirector, we use it directly:
opener.open('http://www.example.com/login.html')
Добавление заголовков HTTP:
Используйте аргумент headers конструктора Request или:
import urllib.request
req = urllib.request.Request('http://www.example.com/')
req.add_header('Referer', 'http://www.python.org/')
# Customize the default User-Agent header value:
req.add_header('User-Agent', 'urllib-example/0.1 (Contact: . . .)')
r = urllib.request.urlopen(req)
OpenerDirector автоматически добавляет заголовок User-Agent к каждому объекту Request. Чтобы изменить его:
import urllib.request
opener = urllib.request.build_opener()
opener.addheaders = [('User-agent', 'Mozilla/5.0')]
opener.open('http://www.example.com/')
Также помните, что несколько стандартных заголовков (Content-Length, Content-Type и Host) добавляются при передаче Request в urlopen() (или OpenerDirector.open()).
Ниже показан пример сеанса, в котором для получения URL с параметрами используется метод GET:
>>> import urllib.request
>>> import urllib.parse
>>> params = urllib.parse.urlencode({'spam': 1, 'eggs': 2, 'bacon': 0})
>>> url = "http://www.musi-cal.com/cgi-bin/query?%s" % params
>>> with urllib.request.urlopen(url) as f:
... print(f.read().decode('utf-8'))
...
В следующем примере вместо него используется метод POST. Обратите внимание, что результат urlencode перед отправкой в urlopen в качестве данных преобразуется в байты:
>>> import urllib.request
>>> import urllib.parse
>>> data = urllib.parse.urlencode({'spam': 1, 'eggs': 2, 'bacon': 0})
>>> data = data.encode('ascii')
>>> with urllib.request.urlopen("http://requestb.in/xrbl82xr", data) as f:
... print(f.read().decode('utf-8'))
...
В следующем примере используется явно заданный HTTP-прокси, который переопределяет настройки среды:
>>> import urllib.request
>>> proxies = {'http': 'http://proxy.example.com:8080/'}
>>> opener = urllib.request.FancyURLopener(proxies)
>>> with opener.open("http://www.python.org") as f:
... f.read().decode('utf-8')
...
В следующем примере прокси не используются, что переопределяет настройки среды:
>>> import urllib.request
>>> opener = urllib.request.FancyURLopener({})
>>> with opener.open("http://www.python.org/") as f:
... f.read().decode('utf-8')
...
Устаревший интерфейс
Следующие функции и классы перенесены из модуля Python 2 urllib (в отличие от urllib2). В будущем они могут быть объявлены устаревшими.
-
urllib.request.urlretrieve(url, filename=None, reporthook=None, data=None) -
Копирует сетевой объект, указанный URL-адресом, в локальный файл. Если URL указывает на локальный файл, объект не будет скопирован, если не задан параметр filename. Возвращает кортеж
(filename, headers), где filename — имя локального файла, в котором находится объект, а headers — результат вызова методаinfo()объекта, возвращенного функциейurlopen()(для удаленного объекта). Исключения те же, что и дляurlopen().Второй аргумент, если он указан, задает путь к файлу для копирования (если он отсутствует, используется временный файл со сгенерированным именем). Третий аргумент, если он указан, представляет собой вызываемый объект, который вызывается при установлении сетевого соединения и после чтения каждого последующего блока. Ему передаются три аргумента: количество уже переданных блоков, размер блока в байтах и общий размер файла. Для старых FTP-серверов, не возвращающих размер файла в ответ на запрос его получения, третий аргумент может быть равен
-1.В следующем примере показан наиболее распространенный вариант использования:
>>> 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_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().
-
version -
Переменная, задающая пользовательский агент объекта-открывателя. Чтобы
urllibсообщал серверам определенный пользовательский агент, задайте эту переменную как переменную класса в подклассе или в конструкторе до вызова конструктора базового класса.
-
-
class urllib.request.FancyURLopener(...) -
Устарело начиная с версии 3.3.
FancyURLopener— подклассURLopener, обеспечивающий обработку по умолчанию для следующих кодов ответа HTTP: 301, 302, 303, 307 и 401. Для перечисленных выше кодов ответа 30x фактический URL запрашивается с использованием заголовка Location. Для кода ответа 401 (требуется аутентификация) выполняется базовая HTTP-аутентификация. Для кодов ответа 30x число перенаправлений ограничено значением атрибута maxtries, равным по умолчанию 10.Для всех остальных кодов ответа вызывается метод
http_error_default(). Его можно переопределить в подклассах, чтобы соответствующим образом обрабатывать ошибку.Примечание
Согласно буквальному толкованию RFC 2616, ответы 301 и 302 на запросы POST нельзя перенаправлять автоматически без подтверждения пользователя. На практике браузеры автоматически перенаправляют такие ответы, заменяя POST на GET, и
urllibвоспроизводит такое поведение.Параметры конструктора совпадают с параметрами конструктора
URLopener.Примечание
При выполнении базовой аутентификации экземпляр
FancyURLopenerвызывает свой методprompt_user_passwd(). Реализация по умолчанию запрашивает необходимые сведения у пользователя в управляющем терминале. При необходимости подкласс может переопределить этот метод, обеспечив более подходящее поведение.Класс
FancyURLopenerпредоставляет один дополнительный метод, который следует переопределить для реализации подходящего поведения:-
prompt_user_passwd(host, realm) -
Возвращает сведения, необходимые для аутентификации пользователя на заданном узле в указанной области безопасности. Возвращаемое значение должно быть кортежем
(user, password), который можно использовать для базовой аутентификации.Реализация запрашивает эти сведения в терминале; приложению следует переопределить этот метод, чтобы использовать подходящую для локальной среды модель взаимодействия.
-
Ограничения urllib.request
-
В настоящее время поддерживаются только следующие протоколы: HTTP (версии 0.9 и 1.0), FTP, локальные файлы и URL-адреса data.
Изменено в версии 3.4: Добавлена поддержка URL-адресов data.
- Функция кэширования
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 в соответствии с вашими потребностями.
© 2001–2024 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.12/library/urllib.request.html