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

Довольно часто в интернете встречаются сайты, на которых данные спрятаны за многочисленными выпадающими списками. Например, выберите сначала марку автомобиля, потом модель автомобиля, потом тип двигателя. Вот, например, один из таких сайтов:
catalog.mann-filter/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, а в остальные столбцы заносим нужную нам информацию.

Разберем конкретный пример.
Как создавать парсер, добавлять к нему отдельные действия и настраивать их параметры, см. в статье excelvba/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, что это просто текст.


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


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

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


Нужен парсинг данных?

Собираем открытые данные с любых веб-сайтов: цены, названия, артикулы, описания, свойства, категории, фото, отзывы, ссылки, тел.номера, e-mail и многое другое.

Написать
img