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

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


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

См.также

Пакет Requests рекомендуется использовать более высокоуровневый уровень для интерфейса HTTP клиента.

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

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

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

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

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

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

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

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

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

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

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

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

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

Вызывает URLError об ошибках протокола.

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

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

Унаследованная функция <unk> от <unk> 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 имеет значение true).

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

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

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

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

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-адреса percent-кодированный в синтаксис локальная для пути. При этом не принимается полный URL-адрес. Эта функция использует unquote() для декодирования path.

urllib.request.getproxies()

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

Примечание

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

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

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

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

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

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

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

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

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

Следующие два аргумента представляют интерес только для правильной обработки сторонних файлов cookie 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 или аутентификации. Этот data отправляется на HTTP-сервер сразу после заголовков. Нет поддержки для 100-продолжительного ожидания в библиотеке.

Изменено в версии 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)

Класс для обработки файлов cookie HTTP.

class urllib.request.ProxyHandler(proxies=None)

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

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

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

Примечание

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

class urllib.request.HTTPPasswordMgr

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

class urllib.request.HTTPPasswordMgrWithDefaultRealm

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

class urllib.request.HTTPPasswordMgrWithPriorAuth

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

Добавлено в версии 3.5.

class urllib.request.AbstractBasicAuthHandler(password_mgr=None)

Смешанный класс, который помогает при проверке подлинности HTTP как на удаленном узле, так и на прокси. password_mgr, если оно дано, должно быть чем-то совместимым с HTTPPasswordMgr; см. раздел Объекты HTTPPasswordMgr для получения информации об интерфейсе, который должен поддерживаться. Если passwd_mgr также предоставляет методы is_authenticated и update_authenticated (см. Объекты HTTPPassword MgrWityPriorAuth), то обработчик будет использовать результат 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 Authentication снова возвращает ответ 40x, он отправляется в Basic Authentication обработчик в Handle. Метод обработчика вызывает ValueError при представлении схемы аутентификации, отличной от Digest или Basic.

Изменено в версии 3.3: Поднять ValueError на неподдерживаемой схеме проверки подлинности.

class urllib.request.ProxyDigestAuthHandler(password_mgr=None)

Обработка аутентификации с помощью прокси-сервера. password_mgr, если оно дано, должно быть чем-то совместимым с HTTPPasswordMgr; см. раздел Объекты HTTPPasswordMgr для получения информации об интерфейсе, который должен поддерживаться.

class urllib.request.HTTPHandler

Класс для обработки открытия URL-адресов HTTP.

class urllib.request.HTTPSHandler(debuglevel=0, context=None, check_hostname=None)

Класс для обработки открытия URL-адресов HTTPS. context и check_hostname имеют то же значение, что и в http.client.HTTPSConnection.

Изменено в версии 3.2: Были добавлены context и check_hostname.

class urllib.request.FileHandler

Открыть локальный файл.

class urllib.request.DataHandler

Открыть URL-адреса данных.

Добавлено в версии 3.4.

class urllib.request.FTPHandler

Открыть URL-адреса FTP.

class urllib.request.CacheFTPHandler

Открыть URL-адреса FTP, сохраняя кэш открытых подключений FTP для минимизации задержек.

class urllib.request.UnknownHandler

Класс catch-all для обработки неизвестных 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 использует прокси-сервер, то селектором будет полный URL-адрес, передаваемый прокси-серверу.

Request.data

Тело объекта для запроса или None, если не указано.

Изменено в версии 3.4: Изменение значение Request.data теперь удаляет заголовок «Content-Length», если он был предварительно задан или рассчитан.

Request.unverifiable

Булевый, указывает, является ли запрос непроверяемым, как определено RFC 2965.

Request.method

Используемый метод запроса HTTP. По умолчанию его значение равно None, что означает, что get_method() будет выполнять нормальное вычисление используемый метода. Его значение можно задать (таким образом, переопределяя вычисление по умолчанию в get_method()) либо путем предоставления значение по умолчанию путем задания его на уровне класса в Request подкласс, либо путем передачи значение конструктору Request через аргумент method.

Добавлено в версии 3.3.

Изменено в версии 3.4: Теперь можно задать значение по умолчанию в подклассы; ранее его можно было задать только с помощью аргумента конструктора.

Request.get_method()

Возвращает строку, указывающее метод запроса HTTP. Если Request.method не None, возвращает его значение, в противном случае возвращает 'GET' если Request.data None, или 'POST' если он не. Это имеет значение только для HTTP-запросов.

Изменено в версии 3.3: get_method теперь смотрит на значение Request.method.

Request.add_header(key, val)

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

Request.add_unredirected_header(key, header)

Добавить заголовок, который не будет добавлен в перенаправленный запрос.

Request.has_header(header)

Возвращает, имеет ли сущность именованный заголовок (проверяет как обычный, так и ненаправленный).

Request.remove_header(header)

Удаление именованного заголовка из сущность запроса (как из обычных, так и из неназначенных заголовков).

Добавлено в версии 3.4.

Request.get_full_url()

Возвращает URL-адрес, указанный в конструкторе.

Изменено в версии 3.4.

Возвращает Request.full_url

Request.set_proxy(host, type)

Подготовить запрос, подключившись к прокси-серверу. host и type заменят сущность, а селектор сущность будет исходным URL, указанным в конструкторе.

Request.get_header(header_name, default=None)

Возвращает значение данного заголовка. Если заголовок отсутствует, возвращает значение по умолчанию.

Request.header_items()

Возвращает список кортежей (header_name, header_value) заголовков Request.

Изменено в версии 3.4: Методы запроса add_data, has_data, get_data, get_type, get_host, get_selector, get_origin_req_host и is_unverifiable, устаревшие с 3.3, были удалены.

Объекты OpenerDirector

OpenerDirector сущности иметь следующие методы:

OpenerDirector.add_handler(handler)

handler должно быть сущностью BaseHandler. Следующие методы найденный и добавляются в возможные цепочки (обратите внимание, что ошибки HTTP являются частным случаем). Следует отметить, что ниже protocol должен быть заменен фактическим протоколом для обработки, например, http_response() будет обработчик ответа протокола HTTP. Также type следует заменить фактическим код HTTP, например, http_error_404() будет обрабатывать ошибки HTTP 404.

  • <protocol>_open() — сигнал о том, что обработчик умеет открывать protocol URL-адреса.

    Дополнительные сведения см. в разделе BaseHandler.<protocol>_open().

  • Сигнал http_error_<type>() —, что обработчик знает, как обработать ошибки HTTP с ошибочным код type HTTP.

    Дополнительные сведения см. в разделе BaseHandler.http_error_<nnn>().

  • Сигнал <protocol>_error() —, что обработчик знает, как обработать ошибки от (non-``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() вызываются для обработки запроса. Эта стадия заканчивается когда обработчик любой возвращает non-:const:None значение (т.е. ответ) или вызывает исключение (обычно URLError). Разрешены исключения для распространения.

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

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

  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, но подклассы должны переопределить его, если они намереваются предоставить команду catch-all для необработанных HTTP-ошибок. Он будет вызываться автоматически OpenerDirector, получающим ошибку, и обычно не должен вызываться при других обстоятельствах.

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

Возвращает значения и исключения должны совпадать с urlopen().

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

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

Подклассы должны переопределять этот метод для обработки определенных ошибок HTTP.

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

BaseHandler.<protocol>_request(req)

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

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

BaseHandler.<protocol>_response(req, response)

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

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

Объекты HTTPRedirectHandler

Примечание

Некоторые перенаправления HTTP требуют действий с клиентского код этого модуля. Если это так, HTTPError поднимается. Для получения подробной информации о точном значении различных RFC 2616 перенаправления см. коды.

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

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

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

Примечание

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

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

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

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

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

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

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

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

То же, что и http_error_301(), но требует ответа «временное перенаправление».

Объекты HTTPCookieProcessor

HTTPCookieProcessor у сущности есть один атрибут:

HTTPCookieProcessor.cookiejar

http.cookiejar.CookieJar, в котором хранятся файлы cookie.

Объекты 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.

HTTPPasswordMgr.find_user_password(realm, authuri)

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

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

Объекты HTTPPassword MgrWityPriorAuth

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

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

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

HTTPPasswordMgrWithPriorAuth.find_user_password(realm, authuri)

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

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

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

HTTPPasswordMgrWithPriorAuth.is_authenticated(self, authuri)

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

Объекты AbstractBasicAuthHandler

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

Обработка запроса аутентификации путем получения пары «пользователь-пароль» и повторной попытки запроса. authreq должно быть именем заголовка, где информация о области включена в запрос, host указывает URL-адрес и путь для проверки подлинности, req должен быть объектом (failed) 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 должен быть объектом (failed) 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. Эта реализация игнорирует пробелы в URL-адресах кодированный данных base64, поэтому URL-адрес может быть заключен в любой исходный файл, из которого он получен. Но даже если некоторые браузеры не возражают против отсутствующего заполнения в конце URL-адреса данных base64 кодированный, эта реализация вызовет ValueError в этом случае.

Объекты FTPHandler

FTPHandler.ftp_open(req)

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

Объекты CacheFTPHandler

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

CacheFTPHandler.setTimeout(t)

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

CacheFTPHandler.setMaxConns(m)

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

Объекты UnknownHandler

UnknownHandler.unknown_open()

Создать исключение URLError.

Объекты HTTPErrorProcessor

HTTPErrorProcessor.http_response(request, response)

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

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

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

HTTPErrorProcessor.https_response(request, response)

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

Поведение такое же, как и у http_response().

Примеры

В дополнение к приведенным ниже примерам в HOWTO получение интернет-ресурсов с использованием пакета urllib приведены дополнительные примеры.

Этот пример получает главную страницу python.org и отображает первые 300 байт страницы.:

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

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

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

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

>>> 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
# Создать OpenerDirector с поддержкой базовой HTTP-аутентификации ...
auth_handler = urllib.request.HTTPBasicAuthHandler()
auth_handler.add_password(realm='PDQ Application',
                          uri='https://mahler:8092/site-updates.py',
                          user='klem',
                          passwd='kadidd!ehopper')
opener = urllib.request.build_opener(auth_handler)
# ... и установите его глобально, чтобы его можно было использовать с urlopen.
urllib.request.install_opener(opener)
urllib.request.urlopen('http://www.example.com/login.html')

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

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

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

opener = urllib.request.build_opener(proxy_handler, proxy_auth_handler)
# На этот раз вместо установки OpenerDirector мы используем его напрямую:
opener.open('http://www.example.com/login.html')

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

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

import urllib.request
req = urllib.request.Request('http://www.example.com/')
req.add_header('Referer', 'http://www.python.org/')
# Настройка значения заголовка User-Agent по умолчанию:
req.add_header('User-Agent', 'urllib-example/0.1 (Contact: . . .)')
r = urllib.request.urlopen(req)

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

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

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

Вот пример сеанса, который использует метод 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, 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_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- адрес non-local и 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 в соответствии с вашими потребностями.

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

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