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