Отладка запросов

Использование logging-системы

Самый простой способ увидеть информацию об отсылаемых запросах - это включить вывод logging-сообщений с уровнем DEBUG:

import logging
logging.basicConfig(level=logging.DEBUG)

Конечно это будет выводить все logging-сообщения, не только те, что сгенерировала библиотека Grab. Если вам нужны только её сообщения, то настройте вывод сообщенний только от логгера “grab”:

import logging
logger = logging.getLogger('grab')
logger.addHandler(logging.StreamHandler())
logger.setLevel(logging.DEBUG)

Также вы можете воспользоваться функцией default_logging которая настраивает logging-систему на вывод всех сообщений Grab в файл:

from grab.tools.logs import default_logging
default_logging()

После вызова этой функции вы можете через отдельную консоль наблюдать за активностью Grab с помощью команды tail -f /tmp/grab.log.

На каждый сетевой запрос Grab генерирует logging-сообщение следующего вида:

[5864] GET http://www.kino-govno.com/movies/rusichi via 188.120.244.68:8080 proxy of type http with authorization

В начале мы видим номер запроса, далее типа запроса, затем адрес документа и в конце указана информация об используемом прокси сервере (если он используется). Если запрос был сделан не из главного thread-потока, то будет казано также имя thread-потока.

Можно включить вывод дополнительных данных о POST-запросах с помощью опции debug_post. Тогда на каждый POST-запрос будет выводиться его содержимое:

[01] POST http://yandex.ru
POST request:
foo                      : bar
name                     : Ivan

Нумерация запросов

Каждый сетевой запрос осуществлённый с помощью Grab имеет свой номер. Информация о запросе хранится на уровне модуля, так что запросы различных Grab-объектов имеют тем не менее общий счётчик. Общая нумерация сохраняется даже в случае использования тредов. Номер запроса очень удобно использовать вкупе с опцией log_dir, которая сохраняет содержимое сетевых ответов в файлы. Читайте об этом в следующем разделе.

Сохранение запросов и ответов в файлы

Обратите внимание на номер запроса, это важная составляющая системы отладки. Если мы включим сохранение содержимого запросов и ответов в файлы, по номеру запроса мы сможем найти нужный файл.

Сперва рассмотрим самую простую опцию log_file:

g.setup(log_file='/tmp/log.html')

Она включает сохранение содержимого последнего ответа в файл. Каждый новый ответ будет перезатирать содержимое старого ответа. Если вам нужно проанализировать содержимое нескольких запросов, то вам понадобится опция log_dir:

g.setup(log_dir='/tmp/some_dir')

После включения опции log_dir Grab начинает сохранять в указанную директорию содержимое запросов и ответов. Выше я писал о номере запроса, так вот имя файла будет содержать этот номер. Например, для запроса с номером 28 будут созданы два файла: 01.log и 02.html В log файле будут сохранены HTTP-заголовки как запроса, так и соответствующего ответа. В html файле будет сохранено содержимое ответа (без заголовков).

Счётчик запросов работает на уровне модуля. Это значит, что если вы создадите несколько Grab-объектов, то у них будет общий счётчик запросов и номера запросов не будут пересекаться. Это помогает отлаживать мультитредовые программы или программы, где создаётся несколько Grab объектов в разное время.