Парсинг сайтов со вложенными списками

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

Довольно часто в интернете встречаются сайты, на которых данные спрятаны за многочисленными выпадающими списками. Например, выберите сначала марку автомобиля, потом модель автомобиля, потом тип двигателя. Вот, например, один из таких сайтов:
http://catalog.mann-filter.com/EU/rus/vehicle

Предположим, что нам нужен список всех моделей со всеми двигателями и еще с какими-то данными, например, такой:

Программа «Парсер сайтов» позволяет нам это сделать. Причем, можно сначала выгрузить весь список марок, потом пройтись по нему другим парсером, выгрузить список моделей, потом еще один парсер – список двигателей и т.д. Но есть способ сделать это все за один раз. Это удобно, если данных очень много - можно поставить загрузку на ночь, и к утру все будет готово.

Общий принцип работы такого парсера следующий:

1. Выгружаем верхний уровень сайта, находим нужные нам ссылки на нижестоящие уровни (на уровни марок), получаем массив данных.
2. Передаем первую ссылку вместе с информацией о том, какая это марка, на следующий уровень обработки

2.1. Запоминаем данные в переменную. Пускай это будет переменная с названием “Proizvoditel”.
2.2. Находим ссылки на список моделей, получаем массив данных.
2.3. Передаем первую ссылку на модель на следующий уровень обработки.

2.3.1. Запоминаем ссылку с информацией в переменную “Model”
2.3.2. Находим ссылки на типы двигателей
2.3.3. Передаем первую ссылку на тип двигателя дальше

2.3.3.1. Выгружаем нужную информацию и выводим на лист

2.3.4. Передаем вторую ссылку на тип двигателя

2.3.4.1. Выгружаем нужную информацию и выводим на лист
И так далее

2.4. Передаем вторую ссылку на модель

2.4.1. Запоминаем ссылку с информацией в переменную “Model”
2.4.2. Находим ссылки на типы двигателей
2.4.3. Передаем первую ссылку на тип двигателя дальше

2.4.3.1. Выгружаем нужную информацию и выводим на лист
И так далее

И так далее

3. Передаем вторую ссылку (на марку производителя) на следующий уровень обработки.

3.1. Запоминаем данные в переменную Proizvoditel.
3.2. Находим ссылки на модели второго производителя
3.3. Передаем первую ссылку на модель на следующий уровень обработки.
И так далее.

При выводе данных на лист мы в первый столбец выгружаем данные из переменной Proizvoditel, во второй – из переменной Model, а в остальные столбцы заносим нужную нам информацию.

Разберем конкретный пример.
Как создавать парсер, добавлять к нему отдельные действия и настраивать их параметры, см. в статье http://excelvba.ru/programmes/Parser/manuals/1 Здесь мы на этом подробно останавливаться не будем.

Загружаем исходный код самой «верхней» веб-страницы:

Далее нам нужно найти элементы выпадающего списка. Для этого воспользуемся так называемыми «Инструментами разработчика» в браузере. В Google Chrome это легко сделать – правая кнопка мыши на нужном элементе и «Просмотр кода элемента».

Появляется вот такой интерфейс:

Раскрываем выпадающий список кода (который на скриншоте выделен синим).

И мы как раз получаем список производителей вместе со ссылками. Добавляем в парсер инструкцию, выгрузить теги Option вместе со всеми атрибутами (outerHTML). И так как нам не нужна первая строка «Выберите, пожалуйста», добавляем инструкцию парсеру проверить значения на соответствие маске и удалить элемент в случае соответствия.

Протестируем, что у нас получилось. Для этого в части окна «Тестирование действий» сначала подставим исходное значение, нажав на выпадающий список напротив «Исходное значение (или массив значений)» и выбрав наше исходное значение #1.

Должно получиться следующее:

Нажимаем «Тестировать» и получаем массив из 120 элементов. Сохраним данные значения в буфер обмена (это нам понадобится далее). Для этого нажмем на выпадающий список напротив «Результат обработки при помощи действий» и выберем нужный пункт.

Сохраняем список функций.

Теперь нам нужно каждый из этих 120 элементов обработать одинаковым образом. Для этого используем возможность программы «Парсер сайтов» работать с так называемыми подуровнями.
Нажимаем «Добавить подуровень 2»

Получаем следующее:

Как видите, список действий пуст, а напротив строки «Текущий уровень» стоит двойка.
Входящими значениями на подуровень 2 мы получаем каждый из 120 элементов массива, выгруженных на уровне 1.
Выбираем «Редактировать список действий». Сымитируем, что нам пришло первое из 120 значений массива. Для этого в окошке «Тестирование/Исходное значение», выбираем вставить из буфера #1 – Вставляет в поле Массив из 120 значений.

После чего оставляем только одно значение, а остальные 119 удаляем.

(синим выделено то, что нужно удалить).

Теперь у нас на входе один элемент массива. Как мы разбирали выше, сохраняем полученные данные в переменную «Proizvoditel» (название произвольное)

Теперь нам нужно получить список ссылок. Анализируем ссылку, понимаем, что она находится между определенным текстом:

Нажимаем тестировать.

Видим, что ссылка еще не получена. То есть нам надо добавить текст перед ней.

Обязательно тестируем, чтобы понять – верно ли количество слешей стоит в ссылке.
Загружаем исходный код страницы. По количеству символов мы понимаем, что все сделали верно:

Теперь можно нажать «Открыть в браузере», чтобы найти второй выпадающий список.

Оформление немного не такое, как на исходном сайте, но для нас главное, что теперь мы можем выбрать список моделей. Просматриваем код элемента, находим, что второй выпадающий список содержится в элементе с id=”vehicleForm:dropdownsModellreiheSelect”

Повторяем предыдущие шаги: ищем теги option, убираем строку «Выберите, пожалуйста».

Тестируем – получаем три машины от производителя AC CAR GROUP LTD вместе со ссылками.
Добавляем подуровень три, повторяем предыдущие шаги с небольшими корректировками.

Открываем в браузере, ищем нужные элементы:

Ищем тег table с id=”typesForm:typeDataTable”
Потом внутри него ищем теги tr (просто поиск тегов tr без поиска тега table результата не даст).

Последнее действие – это удаление строки заголовка (там, где нет данных по автомобилям).

Принцип понятен, перейдем к выводу на лист.
Добавляем столбец «Производитель».

Переходим к списку действий.
Считываем значение переменной Proizvoditel и берем то, что находится внутри тега option.

Аналогично добавляем второй столбец, «Модель».

Третий столбец – тип двигателя. Анализируем код, понимаем, что тип двигателя заключен в теге ссылки - "а"

Видим, что тип двигателя может выражаться числом, чтобы избежать ситуации, когда двигатель 2.0 при выводе данных в ячейку Excel преобразовался в число (и получилось бы просто «2»), добавим перед выводимым текстом апостроф – указание Excel, что это просто текст.

И давайте еще разберем вывод года выпуска (можно вытащить и другие данные).

Аналогичным образом я настроил поиск данных по коду ДВС и мощности двигателя (см. скачанный файл).
(примечание: мощность двигателя в таблице указывается в киловаттах и в лошадиных силах, поэтому в настройках необходимо поставить галочку «Выводить массив значений в отдельные столбцы»)

Запускаем парсер и получаем необходимую таблицу

Вложения:
Katalog_Mann.zip1.38 КБ

Комментарии

Там есть специальная кнопка для этого:
(сначала выделяем действие, после которого вставить подуровень)

Здравствуйте. Как мне добавить новый уровень действий выше существующего, т.е. существующий 1й уровень действий должен стать 2 уровнем (подуровнем нового, создаваемого), а новый уровень будет первым?

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

Подскажите как сделать что бы выводилась таблица в виде

| группа 1 | товар 11 | товар 12 | товар 13|
| группа 2 | товар 21 | товар 22 | товар 23|
товар и группы берутся из полученных переменных

Макс, напишите мне в скайп, - я подключусь к вашему компу, и отвечу на все вопросы.
Так и мне проще будет, и вам удобнее.
Чтобы я смог помочь, от вас надо: http://ExcelVBA.ru/help

не отобразились теги:
td class = "name" Бренд
td class = "value" itemprop="brend" Philips (Голландия)

я получаю Table и в нём
Бренд
Philips (Голландия)
Как правильно получить пару НазваниеСтолбца|ЗначениеДляСтолбца?

О, спасибо большое)
В режиме фиксированного исходного значения надо было столбец вывода установить "А".
А подскажите еще: если парсить таблицу характеристик, как правильно пользоваться опцией "Поиск столбца для вывода"?
Этим можно парсить каждую характеристику в определённый столбец с названием этой характеристики?

Здравствуйте, Maks.
В настройках вывода на лист (редактирование парсера - вкладка ВЫВОД НА ЛИСТ - подвкладка НАСТРОЙКИ ЛИСТА ДЛЯ ВЫВОДА) есть параметр «Столбец, по которому определяется последняя заполненная строка таблицы»
Укажите там другой столбец (тот, в который данные точно выводятся), - и всё заработает.

Добрый день, а подскажите почему при получении категорий на 1 подуровне, получении числа страниц пагинации на 2 подуровне и получении ссылок со страницы на 3 подуровне, при выводе на лист значения перезаписываются в одну ячейку?
Как сделать перевод по строкам? необходимо сохранять данные в переменные?