Сообщить об ошибке.

Функция urlopen() модуля urllib.request в Python

Открывает URL-адрес и читает ответ данные

Синтаксис:

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 устанавливается по умолчанию и обеспечивает обработку запросов через прокси.

Примеры открытия URL-адресов:

Больше примеров смотрите в обзорном материале по модулю 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'))