urllib — Открытие произвольных ресурсов по URL
Примечание
Модуль urllib был разделен на части и переименован в Python 3 на urllib.request, urllib.parse, и urllib.error. Инструмент 2to3 автоматически адаптирует импорты при преобразовании ваших источников в Python 3. Также обратите внимание, что функция urllib.request.urlopen() в Python 3 эквивалентна urllib2.urlopen(), а urllib.urlopen() была удалена.
Этот модуль предоставляет высокоуровневый интерфейс для получения данных через Всемирную паутину. В частности, функция urlopen() похожа на встроенную функцию open(), но принимает универсальные идентификаторы ресурсов (URL) вместо имён файлов. Применяются некоторые ограничения — она может открывать URL только для чтения, и операции поиска недоступны.
См. также
Для высокоуровневого HTTP-клиентского интерфейса рекомендуется пакет Requests.
Изменено в версии 2.7.9: Для HTTPS-URI, urllib по умолчанию выполняет все необходимые проверки сертификатов и имени хоста.
Предупреждение
Для версий Python, предшествующих 2.7.9, urllib не пытается валидировать сертификаты сервера для HTTPS-URI. Используйте на свой страх и риск!
1. Высокоуровневый интерфейс
-
urllib.urlopen(url[, data[, proxies[, context]]]) -
Открывает сетевой объект, обозначенный URL, для чтения. Если у URL нет идентификатора схемы или он имеет идентификатор схемы
file:, это открывает локальный файл (без универсальных новых строк); в противном случае открывает сокет к серверу где-то в сети. Если подключение не может быть установлено, возбуждается исключениеIOError. Если всё прошло успешно, возвращается файлоподобный объект. Он поддерживает следующие методы:read(),readline(),readlines(),fileno(),close(),info(),getcode()иgeturl(). Он также поддерживает протокол итератора. Одно замечание: методread(), если аргумент size опущен или отрицателен, может не читать до конца потока данных; нет хорошего способа определить, что весь поток из сокета был прочитан в общем случае.За исключением методов
info(),getcode()иgeturl(), эти методы имеют тот же интерфейс, что и для объектов файлов — см. раздел Объекты файлов в этом руководстве. (Однако, это не встроенный объект файла, поэтому его нельзя использовать в тех немногих местах, где требуется настоящий встроенный объект файла.)Метод
info()возвращает экземпляр классаmimetools.Message, содержащий метаинформацию, связанную с URL. Когда метод HTTP, эти заголовки — те, которые возвращены сервером в начале полученной HTML-страницы (включая Content-Length и Content-Type). Когда метод FTP, заголовок Content-Length будет присутствовать, если (как обычно) сервер вернул длину файла в ответ на запрос на получение файла по FTP. Заголовок Content-Type будет присутствовать, если тип MIME можно угадать. При локальном файле возвращаемые заголовки будут включать Date, представляющий время последнего изменения файла, Content-Length, задающий размер файла, и Content-Type, содержащий догадку о типе файла. См. также описание модуляmimetools.Метод
geturl()возвращает фактический URL страницы. В некоторых случаях HTTP-сервер перенаправляет клиента на другой URL. Функцияurlopen()обрабатывает это прозрачно, но в некоторых случаях вызывающему коду нужно знать, на какой URL был перенаправлен клиент. Методgeturl()может использоваться для получения этого перенаправленного URL.Метод
getcode()возвращает HTTP-код состояния, который был отправлен вместе с ответом, илиNone, если URL не является HTTP-URL.Если url использует идентификатор схемы
http:, необязательный аргумент data может быть передан для указания запросаPOST(обычно тип запросаGET). Аргумент data должен быть в стандартном формате application/x-www-form-urlencoded; см. функциюurlencode()ниже.Функция
urlopen()прозрачно работает с прокси, не требующими аутентификации. В среде Unix или Windows установите переменные окруженияhttp_proxy, илиftp_proxyна URL, который идентифицирует прокси-сервер, перед запуском интерпретатора Python. Например ('%'- командная строка):% http_proxy="http://www.someproxy.com:3128" % export http_proxy % python ...
Переменная окружения
no_proxyможет использоваться для указания хостов, которые не должны достигаться через прокси; если она установлена, она должна содержать список хостов, разделенных запятыми, необязательно с добавленным:port, напримерcern.ch,ncsa.uiuc.edu,some.host:8080.В среде Windows, если переменные окружения прокси не установлены, настройки прокси получаются из раздела Internet Settings в реестре.
В среде Mac OS X,
urlopen()будет извлекать информацию о прокси из фреймворка конфигурации системы OS X, который может управляться с помощью панели «Настройки системы сети».В качестве альтернативы, необязательный аргумент proxies может быть использован для явного указания прокси. Он должен быть словарем, сопоставляющим имена схем с URL-адресами прокси, где пустой словарь не использует прокси, а
None(значение по умолчанию) использует настройки прокси из среды, как обсуждалось выше. Например:# Use http://www.someproxy.com:3128 for HTTP proxying proxies = {'http': 'http://www.someproxy.com:3128'} filehandle = urllib.urlopen(some_url, proxies=proxies) # Don't use any proxies filehandle = urllib.urlopen(some_url, proxies={}) # Use proxies from environment - both versions are equivalent filehandle = urllib.urlopen(some_url, proxies=None) filehandle = urllib.urlopen(some_url)Прокси, требующие аутентификации для использования, в настоящее время не поддерживаются; это считается ограничением реализации.
Параметр context может быть установлен на экземпляр
ssl.SSLContextдля настройки параметров SSL, которые используются, еслиurlopen()устанавливает HTTPS-соединение.Изменено в версии 2.3: Добавлена поддержка proxies.
Изменено в версии 2.6: Добавлен
getcode()к возвращаемому объекту и поддержка переменной окруженияno_proxy.Изменено в версии 2.7.9: Добавлен параметр context. Все необходимые проверки сертификатов и имени хоста выполняются по умолчанию.
Устарело начиная с версии 2.6: Функция
urlopen()была удалена в Python 3 в пользуurllib2.urlopen().
-
urllib.urlretrieve(url[, filename[, reporthook[, data[, context]]]]) -
Копирует сетевой объект, обозначенный URL, в локальный файл, если необходимо. Если URL указывает на локальный файл или существует действительная кэшированная копия объекта, объект не копируется. Возвращает кортеж
(filename, headers), где filename — имя локального файла, в котором можно найти объект, а headers — то, что вернул методinfo()объекта, возвращаемогоurlopen()(для удалённого объекта, возможно, кэшированного). Исключение аналогичны тем, что уurlopen().Второй аргумент, если он есть, определяет местоположение файла, в который будет скопирован объект (если отсутствует, местоположением будет временный файл с сгенерированным именем). Третий аргумент, если он есть, — это вызываемый объект, который будет вызван один раз при установлении сетевого соединения и один раз после каждого последующего чтения блока. Вызываемый объект будет передан три аргумента: количество переданных блоков до этого момента, размер блока в байтах и общий размер файла. Третий аргумент может быть
-1на старых серверах FTP, которые не возвращают размер файла в ответ на запрос на получение.Если url использует идентификатор схемы
http:, необязательный аргумент data может быть задан для указания запросаPOST(обычно тип запросаGET). Аргумент data должен быть в стандартном формате application/x-www-form-urlencoded; см. функциюurlencode()ниже.Параметр context может быть установлен на экземпляр
ssl.SSLContextдля настройки настроек SSL, которые используются, еслиurlretrieve()устанавливает соединение HTTPS.Изменено в версии 2.5:
urlretrieve()будет подниматьContentTooShortError, когда обнаружит, что количество доступных данных меньше ожидаемого количества (которое является размером, указанным в заголовке Content-Length). Это может произойти, например, при прерывании загрузки.Content-Length рассматривается как нижняя граница: если есть больше данных для чтения,
urlretrieve()прочитает больше данных, но если данных меньше, то поднимет исключение.В этом случае вы все ещё можете получить загруженные данные, они хранятся в атрибуте
contentэкземпляра исключения.Если заголовок Content-Length не был предоставлен,
urlretrieve()не может проверить размер загруженных данных и просто возвращает их. В этом случае вы должны предположить, что загрузка прошла успешно.Изменено в версии 2.7.9: Добавлен параметр context. Все необходимые проверки сертификатов и имён хостов выполняются по умолчанию.
-
urllib._urlopener -
Общедоступные функции
urlopen()иurlretrieve()создают экземпляр классаFancyURLopenerи используют его для выполнения запрошенных действий. Чтобы переопределить это функциональность, программисты могут создать подклассURLopenerилиFancyURLopener, а затем присвоить экземпляр этого класса переменнойurllib._urlopenerперед вызовом нужной функции. Например, приложения могут захотеть указать другой заголовок User-Agent, чем определён вURLopener. Это можно сделать с помощью следующего кода:import urllib class AppURLopener(urllib.FancyURLopener): version = "App/1.7" urllib._urlopener = AppURLopener()
-
urllib.urlcleanup() -
Очистить кэш, который мог быть создан предыдущими вызовами
urlretrieve().
2. Функции-утилиты
-
urllib.quote(string[, safe]) -
Заменить специальные символы в строке с помощью кодирования
%xx. Буквы, цифры и символы'_.-'никогда не кодируются. По умолчанию эта функция предназначена для кодирования части пути URL. Необязательный параметр safe определяет дополнительные символы, которые не должны кодироваться — его значение по умолчанию'/'.Пример:
quote('/~connolly/')возвращает'/%7econnolly/'.
-
urllib.quote_plus(string[, safe]) -
Подобно
quote(), но также заменяет пробелы знаком «плюс», как требуется для кодирования значений HTML-формы при построении строки запроса для включения в URL. Знаки «плюс» в исходной строке кодируются, если они не включены в safe. Также у него нет значения safe по умолчанию'/'.
-
urllib.unquote(string) -
Заменить
%xxкодирования их односимвольными эквивалентами.Пример:
unquote('/%7Econnolly/')возвращает'/~connolly/'.
-
urllib.unquote_plus(string) -
Подобно
unquote(), но также заменяет знаки «плюс» пробелами, как требуется для декодирования значений HTML-форм.
-
urllib.urlencode(query[, doseq]) -
Преобразовать объект отображения или последовательность пар «ключ-значение» в строку «процентно-кодированную» строку, подходящую для передачи в
urlopen()в качестве необязательного аргумента data. Это полезно для передачи словаря полей формы в запросPOST. Полученная строка представляет собой ряд пар «ключ-значение» разделенных символамиkey=value, где и ключ и значение закодированы с помощьюquote_plus()выше. Когда в качестве аргумента query используется последовательность пар «ключ-значение», первый элемент каждой пары — это ключ, а второй — значение. Элемент значения может быть последовательностью, и в этом случае, если необязательный параметр doseq равенTrue, для каждого элемента последовательности значений ключа генерируются отдельные пары «ключ-значение», разделённые символами'&'. Порядок параметров в закодированной строке будет соответствовать порядку пар параметров в последовательности. Модульurlparseпредоставляет функцииparse_qs()иparse_qsl(), которые используются для разбора строк запроса в структуры данных Python.
-
urllib.pathname2url(path) -
Преобразуйте путь path из локального синтаксиса для пути в форму, используемую в компоненте пути URL. Это не генерирует полный URL. Возвращаемое значение уже будет закодировано с использованием функции
quote().
-
urllib.url2pathname(path) -
Преобразовать компонент пути path из процентно-кодированного URL в локальный синтаксис пути. Эта функция не принимает полный URL. Эта функция использует
unquote()для декодирования path.
-
urllib.getproxies() -
Эта вспомогательная функция возвращает словарь сопоставлений схемы к URL-адресам прокси-серверов. Она сканирует среду на наличие переменных с именами
<scheme>_proxy, в регистронезависимом режиме, для всех операционных систем в первую очередь, и когда она не находит, ищет информацию о прокси из Mac OSX System Configuration для Mac OS X и реестра систем Windows для Windows. Если существуют переменные среды и в нижнем регистре, и в верхнем регистре (и они не совпадают), используется переменная в нижнем регистре.Примечание
Если переменная среды
REQUEST_METHODустановлена, что обычно указывает, что ваш скрипт работает в среде CGI, переменная средыHTTP_PROXY(в верхнем регистре_PROXY) будет проигнорирована. Это потому, что эта переменная может быть внедрена клиентом с использованием HTTP-заголовка «Proxy:». Если вам нужно использовать HTTP-прокси в среде CGI, либо явно укажитеProxyHandler, либо убедитесь, что имя переменной находится в нижнем регистре (или, по крайней мере, суффикс_proxy).
Примечание
urllib также предоставляет определенные вспомогательные функции, такие как splittype, splithost и другие, для разбора URL на различные компоненты. Но рекомендуется использовать urlparse для разбора URL, а не использовать эти функции напрямую. Python 3 не предоставляет эти вспомогательные функции из модуля urllib.parse.
3. Объекты открывателей URL
-
class urllib.URLopener([proxies[, context[, **x509]]]) -
Базовый класс для открытия и чтения URL-адресов. Если вам не нужно поддерживать открытие объектов с использованием схем, отличных от
http:,ftp:, илиfile:, вы, вероятно, захотите использоватьFancyURLopener.По умолчанию класс
URLopenerотправляет заголовок User-Agent со значениемurllib/VVV, где VVV — номер версииurllib. Приложения могут определять свой собственный заголовок User-Agent, наследуя от классаURLopenerилиFancyURLopenerи устанавливая атрибут классаversionв соответствующее строковое значение в определении подкласса.Необязательный параметр proxies должен быть словарем, сопоставляющим имена схем с URL-адресами прокси-серверов, где пустой словарь полностью отключает прокси. Его значение по умолчанию —
None, в этом случае будут использоваться системные настройки прокси, если они заданы, как описано в определенииurlopen()выше.Параметр context может быть экземпляром
ssl.SSLContext. Если он задан, он определяет настройки SSL, которые используется открывателем для установления HTTPS-соединений.Дополнительные ключевые параметры, собранные в x509, могут использоваться для аутентификации клиента при использовании схемы
https:. Поддерживаются ключевые слова key_file и cert_file для предоставления SSL-ключа и сертификата; оба необходимы для поддержки аутентификации клиента.Объекты
URLopenerбудут генерировать исключениеIOError, если сервер вернёт код ошибки.Изменено в версии 2.7.9: Добавлен параметр context. Все необходимые проверки сертификата и имени хоста выполняются по умолчанию.
-
open(fullurl[, data]) -
Открывает fullurl с использованием соответствующего протокола. Этот метод устанавливает информацию о кэше и прокси, а затем вызывает соответствующий метод open со своими входными аргументами. Если схема не распознаётся, вызывается
open_unknown(). Аргумент data имеет то же значение, что и аргумент data вurlopen().
-
open_unknown(fullurl[, data]) -
Переопределяемый интерфейс для открытия неизвестных типов URL.
-
retrieve(url[, filename[, reporthook[, data]]]) -
Извлекает содержимое url и помещает его в filename. Возвращаемое значение — кортеж, состоящий из локального имени файла и либо объекта
mimetools.Message, содержащего заголовки ответа (для удалённых URL), либоNone(для локальных URL). Затем вызывающая сторона должна открыть и прочитать содержимое filename. Если filename не задан и URL ссылается на локальный файл, возвращается имя входного файла. Если URL не локальный и filename не задан, имя файла — результат работыtempfile.mktemp()с суффиксом, соответствующим суффиксу последнего компонента пути входного URL. Если задан reporthook, он должен быть функцией, принимающей три числовых параметра. Она будет вызываться после чтения каждого блока данных из сети. reporthook игнорируется для локальных URL.Если url использует идентификатор схемы
http:, необязательный аргумент data может быть задан для указания запросаPOST(обычно тип запроса —GET). Аргумент data должен быть в стандартном формате application/x-www-form-urlencoded; см. функциюurlencode()ниже.
-
version -
Переменная, которая указывает пользовательского агента объекта открывателя. Чтобы заставить
urllibсообщить серверам, что это определённый пользовательский агент, установите это значение в подклассе в качестве переменной класса или в конструкторе до вызова базового конструктора.
-
-
class urllib.FancyURLopener(...) -
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), который может использоваться для базовой аутентификации.Реализация запрашивает эту информацию в терминале; приложение должно переопределить этот метод, чтобы использовать соответствующую модель взаимодействия в локальной среде.
-
-
exception urllib.ContentTooShortError(msg[, content]) -
Это исключение возникает, когда функция
urlretrieve()обнаруживает, что объём загруженных данных меньше ожидаемого объёма (заданного заголовком Content-Length). Атрибутcontentхранит загруженные (и предположительно усечённые) данные.Добавлено в версии 2.5.
4. Ограничения urllib
- В настоящее время поддерживаются только следующие протоколы: HTTP (версии 0.9 и 1.0), FTP и локальные файлы.
- Функция кеширования
urlretrieve()отключена до тех пор, пока не будет реализована надлежащая обработка заголовков времени истечения срока действия. - Должна быть функция для запроса о том, находится ли определенный URL-адрес в кэше.
- Для обратной совместимости, если URL-адрес, по-видимому, указывает на локальный файл, но файл не может быть открыт, URL-адрес повторно интерпретируется с использованием протокола FTP. Это иногда может приводить к запутанным сообщениям об ошибках.
- Функции
urlopen()иurlretrieve()могут вызывать произвольно большие задержки при ожидании подключения к сети. Это означает, что сложно создать интерактивный веб-клиент, используя эти функции без использования потоков. - Данные, возвращаемые
urlopen()илиurlretrieve(), представляют собой исходные данные, возвращенные сервером. Это могут быть двоичные данные (например, изображение), обычный текст или (например) HTML. Протокол HTTP предоставляет информацию о типе в заголовке ответа, которую можно проверить, просмотрев заголовок Content-Type. Если возвращаемые данные являются HTML, вы можете использовать модульhtmllibдля их разбора. - Код, обрабатывающий протокол FTP, не может различать файл и директорию. Это может привести к неожиданному поведению при попытке чтения URL-адреса, указывающего на файл, который недоступен. Если URL-адрес заканчивается на
/, предполагается, что он относится к каталогу, и он будет обработан соответствующим образом. Но если попытка чтения файла приводит к ошибке 550 (что означает, что URL-адрес не найден или недоступен, часто по причинам разрешения доступа), то путь рассматривается как каталог для обработки случая, когда каталог указан URL-адресом, но заключительный/опущен. Это может привести к вводящим в заблуждение результатам, когда вы пытаетесь получить файл, чтение которого запрещено; код FTP попытается прочитать его, потерпит неудачу с ошибкой 550, а затем выполнит список каталогов для недоступного файла. Если требуется точный контроль, рассмотрите возможность использования модуляftplib, наследования классаFancyURLopenerили изменения _urlopener для соответствия вашим потребностям. - Этот модуль не поддерживает использование прокси, требующих аутентификации. Это может быть реализовано в будущем.
- Хотя модуль
urllibсодержит (недокументированные) процедуры для разбора и разбора строк URL-адресов, рекомендуемый интерфейс для работы с URL-адресами находится в модулеurlparse.
5. Примеры
Вот пример сеанса, который использует метод GET для получения URL-адреса, содержащего параметры:
>>> import urllib
>>> params = urllib.urlencode({'spam': 1, 'eggs': 2, 'bacon': 0})
>>> f = urllib.urlopen("http://www.musi-cal.com/cgi-bin/query?%s" % params)
>>> print f.read()
В следующем примере используется метод POST:
>>> import urllib
>>> params = urllib.urlencode({'spam': 1, 'eggs': 2, 'bacon': 0})
>>> f = urllib.urlopen("http://www.musi-cal.com/cgi-bin/query", params)
>>> print f.read()
В следующем примере используется явно указанный HTTP-прокси, перезаписывающий настройки среды:
>>> import urllib
>>> proxies = {'http': 'http://proxy.example.com:8080/'}
>>> opener = urllib.FancyURLopener(proxies)
>>> f = opener.open("http://www.python.org")
>>> f.read()
В следующем примере вообще не используются прокси, перезаписывающие настройки среды:
>>> import urllib
>>> opener = urllib.FancyURLopener({})
>>> f = opener.open("http://www.python.org/")
>>> f.read()
© 2001–2020 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/2.7/library/urllib.html