Spec-Zone.ru › Python 3.7

urllib.request — Расширяемая библиотека для открытия URL-адресов

Исходный код: Lib/urllib/request.py

Модуль urllib.request определяет функции и классы, которые помогают открывать URL-адреса (в основном HTTP) в сложном мире — базовая и дайджест-аутентификация, перенаправления, куки и многое другое.

См. также

Для более высокого уровня интерфейса HTTP-клиента рекомендуется пакет Requests.

Модуль urllib.request определяет следующие функции:

urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None)

Открывает URL-адрес url, который может быть строкой или объектом Request.

data должен быть объектом, определяющим дополнительные данные, которые будут отправлены на сервер, или None если такие данные не нужны. Подробности см. в Request.

Модуль urllib.request использует HTTP/1.1 и включает заголовок Connection:close в своих HTTP-запросах.

Необязательный параметр timeout задаёт время ожидания в секундах для блокирующих операций, таких как попытка подключения (если не указано, используется глобальное значение по умолчанию). Это фактически работает только для HTTP, HTTPS и FTP-соединений.

Если задан параметр context, он должен быть экземпляром ssl.SSLContext, описывающим различные параметры SSL. Более подробная информация приведена в HTTPSConnection.

Необязательные параметры cafile и capath задают набор доверенных сертификатов CA для HTTPS-запросов. cafile должен указывать на один файл, содержащий набор сертификатов CA, а capath — на каталог с хэшированными файлами сертификатов. Дополнительная информация доступна в ssl.SSLContext.load_verify_locations().

Параметр cadefault игнорируется.

Эта функция всегда возвращает объект, который может работать как менеджер контекста и имеет такие методы, как

  • geturl() — возвращает URL ресурса, полученного, обычно используется для определения, было ли выполнено перенаправление
  • info() — возвращает метаинформацию страницы, такую как заголовки, в виде экземпляра email.message_from_string() (см. Быстрое справочное руководство по HTTP-заголовкам)
  • getcode() — возвращает HTTP-код состояния ответа.

Для HTTP- и HTTPS-URL эта функция возвращает слегка изменённый объект http.client.HTTPResponse. В дополнение к трём новым методам выше, атрибут msg содержит ту же информацию, что и атрибут reason — фразу причины, возвращённую сервером — вместо заголовков ответа, как указано в документации для HTTPResponse.

Для FTP, file и data URL и запросов, явно обрабатываемых устаревшими классами URLopener и FancyURLopener, эта функция возвращает объект urllib.response.addinfourl.

Возбуждает исключение URLError при ошибках протокола.

Обратите внимание, что None может быть возвращено, если ни один обработчик не обработает запрос (хотя установленный по умолчанию глобальный OpenerDirector использует UnknownHandler, чтобы гарантировать, что этого никогда не произойдёт).

Кроме того, если обнаружены настройки прокси (например, при установке переменной среды *_proxy типа http_proxy), по умолчанию устанавливается ProxyHandler и гарантируется, что запросы обрабатываются через прокси.

Устаревшая функция urllib.urlopen из Python 2.6 и более ранних версий была прекращена; urllib.request.urlopen() соответствует старой urllib2.urlopen. Обработку прокси, которая выполнялась путём передачи параметра словаря в urllib.urlopen, можно получить, используя объекты ProxyHandler.

Изменено в версии 3.2: Добавлены cafile и capath.

Изменено в версии 3.2: Теперь поддерживаются виртуальные хосты HTTPS, если это возможно (то есть, если ssl.HAS_SNI истинно).

Добавлена в версии 3.2: data может быть итерируемым объектом.

Изменено в версии 3.3: Добавлен cadefault.

Изменено в версии 3.4.3: Добавлен context.

Устарело начиная с версии 3.6: cafile, capath и cadefault устарели в пользу context. Используйте вместо этого ssl.SSLContext.load_cert_chain() или позвольте ssl.create_default_context() выбрать доверенные сертификаты CA системы.

urllib.request.install_opener(opener)

Устанавливает экземпляр OpenerDirector в качестве глобального обработчика по умолчанию. Установка обработчика необходима только если вы хотите, чтобы urlopen использовал этот обработчик; в противном случае просто вызовите OpenerDirector.open() вместо urlopen(). Код не проверяет реальный OpenerDirector, и любой класс с соответствующим интерфейсом будет работать.

urllib.request.build_opener([handler, ...])

Возвращает экземпляр OpenerDirector, который связывает обработчики в заданном порядке. handler могут быть экземплярами BaseHandler или подклассами BaseHandler (в этом случае конструктор должен быть вызываем без параметров). Экземпляры следующих классов будут находиться перед handler, если они не содержатся в handler, или их подклассы: ProxyHandler (если обнаружены настройки прокси), UnknownHandler, HTTPHandler, HTTPDefaultErrorHandler, HTTPRedirectHandler, FTPHandler, FileHandler, HTTPErrorProcessor.

Если в установке Python есть поддержка SSL (то есть, если модуль ssl может быть импортирован), также будет добавлен HTTPSHandler.

Подкласс BaseHandler также может изменить свой атрибут handler_order для изменения своего положения в списке обработчиков.

urllib.request.pathname2url(path)

Преобразует путь path из локального синтаксиса пути в форму, используемую в компонент пути URL. Это не создаёт полный URL. Возвращаемое значение уже будет закодировано с использованием функции quote().

urllib.request.url2pathname(path)

Преобразует компонент пути path из URL с проценто-кодированием в локальный синтаксис пути. Эта функция не принимает полный URL. Эта функция использует unquote() для декодирования path.

urllib.request.getproxies()

Эта вспомогательная функция возвращает словарь сопоставлений схем с URL-адресами прокси-серверов. Она сканирует среду поиска переменных с именами <scheme>_proxy, применяя регистронезависимый поиск, сначала для всех операционных систем, и если не находит, ищет информацию о прокси из Mac OSX System Configuration для Mac OS X и системного реестра Windows для Windows. Если существуют переменные окружения как в нижнем, так и в верхнем регистре (и они различаются), предпочтение отдаётся переменной в нижнем регистре.

Примечание

Если переменная окружения REQUEST_METHOD установлена, что обычно указывает на запуск скрипта в среде CGI, переменная окружения HTTP_PROXY (в верхнем регистре _PROXY) будет проигнорирована. Это связано с тем, что эта переменная может быть внедрена клиентом с помощью заголовка HTTP «Proxy:». Если вам необходимо использовать HTTP-прокси в среде CGI, используйте ProxyHandler явно или убедитесь, что имя переменной находится в нижнем регистре (или, по крайней мере, содержит суффикс _proxy).

Предоставляются следующие классы:

class urllib.request.Request(url, data=None, headers={}, origin_req_host=None, unverifiable=False, method=None)

Этот класс представляет собой абстракцию запроса к URL.

url должен быть строкой, содержащей корректный URL.

data должен быть объектом, определяющим дополнительные данные для отправки на сервер, или None если такие данные не требуются. В настоящее время HTTP-запросы — единственные, которые используют data. Поддерживаемые типы объектов включают байты, объекты типа «подобные файлам» и итерируемые объекты. Если не указан заголовок Content-Length или Transfer-Encoding, HTTPHandler установит эти заголовки в соответствии с типом data. Content-Length будет использоваться для отправки объектов типа байты, а Transfer-Encoding: chunked — как указано в RFC 7230, Раздел 3.3.1, для отправки файлов и других итерируемых объектов.

Для HTTP-запроса методом POST data должен быть буфером в стандартном формате application/x-www-form-urlencoded. Функция urllib.parse.urlencode() принимает отображение или последовательность пар 2-х элементов и возвращает строку ASCII в этом формате. Она должна быть закодирована в байты перед использованием в качестве параметра data.

headers должен быть словарем, и будет обрабатываться так, как будто вызвана add_header() с каждой парой ключ-значение в качестве аргументов. Это часто используется для «подделки» значения заголовка User-Agent, используемого браузером для идентификации — некоторые HTTP-серверы допускают запросы только от обычных браузеров, а не от скриптов. Например, Mozilla Firefox может идентифицироваться как "Mozilla/5.0 (X11; U; Linux i686) Gecko/20071127 Firefox/2.0.0.11", в то время как строка пользователя-агента по умолчанию для urllib — "Python-urllib/2.6" (в Python 2.6).

Необходимо включить соответствующий заголовок Content-Type, если аргумент data присутствует. Если этот заголовок не предоставлен, а data не равно None, Content-Type: application/x-www-form-urlencoded будет добавлен по умолчанию.

Следующие два аргумента важны только для правильной обработки сторонних HTTP-cookies:

origin_req_host должен быть хостом запроса источника, как определено в RFC 2965. По умолчанию он равен http.cookiejar.request_host(self). Это имя хоста или IP-адрес исходного запроса, инициированного пользователем. Например, если запрос относится к изображению в документе HTML, это должен быть хост запроса для страницы, содержащей изображение.

unverifiable должен указывать, является ли запрос недопустимым, как определено в RFC 2965. По умолчанию он равен False. Недопустимый запрос — это запрос, URL которого пользователь не имел возможности одобрить. Например, если запрос относится к изображению в HTML-документе, а пользователь не имел возможности одобрить автоматическую загрузку изображения, это должно быть True.

method должна быть строкой, указывающей метод HTTP-запроса, который будет использован (например, 'HEAD'). Если указано, её значение хранится в атрибуте method и используется get_method(). По умолчанию это 'GET' если data равно None или 'POST' в противном случае. Подклассы могут указать другой метод по умолчанию, установив атрибут method в самом классе.

Примечание

Запрос не будет работать должным образом, если объект данных не может передать содержимое более одного раза (например, файл или итерируемый объект, которые могут сгенерировать содержимое только один раз), и запрос повторяется из-за HTTP-перенаправлений или аутентификации. data отправляется на HTTP-сервер сразу после заголовков. В библиотеке нет поддержки ожидания 100-continue.

Изменено в версии 3.3: Аргумент Request.method добавлен в класс Request.

Изменено в версии 3.4: Метод по умолчанию Request.method может быть указан на уровне класса.

Изменено в версии 3.6: Не генерировать ошибку, если заголовок Content-Length не предоставлен, а data не является None или объектом типа байты. Используйте кодирование с фрагментами вместо этого.

class urllib.request.OpenerDirector

Класс OpenerDirector открывает URL-адреса с помощью BaseHandler, объединённых в цепочку. Он управляет связыванием обработчиков и восстановлением после ошибок.

class urllib.request.BaseHandler

Это базовый класс для всех зарегистрированных обработчиков — и обрабатывает только простые механизмы регистрации.

class urllib.request.HTTPDefaultErrorHandler

Класс, определяющий обработчик по умолчанию для HTTP-ответов с ошибками; все ответы преобразуются в исключения HTTPError.

class urllib.request.HTTPRedirectHandler

Класс для обработки перенаправлений.

class urllib.request.HTTPCookieProcessor(cookiejar=None)

Класс для обработки HTTP-cookies.

class urllib.request.ProxyHandler(proxies=None)

Принуждает запросы проходить через прокси. Если указан proxies, он должен быть словарем, сопоставляющим имена протоколов с URL-адресами прокси-серверов. По умолчанию он считывает список прокси из переменных окружения <protocol>_proxy. Если переменные окружения прокси не установлены, то в среде Windows настройки прокси извлекаются из раздела Настройки интернета реестра, а в среде Mac OS X информация о прокси извлекается из фреймворка конфигурации системы Mac OS X.

Для отключения автоматически обнаруженных прокси передайте пустой словарь.

Переменная окружения no_proxy может использоваться для указания хостов, которые не должны достигаться через прокси; если она установлена, она должна быть запятой-разделенным списком суффиксов имён хостов, с необязательным добавлением :port, например, cern.ch,ncsa.uiuc.edu,some.host:8080.

Примечание

HTTP_PROXY будет проигнорировано, если установлена переменная REQUEST_METHOD; см. документацию по getproxies().

class urllib.request.HTTPPasswordMgr

Хранит базу данных сопоставлений (realm, uri) -> (user, password).

class urllib.request.HTTPPasswordMgrWithDefaultRealm

Хранит базу данных сопоставлений (realm, uri) -> (user, password). Сфера None считается универсальной областью, которая ищется, если ни одна другая область не подходит.

class urllib.request.HTTPPasswordMgrWithPriorAuth

Вариант HTTPPasswordMgrWithDefaultRealm, который также хранит базу данных сопоставлений uri -> is_authenticated. Может использоваться обработчиком BasicAuth для определения момента отправки учетных данных аутентификации немедленно вместо ожидания ответа 401.

Введено в версии 3.5.

END_OF_DOCUMENT_MARKER
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_authenticated True для 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: Теперь можно задать значение по умолчанию в подклассах; ранее это можно было сделать только через аргумент конструктора.

END_OF_DOCUMENT_MARKER ```
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-адреса в три этапа:

Порядок вызова этих методов в каждом этапе определяется сортировкой экземпляров обработчика.

  1. Каждый обработчик с методом, названным как <protocol>_request() , вызывает этот метод для предварительной обработки запроса.
  2. Обработчики с методом, названным как <protocol>_open() , вызываются для обработки запроса. Этот этап завершается, когда обработчик либо возвращает значение, отличное от None (т. е. ответ), либо вызывает исключение (обычно URLError). Исключение разрешается распространяться.

    Фактически, вышеописанный алгоритм сначала проверяется для методов, названных default_open(). Если все такие методы возвращают None, алгоритм повторяется для методов, названных как <protocol>_open(). Если все такие методы возвращают None, алгоритм повторяется для методов, названных unknown_open().

    Обратите внимание, что реализация этих методов может включать вызовы родительского экземпляра OpenerDirector метода open() и error().

  3. Каждый обработчик с методом, названным как <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 без зарегистрированного обработчика открытия.

Если реализован, этот метод будет вызван родительским элементом parent OpenerDirector. Значения возврата должны быть такими же, как для default_open().

BaseHandler.http_error_default(req, fp, code, msg, hdrs)

Этот метод не определён в BaseHandler, но подклассы должны его переопределить, если планируют обрабатывать все ошибки HTTP. Он будет автоматически вызван OpenerDirector, получившим ошибку, и обычно не должен вызываться в других обстоятельствах.

req будет объектом Request, fp — объектом, подобным файлу, содержащим тело ошибки HTTP, code — трёхзначный код ошибки, msg — отображаемое пользователю описание кода, а hdrs — объект отображения с заголовками ошибки.

Значения возврата и возникающие исключения должны быть такими же, как у urlopen().

BaseHandler.http_error_<nnn>(req, fp, code, msg, hdrs)

nnn должен быть трёхзначным кодом ошибки HTTP. Этот метод также не определён в BaseHandler, но будет вызван, если он существует, на экземпляре подкласса, когда произойдёт ошибка HTTP с кодом nnn.

Подклассы должны переопределить этот метод, чтобы обрабатывать определённые ошибки HTTP.

Аргументы, возвращаемые значения и возникающие исключения должны быть такими же, как у http_error_default().

BaseHandler.<protocol>_request(req)

Этот метод не определён в BaseHandler, но подклассы должны его определить, если хотят предварительно обработать запросы заданного протокола.

Если определён, этот метод будет вызван родительским OpenerDirector. req будет объектом Request. Значение возврата должно быть объектом Request.

BaseHandler.<protocol>_response(req, response)

Этот метод не определён в BaseHandler, но подклассы должны его определить, если хотят послеобработать ответы заданного протокола.

Если определён, этот метод будет вызван родительским OpenerDirector. req будет объектом Request. response будет объектом, реализующим тот же интерфейс, что и значение возврата urlopen(). Возвращаемое значение должно реализовывать тот же интерфейс, что и значение возврата urlopen().

Обработчики перенаправлений HTTP

Примечание

Некоторые перенаправления HTTP требуют действий от клиентского кода этого модуля. В этом случае возбуждается HTTPError. Подробнее см. RFC 2616.

Возбуждается исключение HTTPError в качестве меры безопасности, если HTTPRedirectHandler получает перенаправленный URL, который не является URL HTTP, HTTPS или FTP.

HTTPRedirectHandler.redirect_request(req, fp, code, msg, hdrs, newurl)

Возвращает Request или None в ответ на перенаправление. Вызывается в результате перенаправления, полученного от сервера, по умолчанию. Если перенаправление должно произойти, верните новый Request, чтобы http_error_30*() смог выполнить перенаправление на newurl. В противном случае вызовите HTTPError, если ни один другой обработчик не должен обрабатывать этот URL, или верните None , если это невозможно, но другой обработчик может.

Примечание

Реализация этого метода по умолчанию не полностью соответствует RFC 2616, которая гласит, что ответы 301 и 302 на POST запросы не должны автоматически перенаправляться без подтверждения пользователя. На практике браузеры допускают автоматическое перенаправление этих ответов, изменяя POST на GET, и реализация по умолчанию воспроизводит это поведение.

HTTPRedirectHandler.http_error_301(req, fp, code, msg, hdrs)

Перенаправление на Location: или URI: URL. Этот метод вызывается родительским OpenerDirector при получении ответа HTTP «перемещено навсегда».

HTTPRedirectHandler.http_error_302(req, fp, code, msg, hdrs)

То же, что и http_error_301(), но вызывается для ответа «найдено».

HTTPRedirectHandler.http_error_303(req, fp, code, msg, hdrs)

То же, что и http_error_301(), но вызывается для ответа «см. другое».

HTTPRedirectHandler.http_error_307(req, fp, code, msg, hdrs)

То же, что и http_error_301(), но вызывается для ответа «временное перенаправление».

Обработчики файлов cookie HTTP

HTTPCookieProcessor экземпляры имеют одно свойство:

HTTPCookieProcessor.cookiejar

Объект http.cookiejar.CookieJar для хранения файлов cookie.

Обработчик прокси

ProxyHandler.<protocol>_open(request)

У ProxyHandler будет метод <protocol>_open() для каждого протокола, у которого есть прокси в словаре proxies, заданном в конструкторе. Метод изменит запросы, чтобы они проходили через прокси, вызвав request.set_proxy(), и вызовет следующий обработчик в цепочке, чтобы фактически выполнить протокол.

Менеджер паролей HTTP

Эти методы доступны для объектов HTTPPasswordMgr и HTTPPasswordMgrWithDefaultRealm.

HTTPPasswordMgr.add_password(realm, uri, user, passwd)

uri может быть как одиночным URI, так и последовательностью URI. realm, user и passwd должны быть строками. Это приводит к использованию (user, passwd) в качестве токенов аутентификации при аутентификации для realm и супер-URI любого из указанных URI.

HTTPPasswordMgr.find_user_password(realm, authuri)

Получение пары имя пользователя/пароль для заданного realm и URI, если таковая имеется. Этот метод вернёт (None, None), если соответствующая пара имя пользователя/пароль не найдена.

Для объектов HTTPPasswordMgrWithDefaultRealm будет осуществлен поиск realm None если для заданного realm нет соответствующей пары имя пользователя/пароль.

Объекты HTTPPasswordMgrWithPriorAuth

Этот менеджер паролей расширяет HTTPPasswordMgrWithDefaultRealm, чтобы поддерживать отслеживание URI, для которых учётные данные аутентификации всегда должны отправляться.

HTTPPasswordMgrWithPriorAuth.add_password(realm, uri, user, passwd, is_authenticated=False)

realm, uri, user, passwd — такие же, как для HTTPPasswordMgr.add_password(). is_authenticated устанавливает начальное значение флага is_authenticated для данного URI или списка URI. Если is_authenticated задано как True, realm игнорируется.

HTTPPasswordMgr.find_user_password(realm, authuri)

То же, что и для объектов HTTPPasswordMgrWithDefaultRealm

HTTPPasswordMgrWithPriorAuth.update_authenticated(self, uri, is_authenticated=False)

Обновление флага is_authenticated для данного uri или списка URI.

HTTPPasswordMgrWithPriorAuth.is_authenticated(self, authuri)

Возвращает текущее состояние флага is_authenticated для данного URI.

Объекты AbstractBasicAuthHandler

AbstractBasicAuthHandler.http_error_auth_reqed(authreq, host, req, headers)

Обработка запроса на аутентификацию, получая пару имя пользователя/пароль и повторно выполняя запрос. authreq должен быть именем заголовка, где в запросе содержится информация о realm, host определяет URL и путь для аутентификации, req должен быть объектом (неудачного) Request, а headers — заголовки ошибки.

host — это либо авторитет (например, "python.org"), либо URL, содержащий компонент авторитета (например, "http://python.org/"). В обоих случаях компонент авторитета не должен содержать компонент userinfo (то есть "python.org" и "python.org:80" в порядке, "joe:password@python.org" — нет).

Объекты HTTPBasicAuthHandler

HTTPBasicAuthHandler.http_error_401(req, fp, code, msg, hdrs)

Повторный запрос с информацией об аутентификации, если она доступна.

Объекты ProxyBasicAuthHandler

ProxyBasicAuthHandler.http_error_407(req, fp, code, msg, hdrs)

Повторный запрос с информацией об аутентификации, если она доступна.

Объекты AbstractDigestAuthHandler

AbstractDigestAuthHandler.http_error_auth_reqed(authreq, host, req, headers)

authreq должен быть именем заголовка, где в запросе содержится информация о realm, host — хост, к которому требуется аутентификация, req — объект (неудачного) Request, а headers — заголовки ошибки.

Объекты HTTPDigestAuthHandler

HTTPDigestAuthHandler.http_error_401(req, fp, code, msg, hdrs)

Повторный запрос с информацией об аутентификации, если она доступна.

Объекты ProxyDigestAuthHandler

ProxyDigestAuthHandler.http_error_407(req, fp, code, msg, hdrs)

Повторный запрос с информацией об аутентификации, если она доступна.

Объекты HTTPHandler

HTTPHandler.http_open(req)

Отправка HTTP-запроса, который может быть либо GET, либо POST, в зависимости от req.has_data().

Объекты HTTPSHandler

HTTPSHandler.https_open(req)

Отправка HTTPS-запроса, который может быть либо GET, либо POST, в зависимости от req.has_data().

Объекты FileHandler

FileHandler.file_open(req)

Открытие файла локально, если нет имени хоста или имя хоста равно 'localhost'.

Изменено в версии 3.2: Этот метод применим только для локальных имён хостов. При указании удалённого имени хоста генерируется исключение URLError.

Объекты DataHandler

DataHandler.data_open(req)

Чтение URL-адреса данных. Такой URL содержит содержимое, закодированное в самом URL. Синтаксис URL-адресов данных указан в RFC 2397. Эта реализация игнорирует пробелы в закодированных в base64 данных URL, поэтому URL может быть обернут в любой исходный файл, откуда он происходит. Но даже если некоторые браузеры не возражают против отсутствующей подпаковки в конце закодированного в base64 URL-адреса данных, эта реализация вызовет ValueError в таком случае.

Объекты FTPHandler

FTPHandler.ftp_open(req)

Открытие FTP-файла, указанного в req. Вход выполняется всегда с пустыми именем пользователя и паролем.

Объекты CacheFTPHandler

CacheFTPHandler — это объекты FTPHandler со следующими дополнительными методами:

CacheFTPHandler.setTimeout(t)

Установка таймаута подключений на t секунд.

CacheFTPHandler.setMaxConns(m)

Установка максимального количества кэшированных подключений на m.

Объекты UnknownHandler

UnknownHandler.unknown_open()

Вызов исключения URLError.

Объекты HTTPErrorProcessor

HTTPErrorProcessor.http_response(request, response)

Обработка HTTP-ответов об ошибках.

Для кода ошибки 200 объект ответа возвращается немедленно.

Для кодов ошибок, отличных от 200, эта функция просто передаёт задачу методам обработчика http_error_<type>() через OpenerDirector.error(). В конечном итоге, HTTPDefaultErrorHandler сгенерирует HTTPError, если ни один другой обработчик не обработает ошибку.

HTTPErrorProcessor.https_response(request, response)

Обработка HTTPS-ответов об ошибках.

Поведение аналогично http_response().

Примеры

Помимо примеров ниже, дополнительные примеры приведены в ИНСТРУКЦИЯ Поиск ресурсов в Интернете с использованием пакета urllib.

В этом примере извлекается главная страница python.org и отображаются первые 300 байт.

>>> import urllib.request
>>> with urllib.request.urlopen('http://www.python.org/') as f:
...     print(f.read(300))
...
b'<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">\n\n\n<html
xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">\n\n<head>\n
<meta http-equiv="content-type" content="text/html; charset=utf-8" />\n
<title>Python Programming '

Обратите внимание, что urlopen возвращает объект bytes. Это связано с тем, что urlopen не может автоматически определить кодировку потока байтов, полученного от HTTP-сервера. В общем случае программа декодирует возвращённый объект bytes в строку, как только определит или предположит соответствующую кодировку.

В следующем документе W3C, https://www.w3.org/International/O-charset, перечислены различные способы, которыми документ (X)HTML или XML может указать информацию об кодировке.

Поскольку веб-сайт python.org использует кодировку utf-8, как указано в его теге meta, мы будем использовать её же для декодирования объекта байтов.

>>> with urllib.request.urlopen('http://www.python.org/') as f:
...     print(f.read(100).decode('utf-8'))
...
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtm

Также можно добиться того же результата без использования подхода с менеджером контекста.

>>> import urllib.request
>>> f = urllib.request.urlopen('http://www.python.org/')
>>> print(f.read(100).decode('utf-8'))
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtm

В следующем примере мы отправляем поток данных в стандартный ввод CGI и считываем данные, которые он возвращает. Обратите внимание, что этот пример будет работать только в том случае, если ваша установка Python поддерживает SSL.

>>> import urllib.request
>>> req = urllib.request.Request(url='https://localhost/cgi-bin/test.cgi',
...                       data=b'This data is passed to stdin of the CGI')
>>> with urllib.request.urlopen(req) as f:
...     print(f.read().decode('utf-8'))
...
Got Data: "This data is passed to stdin of the CGI"

Код примера CGI, используемого в вышеприведённом примере:

#!/usr/bin/env python
import sys
data = sys.stdin.read()
print('Content-type: text/plain\n\nGot Data: "%s"' % data)

Вот пример выполнения запроса PUT с помощью Request:

import urllib.request
DATA = b'some data'
req = urllib.request.Request(url='http://localhost:8080', data=DATA,method='PUT')
with urllib.request.urlopen(req) as f:
    pass
print(f.status)
print(f.reason)

Использование аутентификации HTTP Basic:

import urllib.request
# Create an OpenerDirector with support for Basic HTTP Authentication...
auth_handler = urllib.request.HTTPBasicAuthHandler()
auth_handler.add_password(realm='PDQ Application',
                          uri='https://mahler:8092/site-updates.py',
                          user='klem',
                          passwd='kadidd!ehopper')
opener = urllib.request.build_opener(auth_handler)
# ...and install it globally so it can be used with urlopen.
urllib.request.install_opener(opener)
urllib.request.urlopen('http://www.example.com/login.html')

build_opener() по умолчанию предоставляет множество обработчиков, включая ProxyHandler. По умолчанию ProxyHandler использует переменные среды, именованные <scheme>_proxy, где <scheme> — используемая схема URL. Например, переменная среды http_proxy используется для получения URL-адреса прокси-сервера HTTP.

В этом примере обработчик ProxyHandler заменяется на обработчик с программно заданными URL-адресами прокси и добавляется поддержка авторизации прокси с помощью ProxyBasicAuthHandler.

proxy_handler = urllib.request.ProxyHandler({'http': 'http://www.example.com:3128/'})
proxy_auth_handler = urllib.request.ProxyBasicAuthHandler()
proxy_auth_handler.add_password('realm', 'host', 'username', 'password')

opener = urllib.request.build_opener(proxy_handler, proxy_auth_handler)
# This time, rather than install the OpenerDirector, we use it directly:
opener.open('http://www.example.com/login.html')

Добавление заголовков HTTP:

Используйте аргумент headers конструктора Request или:

import urllib.request
req = urllib.request.Request('http://www.example.com/')
req.add_header('Referer', 'http://www.python.org/')
# Customize the default User-Agent header value:
req.add_header('User-Agent', 'urllib-example/0.1 (Contact: . . .)')
r = urllib.request.urlopen(req)

OpenerDirector автоматически добавляет заголовок User-Agent к каждому Request. Для изменения этого:

import urllib.request
opener = urllib.request.build_opener()
opener.addheaders = [('User-agent', 'Mozilla/5.0')]
opener.open('http://www.example.com/')

Также помните, что несколько стандартных заголовков (Content-Length, Content-Type и Host) добавляются, когда Request передаётся в urlopen() (или OpenerDirector.open()).

Вот пример сеанса, который использует метод GET для получения URL-адреса, содержащего параметры:

>>> import urllib.request
>>> import urllib.parse
>>> params = urllib.parse.urlencode({'spam': 1, 'eggs': 2, 'bacon': 0})
>>> url = "http://www.musi-cal.com/cgi-bin/query?%s" % params
>>> with urllib.request.urlopen(url) as f:
...     print(f.read().decode('utf-8'))
...

Следующий пример использует метод POST вместо этого. Обратите внимание, что параметры, выводимые из urlencode, кодируются в байты перед отправкой в urlopen как данные:

>>> import urllib.request
>>> import urllib.parse
>>> data = urllib.parse.urlencode({'spam': 1, 'eggs': 2, 'bacon': 0})
>>> data = data.encode('ascii')
>>> with urllib.request.urlopen("http://requestb.in/xrbl82xr", data) as f:
...     print(f.read().decode('utf-8'))
...

Следующий пример использует явно указанный прокси-сервер HTTP, игнорируя настройки среды:

>>> import urllib.request
>>> proxies = {'http': 'http://proxy.example.com:8080/'}
>>> opener = urllib.request.FancyURLopener(proxies)
>>> with opener.open("http://www.python.org") as f:
...     f.read().decode('utf-8')
...

Следующий пример не использует прокси-серверы вообще, переопределяя настройки среды:

>>> import urllib.request
>>> opener = urllib.request.FancyURLopener({})
>>> with opener.open("http://www.python.org/") as f:
...     f.read().decode('utf-8')
...

Легендарный интерфейс

Следующие функции и классы перенесены из модуля Python 2 urllib (в отличие от urllib2). Они могут быть устаревшими в будущем.

urllib.request.urlretrieve(url, filename=None, reporthook=None, data=None)

Копирует сетевой объект, обозначенный URL-адресом, в локальный файл. Если URL указывает на локальный файл, объект не будет скопирован, если не указан параметр filename. Возвращает кортеж (filename, headers), где filename — имя локального файла, в котором находится объект, а headers — всё, что вернул метод info() объекта, возвращённого urlopen() (для удалённого объекта). Исключение соответствует urlopen().

Второй аргумент, если он есть, указывает расположение файла для копирования (если отсутствует, расположение будет временным файлом с сгенерированным именем). Третий аргумент, если он есть, — вызываемый объект, который будет вызван один раз после установления сетевого соединения и один раз после каждого последующего чтения блока. Вызываемый объект будет получать три аргумента: количество переданных блоков до сих пор, размер блока в байтах и общий размер файла. Третий аргумент может быть -1 на более старых серверах FTP, которые не возвращают размер файла в ответ на запрос на извлечение.

Следующий пример иллюстрирует наиболее распространённый сценарий использования:

>>> import urllib.request
>>> local_filename, headers = urllib.request.urlretrieve('http://python.org/')
>>> html = open(local_filename)
>>> html.close()

Если url использует идентификатор схемы http:, необязательный аргумент data может быть передан для указания запроса POST (обычно тип запроса GET). Аргумент data должен быть объектом байтов в стандартном формате application/x-www-form-urlencoded; см. функцию urllib.parse.urlencode().

urlretrieve() будет поднимать ContentTooShortError при обнаружении того, что доступный объём данных был меньше ожидаемого объёма (который указан в заголовке Content-Length). Это может произойти, например, при прерывании загрузки.

Content-Length рассматривается как нижняя граница: если нужно прочитать больше данных, urlretrieve прочитает больше данных, но если доступно меньше данных, то он поднимет исключение.

В этом случае вы всё ещё можете получить загруженные данные, они хранятся в атрибуте content экземпляра исключения.

Если заголовок Content-Length не был предоставлен, urlretrieve не может проверить размер загруженных данных и просто возвращает их. В этом случае вы просто можете предположить, что загрузка прошла успешно.

urllib.request.urlcleanup()

Очищает временные файлы, которые могут остаться после предыдущих вызовов urlretrieve().

class urllib.request.URLopener(proxies=None, **x509)

Устарело начиная с версии 3.3.

Базовый класс для открытия и чтения URL-адресов. Если вам не нужно поддерживать открытие объектов, использующих схемы, отличные от http:, ftp:, или file:, вы, вероятно, захотите использовать FancyURLopener.

По умолчанию класс URLopener отправляет заголовок User-Agent со значением urllib/VVV, где VVV — номер версии urllib. Приложения могут определить свой собственный заголовок User-Agent, наследовавшись от URLopener или FancyURLopener и установив атрибут класса version в соответствующее строковое значение в определении подкласса.

Необязательный параметр proxies должен быть словарем, сопоставляющим имена схем с URL-адресами прокси, где пустой словарь полностью отключает прокси. Его значение по умолчанию — None, в этом случае будут использоваться системные настройки прокси, если они присутствуют, как обсуждается в определении urlopen() выше.

Дополнительные ключевые параметры, собранные в x509, могут использоваться для проверки подлинности клиента при использовании схемы https:. Поддерживаются ключевые слова key_file и cert_file для предоставления SSL-ключа и сертификата; оба необходимы для поддержки проверки подлинности клиента.

Объекты URLopener будут генерировать исключение OSError, если сервер вернёт код ошибки.

open(fullurl, data=None)

Открывает fullurl с использованием соответствующего протокола. Этот метод настраивает кеширование и прокси, а затем вызывает соответствующий метод open со своими входными аргументами. Если схема не распознаётся, вызывается open_unknown(). Аргумент data имеет такое же значение, как и аргумент data в urlopen().

Этот метод всегда использует функцию quote() для экранирования fullurl.

open_unknown(fullurl, data=None)

Переопределяемый интерфейс для открытия неизвестных типов URL.

retrieve(url, filename=None, reporthook=None, data=None)

Извлекает содержимое url и помещает его в filename. Результатом является кортеж, состоящий из локального имени файла и объекта email.message.Message (для удалённых URL), содержащего заголовки ответа, или None (для локальных URL). Затем вызывающая сторона должна открыть и прочитать содержимое filename. Если filename не указан и URL ссылается на локальный файл, возвращается имя входного файла. Если URL не локальный и filename не указан, имя файла — результат вызова tempfile.mktemp() с суффиксом, соответствующим суффиксу последнего компонента пути входного URL. Если указан reporthook, он должен быть функцией, принимающей три числовых параметра: номер блока, максимальный размер блоков для чтения и общий размер загрузки (-1, если неизвестен). Он будет вызван один раз в начале и после каждого блока данных, прочитанных из сети. reporthook игнорируется для локальных URL.

Если url использует схему http:, необязательный аргумент data может быть указан для задания запроса POST (обычно тип запроса GET). Аргумент data должен иметь стандартный формат application/x-www-form-urlencoded; см. функцию urllib.parse.urlencode().

version

Переменная, которая определяет пользовательского агента объекта open-раскрывателя. Чтобы заставить urllib сообщить серверам, что это определённый пользовательский агент, установите это значение в подклассе как переменную класса или в конструкторе перед вызовом базового конструктора.

class urllib.request.FancyURLopener(...)

Устарело начиная с версии 3.3.

FancyURLopener наследуется от URLopener и предоставляет обработку по умолчанию для следующих кодов HTTP-ответов: 301, 302, 303, 307 и 401. Для кодов ответов 30x, перечисленных выше, используется заголовок Location для получения фактического URL-адреса. Для кодов ответов 401 (требуется аутентификация) выполняется базовая аутентификация HTTP. Для кодов ответов 30x рекурсия ограничена значением атрибута maxtries, который по умолчанию равен 10.

Для всех остальных кодов ответов вызывается метод http_error_default(), который можно переопределить в подклассах для обработки ошибки соответствующим образом.

Примечание

Согласно RFC 2616, ответы 301 и 302 на POST-запросы не должны автоматически перенаправляться без подтверждения от пользователя. На практике браузеры разрешают автоматическое перенаправление этих ответов, изменяя POST на GET, и urllib воспроизводит это поведение.

Параметры конструктора такие же, как и для URLopener.

Примечание

При выполнении базовой аутентификации экземпляр FancyURLopener вызывает свой метод prompt_user_passwd(). Реализация по умолчанию запрашивает у пользователей необходимую информацию на контролируемом терминале. Подкласс может переопределить этот метод, чтобы обеспечить более подходящее поведение при необходимости.

Класс FancyURLopener предлагает один дополнительный метод, который следует перегрузить, чтобы обеспечить нужное поведение:

prompt_user_passwd(host, realm)

Возвращает информацию, необходимую для аутентификации пользователя на заданном хосте в указанной области безопасности. Значение должно быть кортежем, (user, password), который может быть использован для базовой аутентификации.

Реализация запрашивает эту информацию на терминале; приложение должно переопределить этот метод, чтобы использовать подходящую модель взаимодействия в локальной среде.

Ограничения urllib.request

  • В настоящее время поддерживаются только следующие протоколы: HTTP (версии 0.9 и 1.0), FTP, локальные файлы и данные URL.

    Изменено в версии 3.4: Добавлена поддержка данных URL.

  • Функция кеширования urlretrieve() отключена до тех пор, пока кто-то не найдёт время для реализации правильной обработки заголовков времени истечения срока действия.
  • Должна быть функция для проверки, присутствует ли определённый URL в кэше.
  • Для обеспечения обратной совместимости, если URL, по-видимому, указывает на локальный файл, но файл не может быть открыт, URL повторно интерпретируется с использованием протокола FTP. Это может иногда вызывать путающие сообщения об ошибках.
  • Функции urlopen() и urlretrieve() могут вызывать произвольно длительные задержки при ожидании установки сетевого соединения. Это затрудняет создание интерактивного веб-клиента с использованием этих функций без использования потоков.
  • Данные, возвращаемые функциями urlopen() или urlretrieve(), представляют собой сырые данные, возвращённые сервером. Это могут быть двоичные данные (например, изображение), обычный текст или (например) HTML. Протокол HTTP предоставляет информацию о типе в заголовке ответа, которую можно проверить, посмотрев заголовок Content-Type. Если возвращённые данные являются HTML, вы можете использовать модуль html.parser для их разбора.
  • Код, обрабатывающий протокол FTP, не может различать файл и директорию. Это может привести к неожиданному поведению при попытке чтения URL, указывающего на файл, который недоступен. Если URL заканчивается на /, предполагается, что он ссылается на директорию, и будет обработано соответствующим образом. Но если попытка чтения файла приводит к ошибке 550 (означающей, что URL не найден или недоступен, часто по причинам разрешений), то путь обрабатывается как директория, чтобы обработать случай, когда директория указана в URL, но заключительный / отсутствует. Это может привести к вводящим в заблуждение результатам, когда вы пытаетесь извлечь файл, чьи права доступа к чтению делают его недоступным; код FTP попытается прочитать его, потерпит неудачу с ошибкой 550, а затем выполнит список директорий для нечитаемого файла. Если требуется точный контроль, рассмотрите возможность использования модуля ftplib, наследования класса FancyURLopener или изменения _urlopener в соответствии со своими потребностями.

urllib.response — Классы ответов, используемые urllib

Модуль urllib.response определяет функции и классы, которые определяют минимальный интерфейс типа файла, включая read() и readline(). Типичный объект ответа — это экземпляр addinfourl, который определяет метод info() и возвращает заголовки, и метод geturl(), который возвращает URL. Функции, определённые в этом модуле, используются внутри модуля urllib.request.

© 2001–2020 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.7/library/urllib.request.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API