Вопрос к веб-программистам
Существует несколько гипотетическая задача мониторить цены и наличие товара на сайтах нескольких поставщиков.
В первом приближении алгоритм ясен — робот обходит сайты, генерирует запросы в поля ввода, эмулирует нажатие кнопки «Искать» и забирает страницу с результатами для дальнейшего парсинга.
Вопрос собственно в следующем — обход каждого сайта должен быть захардкоджен или существуют техники, которые позволяют юзеру добавлять новые страницы (допустим скриптом, с указанием на какие кнопки жать и в каком порядке).
Второй вопрос, возможен ли мониторинг изменения опрашиваемых страниц — возможность отличить ситуации товара на сайте нет/дизайн изменился и запрос невозможно сделать.
PS
Не поймите так, что я собрался менять специальность:)
PPS
Это ни в коем разе не заказ, просто оценка возможностей современных веб-технологий.
14 коментарів
Додати коментар Підписатись на коментаріВідписатись від коментарівВот пример работы с AJAX для celerity, это обертка вокруг HtmlUnit на языке JRuby:
Вызов метода wait ожидает максимум 10 секунд до окончания всех XHR (AJAX) вызовов для данного «окна браузера». После его вызова можно размещать код, который будет уже извлекать данные из DOM элементов, что появятся на странице в результате AJAX запроса.Точно так-же. (AJAХ вызовы ведь модифицируют DOM дерево текущей страницы)
см. например selenium http://seleniumhq.org/
А кстати. Если идет речь об обычном HTML, совершенно очевидно что парсится текст в поисках соответствующих тэгов, а потом генерируется запросы к серверу от лица этих полей ввода. А вот как выглядит для парсера страница сгенеренная с помощью AJAX?
Основная проблема в решении таких задач — это выполнение javascript на странице, которая парсится. Если информация, которую нужно получить со страницы, генерируется с помощью AJAX, то можно использовать HtmlUnit. Это Java библиотека, которая имитирует браузер. Вот есть пример на JRuby, так как Java слишком многословна.
не согласен с одним замечанием -
Библиотека от artoftest, о которой я упоминал, как раз «нажимает кнопки». Ты сидишь и смотришь как курсор мышки ходит, вносятся изменения в поля для ввода и т.д.
Спасибо за внимание.
А что есть другой способ передать серверу какую-нибудь информацию?
Roman Sakal — подписываюсь под каждым словом
Если для парсинга. требуется заполнение форм, то не эмулируется «нажатие кнопки», а посылаются нужные GET/POST запросы..NET, PHP, Python (тут кстати есть beautiful soup) — без разницы, подобное хоть на LUA пишите. Если требуется поддержка динамики целевых ресурсов, то тут могут выручить шаблоны. Но нужно понимать, что без участия программиста такие системы (что касается поддержки смены дизайна) будут либо крайне сложные и дорогими, либо сложными и полны багов.
$this-> setField (’a’, ’New value’);
$this-> click (’Go’); ...
На платформе.NET, например, есть крутая библиотека для тестирования — http://www.artoftest.com, используя эту библиотеку можно без проблем создать свой простенький краулер.
На ruby on rails есть плагин — webrat используя который можно тоже создать что-то подобное.
Техника в данном случае одна — понять, как работает сайт, т.е. принцип добавления, изменения, отображения контента. После того, как принцип понятен, пишется парсер (кроулер), который мониторит сайт.
Когда то был проект, в котором необходимо было определять, не изменился ли дизайн страницы (сайта), так как логика разбора напрямую зависит от DOM модели страницы. Решением было использовать некий флаг (контент, текст, id контейнера либо что то еще), который точно должен присутствовать на странице. Далее просто:
www.developers.org.ua/...forum/topic/170