Вопрос к веб-программистам

Підписуйтеся на Telegram-канал «DOU #tech», щоб не пропустити нові технічні статті

Существует несколько гипотетическая задача мониторить цены и наличие товара на сайтах нескольких поставщиков.

В первом приближении алгоритм ясен — робот обходит сайты, генерирует запросы в поля ввода, эмулирует нажатие кнопки «Искать» и забирает страницу с результатами для дальнейшего парсинга.

Вопрос собственно в следующем — обход каждого сайта должен быть захардкоджен или существуют техники, которые позволяют юзеру добавлять новые страницы (допустим скриптом, с указанием на какие кнопки жать и в каком порядке).

Второй вопрос, возможен ли мониторинг изменения опрашиваемых страниц — возможность отличить ситуации товара на сайте нет/дизайн изменился и запрос невозможно сделать.

PS

Не поймите так, что я собрался менять специальность:)

PPS

Это ни в коем разе не заказ, просто оценка возможностей современных веб-технологий.

👍ПодобаєтьсяСподобалось0
До обраногоВ обраному0
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

Вот пример работы с AJAX для celerity, это обертка вокруг HtmlUnit на языке JRuby:


browser.button(:id, 'foo').click
browser.wait

Вызов метода wait ожидает максимум 10 секунд до окончания всех XHR (AJAX) вызовов для данного «окна браузера». После его вызова можно размещать код, который будет уже извлекать данные из DOM элементов, что появятся на странице в результате AJAX запроса.

> А вот как выглядит для парсера страница сгенеренная с помощью AJAX?

Точно так-же. (AJAХ вызовы ведь модифицируют DOM дерево текущей страницы)

Можно еще браузер дергать, а уже из браузера брать DOM дерево с отинтерпритированным джаваскриптом

см. например selenium http://seleniumhq.org/

А кстати. Если идет речь об обычном HTML, совершенно очевидно что парсится текст в поисках соответствующих тэгов, а потом генерируется запросы к серверу от лица этих полей ввода. А вот как выглядит для парсера страница сгенеренная с помощью AJAX?

Основная проблема в решении таких задач — это выполнение javascript на странице, которая парсится. Если информация, которую нужно получить со страницы, генерируется с помощью AJAX, то можно использовать HtmlUnit. Это Java библиотека, которая имитирует браузер. Вот есть пример на JRuby, так как Java слишком многословна.

2 Roman Sakal:

не согласен с одним замечанием -

то не эмулируется «нажатие кнопки», а посылаются нужные GET/POST запросы

Библиотека от artoftest, о которой я упоминал, как раз «нажимает кнопки». Ты сидишь и смотришь как курсор мышки ходит, вносятся изменения в поля для ввода и т.д.

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

Спасибо за внимание.


то не эмулируется «нажатие кнопки», а посылаются нужные GET/POST запросы.

А что есть другой способ передать серверу какую-нибудь информацию?

Roman Sakal — подписываюсь под каждым словом

Если для парсинга. требуется заполнение форм, то не эмулируется «нажатие кнопки», а посылаются нужные GET/POST запросы..NET, PHP, Python (тут кстати есть beautiful soup) — без разницы, подобное хоть на LUA пишите. Если требуется поддержка динамики целевых ресурсов, то тут могут выручить шаблоны. Но нужно понимать, что без участия программиста такие системы (что касается поддержки смены дизайна) будут либо крайне сложные и дорогими, либо сложными и полны багов.

..., а на PHP есть SimpleTest, который позволяет имитировать нажатия кнопок и «хождение» по сайту...
$this-> setField (’a’, ’New value’);

$this-> click (’Go’); ...

Вопрос собственно в следующем — обход каждого сайта должен быть захардкоджен или существуют техники...

Реализация может быть какой-угодно...
На платформе.NET, например, есть крутая библиотека для тестирования — http://www.artoftest.com, используя эту библиотеку можно без проблем создать свой простенький краулер.

На ruby on rails есть плагин — webrat используя который можно тоже создать что-то подобное.

Вопрос собственно в следующем — обход каждого сайта должен быть захардкоджен или существуют техники, которые позволяют юзеру добавлять новые страницы (допустим скриптом, с указанием на какие кнопки жать и в каком порядке).

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

Второй вопрос, возможен ли мониторинг изменения опрашиваемых страниц — возможность отличить ситуации товара на сайте нет/дизайн изменился и запрос невозможно сделать.

Когда то был проект, в котором необходимо было определять, не изменился ли дизайн страницы (сайта), так как логика разбора напрямую зависит от DOM модели страницы. Решением было использовать некий флаг (контент, текст, id контейнера либо что то еще), который точно должен присутствовать на странице. Далее просто:

if (exists)
 // Parse
else
 // Error

Підписатись на коментарі