Язык программирования Python
Шрифт:
rpop(user) RPOP user Идентификация по методу RPOP
stat STAT Возвращает кортеж с информацией о почтовом ящике. В нем m — количество сообщений, l — размер почтового ящика в байтах
list([num]) LIST [num] Возвращает список сообщений в формате (resp, ['num octets', …]), если не указан num, и «+OK num octets», если указан. Список lst состоит из строк в формате «num octets».
retr(num) RETR num Загружает с сервера сообщение с номером num и возвращает кортеж с ответом сервера (resp, lst, octets)
dele(num) DELE num Удаляет сообщение с номером num
rset RSET Отменяет пометки удаления сообщений
noop NOOP Ничего не делает (поддерживает
quit QUIT Отключение от сервера. Сервер выполняет все необходимые изменения (удаляет сообщения) и снимает блокировку почтового ящика
top(num, lines) TOP num lines Команда аналогична RETR, но загружает только заголовок и lines строк тела сообщения. Возвращает кортеж (resp, lst, octets)
uidl([num]) UIDL [num] Сокращение от «unique–id listing» (список уникальных идентификаторов сообщений). Формат результата: (resp, lst, octets), если num не указан, и «+OK num uniqid», если указан. Список lst состоит из строк вида «+OK num uniqid»
В этой таблице num обозначает номер сообщения (он не меняется на протяжении всей сессии), resp — ответ сервера, возвращается для любой команды, начинается с «+OK " для успешных операций (при неудаче возбуждается исключение poplib.proto_error). Параметр octets обозначает количество байт в принятых данных. uniqid — идентификатор сообщения, генерируемый сервером.
Работа с POP3–сервером состоит из трех фаз: идентификации, транзакций и обновления. На этапе идентификации сразу после создания POP3–объекта разрешены только команды USER, PASS (иногда APOP и RPOP). После идентификации сервер получает информацию о пользователе и наступает этап транзакций. Здесь уместны остальные команды. Этап обновления вызывается командой QUIT, после которой POP3–сервер обновляет почтовый ящик пользователя в соответствии с поданными командами, а именно — удаляет помеченные для удаления сообщения.
Модули для клиента WWW
Стандартные средства языка Python позволяют получать из программы доступ к объектам WWW как в простых случаях, так и при сложных обстоятельствах, в частности при необходимости передавать данные формы, идентификации, доступа через прокси и т.п.
Стоит отметить, что при работе с WWW используется в основном протокол HTTP, однако WWW охватывает не только HTTP, но и многие другие схемы (FTP, gopher, HTTPS и т.п.). Используемая схема обычно указана в самом начале URL.
Функции для загрузки сетевых объектов
Простой случай получения WWW–объекта по известному URL показан в следующем примере:
Листинг
import urllib
doc = urllib.urlopen(«http://python.onego.ru»).read
print doc[:40]
Функция urllib.urlopen создает файлоподобный объект, который читает методом read. Другие методы этого объекта: readline, readlines, fileno, close работают как и у обычного файла, а также есть метод info, который возвращает соответствующий полученному с сервера Message–объект. Этот объект можно использовать для получения дополнительной информации:
Листинг
>>> import urllib
>>> f = urllib.urlopen(«http://python.onego.ru»)
>>> print f.info
Date: Sat, 25 Dec 2004 19:46:11 GMT
Server: Apache/1.3.29 (Unix) PHP/4.3.10
Content–Type: text/html; charset=windows–1251
Content–Length: 4291
>>> print f.info['Content–Type']
text/html; charset=windows–1251
С помощью функции urllib.urlopen можно делать и более сложные вещи, например, передавать web–серверу данные формы. Как
известно, данные заполненной web–формы могут быть переданы на web–сервер с использованием метода GET или метода POST. Метод GET связан с кодированием всех передаваемых параметров после знака "?» в URL, а при методе POST данные передаются в теле HTTP–запроса. Оба варианта передачи представлены ниже:Листинг
import urllib
data = {«search»: «Python»}
enc_data = urllib.urlencode(data)
# метод GET
f = urllib.urlopen(«http://searchengine.com/search» + "?» + enc_data)
print f.read
# метод POST
f = urllib.urlopen(«http://searchengine.com/search», enc_data)
print f.read
В некоторых случаях данные имеют повторяющиеся имена. В этом случае в качестве параметра urllib.urlencode можно использовать вместо словаря последовательность пар имя–значение:
Листинг
>>> import urllib
>>> data = [(«n», «1»), («n», «3»), («n», «4»), («button», «Привет»),]
>>> enc_data = urllib.urlencode(data)
>>> print enc_data
n=1&n=3&n=4&button=%F0%D2%C9%D7%C5%D4
Модуль urllib позволяет загружать web–объекты через прокси–сервер. Если ничего не указывать, будет использоваться прокси–сервер, который был задан принятым в конкретной ОС способом. В Unix прокси–серверы задаются в переменных окружения http_proxy, ftp_proxy и т.п., в Windows прокси–серверы записаны в реестре, а в Mac OS они берутся из конфигурации Internet. Задать прокси–сервер можно и как именованный параметр proxies к urllib.urlopen:
Листинг
# Использовать указанный прокси
proxies = {'http': 'http://www.proxy.com:3128'}
f = urllib.urlopen(some_url, proxies=proxies)
# Не использовать прокси
f = urllib.urlopen(some_url, proxies={})
# Использовать прокси по умолчанию
f = urllib.urlopen(some_url, proxies=None)
f = urllib.urlopen(some_url)
Функция urlretrieve позволяет записать заданный URL сетевой объект в файл. Она имеет следующие параметры:
Листинг
urllib.urlretrieve(url[, filename[, reporthook[, data]]])
Здесь url — URL сетевого объекта, filename — имя локального файла для помещения объекта, reporthook — функция, которая будет вызываться для сообщения о состоянии загрузки, data — данные для метода POST (если он используется). Функция возвращает кортеж (filepath, headers) , где filepath — имя локального файла, в который закачан объект, headers — результат метода info для объекта, возвращенного urlopen.
Для обеспечения интерактивности функция urllib.urlretrieve вызывает время от времени функцию, заданную в reporthook. Этой функции передаются три аргумента: количество принятых блоков, размер блока и общий размер принимаемого объекта в байтах (если он неизвестен, этот параметр равен–1).
В следующем примере программа принимает большой файл и, чтобы пользователь не скучал, пишет процент от выполненной загрузки и предполагаемое оставшееся время:
Листинг
FILE = 'boost–1.31.0–9.src.rpm'
URL = 'http://download.fedora.redhat.com/pub/fedora/linux/core/3/SRPMS/' + FILE
def download(url, file):
import urllib, time
start_t = time.time
def progress(bl, blsize, size):
dldsize = min(bl*blsize, size)
if size != -1: