ПРОСТО О СЛОЖНОМ
В данной статье расскажу о том, как с помощью Google Таблиц и XPath можно очень быстро и легко парсить данные с сайтов. А сегодня наша легенда такая: мы хотим постоянно отслеживать выставленные на продажу Volkswagen Passat. При этом нам удобнее, когда данные представлены в виде таблицы, которая постоянно доступна по ссылке. К слову: таким методом можно отслеживать и комментарии к вашим профилям в соцсетях и все что угодно.
ВВЕДЕНИЕ
С целью мы определились, теперь немного об используемых инструментах:- Google Таблицы
- Запросы XPath
- Консоль браузера (в моем случае Mozilla Firefox)
Что вы узнаете:
- Как составлять простой XPath запрос
- Как проанализировать код HTML
- Как убить время впустую
Теория
Основное действие будет происходить в Google Таблице. Нас также интересует функция IMPORTXML, которая имеет следующий синтаксис:
IMPORTXML(ссылка; запрос_xpath)
ссылка – адрес веб-страницы с указанием протокола (например, http://).
Значение параметра ссылка должно быть заключено в кавычки или представлять собой ссылку на ячейку, содержащую соответствующий текст.
запрос_xpath – запрос XPath для поиска данных.
Теперь немного о XPath.
XML Path Language (XPath) – это язык, разработанный специально для использования с XML и применяемый для поиска узлов и наборов узлов XML-документа в таких технологиях, как DOM и XSLT. В статье мы не будем рассматривать его подробно, ограничимся лишь необходимыми для нашей задачи выражениями.
Начинаем
И так, поехали. Первым делом мы открываем Google Таблицы и создаем новый документ:
Теперь временно бросаем таблицы и идем на kolesa.kz, где выставляем нужные фильтры и получаем результат. Я в качестве примера выставил следующие фильтры:
- Легковые
- Где искать – Костанайская область
- Марка - Volkswagen Passat
- С пробегом
- С фото
После того, как выставили фильтры, нажимаем «Показать». У меня получилась следующая страница:
Нам нужна ссылка (которую я коряво обвел). Копируем эту ссылку, возвращаемся к таблице и вставляем ссылку в ячейку A1:
Теперь возвращаемся на сайт и приступаем к анализу нужных данных
Анализ мать их данных
Для анализа нам потребуется умение работать с консолью веб-разработчика, в браузере она вызывается с помощью клавиши F12
Для того, чтобы спарсить нужные нам данные, проматываем страницу вниз, и вот мы видим интересующие нас блоки:
Всего на странице их 20 штук, этого вполне достаточно, тем более мы постоянно будем видеть новые результаты (таблица будет автоматически переписываться). Теперь рассмотрим один из блоков подробнее и определимся с тем, какая именно информация из блока нам нужна
На рисунке видно, какие именно данные я хочу получить. Начнем сначала с названия (хотя так как мы изначально определились с маркой - этот пункт необязателен, но если вы, к примеру, выставите фильтр из разных машин, то очень даже будет нужно парсить название).
И так, для начала щелкаем правой кнопкой мыши по названию и выбираем «исследовать элемент». У нас открывается консоль разработчика и выделяется блок кода, принадлежащий выделенному элементу (в нашем случае - название)
Теперь поднимаемся в консоли на одну строчку вверх и смотрим, что выделяется в документе. У нас снова выделилось только одно название. Можно было составить запрос и на предыдущей строчке, но как мы видим – если подняться выше – там есть класс, он выведет нам именно название простым запросом. Если бы мы остались на предыдущей строчке – запрос бы стал длиннее, а нам это ни к чему, да и смысла в этом нет.
И так, мы видим следующую строчку:
<span class="a-el-info-title">
Где “span” – тег, “class” – атрибут, "a-el-info-title" – значение атрибута.
Теперь возвращаемся к нашей таблице, в которую нам надо добавить следующую функцию:
=importxml(A1;"//span[@class='a-el-info-title’]")
Разберем эту строчку, кстати, именно здесь мы задействовали XPath
- =importxml() – функция
- A1 – ячейка, в которую мы положили нашу ссылку (далее ставим точку с запятой и в кавычках пишем запрос XPath)
- После «//» мы пишем нужный нам тег, в данном случае “span”. Если написать просто “span”, то результатом будет вывод всех значений этого тега, а нас интересует конкретный класс, поэтому обращаемся к атрибуту тега и значению атрибута. Для этого открываем квадратные скобки. В XPath атрибут записывается с символом @ вначале, в нашем случае это будет универсальный атрибут «@class». Чтобы указать значение атрибута нам необходимо поставить знак равенства, открыть одинарные кавычки (если кавычки будут двойные, то результатом запроса станет ошибка синтаксиса) и вписать туда значение атрибута, в нашем случае - 'a-el-info-title’.
Ну, вроде как более менее понятно, теперь наконец мы впишем нашу команду. Для этого нажимаем на столбец B, вписываем в строку
=importxml(A1;"//span[@class='a-el-info-title’]")
жмем Enter и – ура, первый результат
Вот мы и вывели первый интересующий нас массив, теперь идем на сайт за ценой.
Точно также как и в предыдущий раз находим нужную строку, составляем запрос, возвращаемся к таблице и в столбец С вписываем получившуюся формулу (она идентична первой, за исключением значения атрибута)
Упс, спарсить то спарсили, но почему цен больше чем автомобилей? Ответ прост: на странице есть еще элементы с аналогичным строением. Чтобы отсеять лишнее, поднимаемся в консоли выше и находим родительский элемент:
Теперь нам надо переделать запрос. Сначала пишем родительский элемент, потом через разделитель – дочерний:
=importxml(A1;"//div[@class='a-info-top']/span[@class='price']")
Все, теперь меняем запрос в столбце C
Все, теперь все в порядке, далее нам нужно описание. Вновь идем на сайт.
Тут простой запрос, идем в таблицы и вписываем
Все, описание получили, теперь осталось получить город и дату размещения объявления. Снова идем на сайт и находим все это
Там рядом как раз все, что нам нужно, берем данные и бегом к таблице
Все, наша таблица готова, теперь можем опубликовать ее в интернете, получить ссылку и периодически посматривать. На этом миссия закончена, напомню, что таким методом парсить можно все что угодно, но скорее всего придется дополнительно ознакомиться с синтаксисом XPath. Также напомню еще раз, что для полноценного многоуровневого парсинга способ с гугл-таблицами не годится, а вот знание XPath пригодится всегда.
Еще один нюанс: если на сайте-доноре изменят классы и прочее – парсер перестанет работать :-)
Cсылка на получившуюся таблицу
Напоминаю, что вопросы можно задать в группе https://t.me/newqosgroup