16 янв. 2009 г.

Краулер своими руками. Часть 10

Ярлычки на чемодане

В некоторых случаях взаимодействие клиента с сервером невозможно без обмена порциями данных, получивших поэтическое имя cookies -- "печенье". Сценарий таков:
  1. При первом обращении к серверу клиент приходит с пустыми руками. Сервер "видит" это и передает ему HTTP-заголовок "Set-Cookie:данные". В данных может быть уникальный идентификатор или какие-то настройки -- скажем, языковые.
  2. Клиент запоминает эти данные и при повторном обращении снова возвращает их серверу через заголовок "Cookie:данные".
  3. Сервер читает заголовок "Cookie" и распознает клиента.
Таким образом достигается постоянство сессии. Без этого было бы трудно, к примеру, при переходе с одной страницы интернет-магазина на другую видеть корзину покупателя в неизменном состоянии. На практике сервер часто при первом ответе "закрепляет" за клиентом куку (как ярлычок на чемодане), сразу перенаправляет его на ту же самую страницу и только после этого начинает полноценно взаимодействовать.

***
OpenDirector, который используется в библиотеке urllib2 по умолчанию, не работает с Cookie. В наборе готовых handler-ов имеется HTTPCookieProcessor, но если не подключить его руками, он не будет задействован. Подключить его можно таким образом:
import cookielib
COOKIEFILE = '...' # путь к файлу, где хранятся cookies

cookie_jar = cookielib.LWPCookieJar()
# загрузить сохраненные cookies, если файл существует
if os.path.isfile(COOKIEFILE):
cookie_jar.load(COOKIEFILE)

cookie_processor = urllib2.HTTPCookieProcessor(cookie_jar)
opener = urllib2.build_opener(cookie_processor, другие handler-ы)
Теперь библиотека urllib2 будет автоматически читать и передавать назад данные, полученные через cookies.
После выполнения запроса надо сохранить полученные cookies:
req = urllib2.Request(url, None)
...
handle = self.opener.open(req, None, TIMEOUT)
cookie_jar.save(COOKIEFILE)
Все эти операции легко включить в класс UserAgent.

Библиотека cookielib появилась в Python 2.4. До этого использовался класс ClientCookie. О том, как сделать работу с cookies независимой от версий питона, подробно рассказано в статье cookielib and ClientCookie на www.voidspace.org.uk.

3 комментария:

Анонимный комментирует...

Очень интересно, спасибо.

Наувул-Наувул комментирует...

Ура! Первый комментарий!

Анонимный комментирует...

спасибо%)