from urllib.request import urlopen resp = urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None)
url
- URL-адрес,data=None
- дополнительные данные для отправки на сервер,timeout
- указывает тайм-аут в секундах для блокирующих операций,cafile=None
- файл, содержащий набор сертификатов для HTTPS запроса,capath=None
- каталог хешированных файлов сертификатов,cadefault=False
- игнорируется,context=None
- экземпляр ssl.SSLContext
, описывающий различные параметры SSL.Функция urlopen()
модуля urllib.request
открывает URL-адрес url
, который может быть либо строкой, либо объектом запроса Request
.
Аргумент data
должен быть объектом, определяющим дополнительные данные для отправки на сервер, или None
, если такие данные не нужны. Смотрите более подробно в описании класса Request
.
Модуль urllib.request использует HTTP/1.1 и включает заголовок Connection: close
в свои HTTP-запросы.
Необязательный параметр тайм-аута timeout
указывает тайм-аут в секундах для блокирующих операций, таких как попытка подключения (если не указан, будет использоваться глобальная настройка тайм-аута по умолчанию). На самом деле это работает только для HTTP, HTTPS и FTP-соединений.
Если указан аргумент context
, это должен быть экземпляр ssl.SSLContext
, описывающий различные параметры SSL. Для получения дополнительных сведений смотрите описание http.client.HTTPSConnection
.
Необязательные параметры cafile
и capath
определяют набор доверенных сертификатов CA для запросов HTTPS. Аргумент cafile
должен указывать на один файл, содержащий набор сертификатов CA, тогда как capath
должен указывать на каталог хешированных файлов сертификатов.
Параметр cadefault
игнорируется.
Функция urllib.request.urlopen
всегда возвращает объект, который может работать как менеджер контекста и имеет свойства url
, заголовки и статус. Для получения дополнительных сведений об этих свойствах смотрите описание объекта urllib.response.addinfourl
.
Для URL-адресов HTTP и HTTPS эта функция возвращает слегка измененный объект http.client.HTTPResponse
. В дополнение к трем новым методам, атрибут msg
содержит ту же информацию, что и атрибут reason
возвращаемый сервером, вместо заголовков ответа, как указано в документации для HTTPResponse
.
Для URL-адресов FTP, файлов и данных и запросов, явно обрабатываемых устаревшими классами URLopener
и FancyURLopener
, эта функция возвращает объект urllib.response.addinfourl
.
Функция urllib.request.urlopen
вызывает URLError
при ошибках протокола.
Обратите внимание, что может быть возвращено None
, если никакой обработчик не обрабатывает запрос (хотя установленный по умолчанию глобальный OpenerDirector
использует UnknownHandler
, чтобы этого никогда не происходило).
Кроме того, если обнаружены параметры прокси-сервера (например, когда установлена переменная среды *_proxy
, например http_proxy
), urllib.request.ProxyHandler
устанавливается по умолчанию и обеспечивает обработку запросов через прокси.
Больше примеров смотрите в обзорном материале по модулю urllib.request
.
>>> import urllib.request >>> response = urllib.request.urlopen('http://www.python.org/') >>> print(response.read(100).decode('utf-8')) # <!doctype html> # <!--[if lt IE 7]> <html class="no-js ie6 lt-ie7 lt-ie8 lt-ie9"> <![endif]--> >>> response.status # 200 >>> dict(response.headers) # {'Connection': 'close', 'Content-Length': '49562', 'Server': 'nginx', # 'Content-Type': 'text/html; charset=utf-8', 'X-Frame-Options': 'DENY', # ... # 'Strict-Transport-Security': 'max-age=63072000; includeSubDomains'} >>> response.headers['Content-Type'] # 'text/html; charset=utf-8' >>> response.url # 'https://www.python.org/'
В следующем примере используется метод POST
. Обратите внимание, что вывод params
из urlencode
кодируется в байты, перед отправкой в функцию urlopen()
как аргумент data
:
>>> 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'))
Вот пример запроса, в котором используется метод GET для получения URL-адреса, содержащего параметры:
>>> import urllib.request >>> import urllib.parse >>> params = urllib.parse.urlencode({'spam': 1, 'eggs': 2, 'bacon': 0}) >>> url = f"http://www.musi-cal.com/cgi-bin/query?{params}" >>> with urllib.request.urlopen(url) as f: ... print(f.read().decode('utf-8'))
urllib.request.urlopen()
в Python?Так как исключение тайм-аута прилетает от модуля socket
, поэтому необходимо создать еще один блок except:
и поймать новое исключение socket.timeout
.
import urllib.request, socket, urllib.error url = 'https://www.usembassy.gov/' try: response = urllib.request.urlopen(url, timeout=0.05) except (urllib.error.HTTPError, urllib.error.URLError) as error: print(f'Data of not retrieved because {error}\nURL: {url}') except socket.timeout: print(f'socket timed out - URL {url}') else: print(response.read().decode('utf-8'))