Skip to content

Бот для проверки наличия мест в поездах РЖД

19/07/2010

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

Первое, что пришло мне в голову — не писать бота, а слепить его в Yahoo!Pipes. Впрочем, оказалось что Pipes плохо подходят для потрошения HTML-страниц и ещё хуже — для оповещения пользователя. Во-первых, Yahoo!Pipes может получать значения элементов только из well-formed документа. Во-вторых, его ориентация на потоковую обработку RSS делает почти невозможными довольно стандартные с точки зрения обычного программирования операции: перебор значений в цикле, условные конструкции etc. С требованием валидности документов удалось справится, автоматически скармливая страницы сервису HTML Tidy. После этого четыре нужных числа доставались из страницы с помощью SubElement. Но вот с остальными задачами Pipes не справился.

Вообще, так как такой спайдер — штука, во первых, достаточно сильно завязанная на ввод/вывод (общение с сервером) и обработку событий (на всех уровнях) — Node.js стал вполне логичным решением. И я взялся за vim🙂

Сам спайдер я естественно писал не с нуля — это переделка спайдера из статьи о поисковой системе. Соответственно, большая часть кода (обращение к серверу и разбор страницы) там совпадает. После этого остаётся только найти в каких ячейках хранятся нужные нам числа, понять есть ли нужные нам места, и если есть, то отослать оповещение. Бот проверяет страницу раз в пять минут.

С первой частью всё просто. Посмотрев сорцы сайта РЖД, я нашёл нужные ячейки и просто брал оттуда информацию. Чуть позже оказалось что когда места какого либо типа заканчиваются, строка в таблице пропадает и индексы других строк смещаются. В принципе тоже ничего сложного — перебираем все строки и по первой ячейке смотрим что же там находится.

Вот с почтой было посложнее. Модуль node-mailer, который я думал использовать изначально, не отправлял письма из виртуальной машины (настоящего хостинга для спайдера у меня нет). В результате всё было сделано через PHP-гейт: товарищ @tanraya (его сайт) разместил на своём сайте простенький PHP-гейт, принимавший GET-параметрами заголовок и тело письма плюс специальный ключ (на всякий случай, чтобы кто ниибудь не воспользовался гейтом).

В итоге получился довольно несложный бот-краулер, создание которого (точнее, переделка из готового) не заняло много времени. Бот потихоньку крутился в виртуальной машине, практически не потребляя памяти и траффика. Кстати, мне пришлось сделать его вызываемым по Cron, вместо того чтобы оставлять в качестве демона. Причин тут несколько: и периодически падающий libxmljs, и утечки ресурсов в наскоро слепленном коде. Но работало и так неплохо. Правда, внутренняя структура получилась довольно запутанной, я хочу потом разделить её на слои с событиями, когда будет время. Это даст возможность гораздо легче создавать нужные краулеры, если они мне понадобятся.

Ссылки по теме

From → Uncategorized

Добавить комментарий

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s

%d такие блоггеры, как: