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'
, если dataNone
или'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-адреса в три этапа:
Порядок, в котором эти методы вызываются на каждом этапе, определяется сортировкой обработчик сущности.
Каждый обработчик с методом с именем
<protocol>_request()
вызывает этот метод для предварительной обработки запроса.Обработчики с методом с именем
<protocol>_open()
вызываются для обработки запроса. Эта стадия заканчивается когда обработчик любой возвращает non-:const:None значение (т.е. ответ) или вызывает исключение (обычноURLError
). Разрешены исключения для распространения.Фактически, вышеупомянутый алгоритм сначала опробован для методов, названных
default_open()
. Если все такие методы возвращаетNone
, алгоритм повторяется для методов, названных как<protocol>_open()
. Если все такие методы возвращаетNone
, алгоритм повторяется для методов с именемunknown_open()
.Следует отметить, что реализация этих методов может включать в себя вызовы методов
open()
иerror()
родительскогоOpenerDirector
сущность.Каждый обработчик с методом с именем
<protocol>_response()
вызывает этот метод для последующей обработки ответа.
Объекты BaseHandler¶
BaseHandler
объекты предоставляют несколько методов, которые являются
непосредственно полезными, и другие, которые предназначены для используемый
производными классами. Они предназначены для непосредственного использования:
-
BaseHandler.
add_parent
(director)¶ Добавление директора в качестве родителя.
-
BaseHandler.
close
()¶ Удалить всех родителей.
Следующие атрибут и методы должны быть используемый только классами,
производными от BaseHandler
.
Примечание
Была принята конвенция о том, что подклассы, определяющие <protocol>_request()
или
методы <protocol>_response()
, именуются *Processor
; все остальные названы *Handler
.
-
BaseHandler.
parent
¶ Допустимый
OpenerDirector
, который можно используемый для открытия с использованием другого протокола или обработки ошибок.
-
BaseHandler.
default_open
(req)¶ Метод не определен в
BaseHandler
, но подклассы должны определить его, если они хотят ловить все URL-адреса.Метод, если он реализован, будет вызван родительским
OpenerDirector
. Он должен возвращает похожим на файл объектом, как описано в возвращает значениеopen()
OpenerDirector
, илиNone
. Это должно вызватьURLError
, если только не произойдет действительно исключительная вещь (например,MemoryError
не должно быть отображено наURLError
).Метод будет вызван перед любым открытым методом, зависящим от протокола.
-
BaseHandler.<protocol>_open(req)
Метод не определен в
BaseHandler
, но подклассы должны определить его, если они хотят обрабатывать URL-адреса с данным протоколом.Метод, если он определен, будет вызван родительским
OpenerDirector
. Возвращает значения должно быть таким же, как дляdefault_open()
.
-
BaseHandler.
unknown_open
(req)¶ Метод не определен в
BaseHandler
, но подклассы должны определить его, если они хотят поймать все URL-адреса без определенных зарегистрированных обработчик, чтобы открыть его.Метод, если он реализован, будет вызван
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
у сущности есть один атрибут:
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¶
Объекты 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¶
Объекты 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.
Объекты 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-Agenturllib/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 имеет то же значение, что и аргумент dataurlopen()
.Метод всегда закавычивает 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()
.
-
-
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
.