Язык программирования Python
Шрифт:
Листинг
0.00 % 1 s 0 s 0 / 6952309 bytes
0.12 % 5 s 3941 s 8192 / 6952309 bytes
0.24 % 7 s 3132 s 16384 / 6952309 bytes
0.35 % 10 s 2864 s 24576 / 6952309 bytes
0.47 % 12 s 2631 s 32768 / 6952309 bytes
0.59 % 15 s 2570 s 40960 / 6952309 bytes
0.71 % 18 s 2526 s 49152 / 6952309 bytes
0.82 % 20 s 2441 s 57344 / 6952309 bytes
…
Функции для анализа URL
Согласно документу RFC 2396 URL должен строиться по следующему шаблону:
Листинг
scheme://netloc/path;parameters?query#fragment
где
Листинг
scheme
Адресная
Листинг
netloc
Местонахождение в сети.
Листинг
path
Путь к ресурсу.
Листинг
params
Параметры.
Листинг
query
Строка запроса.
Листинг
frag
Идентификатор фрагмента.
Одна из функций уже использовалась для формирования URL — urllib.urlencode. Кроме нее в модуле urllib имеются и другие функции:
Листинг
quote(s, safe='/')
Функция экранирует символы в URL, чтобы их можно было отправлять на web–сервер. Она предназначена для экранирования пути к ресурсу, поэтому оставляет '/' как есть. Например:
Листинг
>>> urllib.quote(«[email protected]»)
'rnd%40onego.ru'
>>> urllib.quote(«a = b + c»)
'a%20%3D%20b%20%2B%20c'
>>> urllib.quote(«0/1/1»)
'0/1/1'
>>> urllib.quote(«0/1/1», safe="")
'0%2F1%2F1'
quote_plus(s, safe='')
Функция экранирует некоторые символы в URL (в строке запроса), чтобы их можно было отправлять на web–сервер. Аналогична quote, но заменяет пробелы на плюсы.
Листинг
unquote(s)
Преобразование, обратное quote_plus. Пример:
Листинг
>>> urllib.unquote('a%20%3D%20b%20%2B%20c')
'a = b + c'
unquote_plus(s)
Преобразование, обратное quote_plus. Пример:
Листинг
>>> urllib.unquote_plus('a+=+b+%2B+c')
'a = b + c'
Для анализа URL можно использовать функции из модуля urlparse:
Листинг
urlparse(url, scheme='', allow_fragments=1)
Разбирает URL в 6 компонентов (сохраняя экранирование символов): scheme://netloc/path;params?query#frag
Листинг
urlsplit(url, scheme='', allow_fragments=1)
Разбирает URL в 6 компонентов (сохраняя экранирование символов): scheme://netloc/path?query#frag
Листинг
urlunparse((scheme, netloc, url, params, query, fragment))
Собирает URL из 6 компонентов.
Листинг
urlunsplit((scheme, netloc, url, query, fragment))
Собирает URL из 5 компонентов.
Пример:
Листинг
>>> from urlparse import urlsplit, urlunsplit
>>> URL = «http://google.com/search?q=Python»
>>> print urlsplit(URL)
('http', 'google.com', '/search', 'q=Python', '')
>>> print urlunsplit(
… ('http', 'google.com', '/search', 'q=Python', ''))
http://google.com/search?q=Python
Еще
Листинг
>>> import urlparse
>>> urlparse.urljoin('http://python.onego.ru', 'itertools.html')
'http://python.onego.ru/itertools.html'
Возможности 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–сервере был каталог, требующий авторизации.