.. _grab_under_the_hood:

==================================
Технические детали устройства Grab
==================================

Используемые библиотеки
=======================

По сути, Grab - это удобный интерфейс к двум библиотекам: pycurl и lxml.

Pycurl предоставляет возможность настраивать и осуществлять синхронные и асинхронные сетевые запросы.

Lxml даёт удобный способ работы с HTML-документами.  В первую очередь это построение DOM-дерева, выборка элементов через XPATH и автоматический разбор форм.

Кроме этих двух библиотек в Grab использует множество стандартных модулей языка Python.

Для полноценной работы с Grab вам практически не нужно знать API библиотеки pycurl, но вот как устроен lxml знать вам нужно обязательно. Спасибо разработчикам lxml - они создали прекрасную документацию: http://lxml.de Рекомендую начать с `The lxml.etree Tutorial <http://lxml.de/tutorial.html>`_

Структура расширений
====================

Изначально исходники Grab представляли из себя один файл. Далее файл становился больше и больше и, наконец, стало ясно, что нужно разбивать функциональность по модулям. Grab спроектирован как базовый класс, наследующий свойства множества модулей, называемых расширениями. Работа с сетевыми функциями вынесена в модули, называемые транспортами. Основной транспорт Grab это pycurl. Также ведутся работы по прикручиванию `urllib <http://docs.python.org/library/urllib.html>`_ и `Selenium <http://seleniumhq.org/>`_. Основная идея транспортов в том, что можно заменить один транспорт другим и программа останется рабочей.

Поддержка python 3
==================

Grab тестируется под python 2.7. Насчёт работоспособности в py3k ничего не могу сказать пока.
