Язык программирования Python.

Возможности urllib2.

Функциональности модулей urllib и urlparse хватает для большинства задач, которые решают сценарии на Python как web–клиенты. Тем не менее, иногда требуется больше. На этот случай можно использовать модуль для работы с протоколом HTTP — httplib — и создать собственный класс для HTTP–запросов (в лекциях модуль httplib не рассматривается). Однако вполне вероятно, что нужная функциональность уже имеется в модуле urllib2.

Одна из полезных возможностей этих модулей — доступ к web–объектам, требующий авторизации. Ниже будет рассмотрен пример, который не только обеспечит доступ с авторизацией, но и обозначит основную идею модуля urllib2: использование обработчиков (handlers), каждый из которых решает узкую специфическую задачу.

Следующий пример показывает, как создать собственный открыватель URL с помощью модуля urllib2 (этот пример взят из документации по Python):

Import urllib2.

# Подготовка идентификационных данных.

Authinfo = urllib2.HTTPBasicAuthHandler().

Authinfo.add_password('My page', 'localhost', 'user1', 'secret').

# Доступ через прокси.

Proxy_support = urllib2.ProxyHandler({'http' : 'http://localhost:8080'}).

# Создание нового открывателя с указанными обработчиками.

Opener = urllib2.build_opener(proxy_support,

Authinfo,

Urllib2.CacheFTPHandler).

# Установка поля с названием клиента.

Opener.addheaders = [('User–agent', 'Mozilla/5.0')].

# Установка нового открывателя по умолчанию.

Urllib2.install_opener(opener).

# Использование открывателя.

F = urllib2.urlopen('http://localhost/mywebdir/').

Print f.read()[:100].

В этом примере получен доступ к странице, которую охраняет mod_python (см. предыдущую лекцию). Первый аргумент при вызове метода add_password() задает область действия (realm) идентификационных данных (он задан директивой AuthName "My page" в конфигурации web–сервера). Остальные параметры достаточно понятны: имя хоста, на который нужно получить доступ, имя пользователя и его пароль. Разумеется, для корректной работы примера нужно, чтобы на локальном web–сервере был каталог, требующий авторизации.

В данном примере явным образом затронуты всего три обработчика: HTTPBasicAuthHandler, ProxyHandler и CacheFTPHandler. В модуле urllib2 их более десятка, назначение каждого можно узнать из документации к используемой версии Python. Есть и специальный класс для управления открывателями: OpenerDirector. Именно его экземпляр создала функция urllib2.build_opener().

Модуль urllib2 имеет и специальный класс для воплощения запроса на открытие URL. Называется этот класс urllib2.Request. Его экземпляр содержит состояние запроса. Следующий пример показывает, как получить доступ к каталогу с авторизацией, используя добавление заголовка в HTTP–запрос:

Import urllib2, base64.

Req = urllib2.Request('http://localhost/mywebdir').

B64 = base64.encodestring('user1:secret').strip().

Req.add_header('Authorization', 'Basic %s' % b64).

Req.add_header('User–agent', 'Mozilla/5.0').

F = urllib2.urlopen(req).

Print f.read()[:100].

Как видно из этого примера, ничего загадочного в авторизации нет: web–клиент вносит (закодированные base64) идентификационные данные в поле Authorization HTTP–запроса.

Примечание: Приведенные два примера почти эквивалентны, только во втором примере прокси–сервер не назначен явно.