четверг, 6 августа 2015 г.

Автоматический парсинг

Все сталкивались с ситуацией, когда нужно собрать и систематизировать большое количество информации. Для стандартных задач по SEO-оптимизации сайта есть готовые сервисы, например, Netpeak Checker — для сравнения показателей конкурирующих сайтов или Netpeak Spider — для парсинга внутренней информации по сайту.
Но что, если задача нетривиальна и готовых решений нет? Есть два пути: делать все руками и долго, или загнать рутинный процесс в матрицу, автоматизировать его и получать результат в разы быстрее. О таком кейсе и пойдет речь.
Автоматизированный парсинг сайтов с помощью Kimono и таблиц Google

Что такое парсинг сайтов и зачем он нужен

Парсинг — это синтаксический анализ информации. Под парсингом HTML, как правило, подразумевают выборочное извлечение большого количества информации с других сайтов и ее последующее использование. То есть, если говорим, что парсим сайт — это значит, что с помощью формул таблиц Google или приложения Kimono находим на странице необходимый участок кода, в котором заключена нужная нам информация. Эти части кода повторяются в пределах одной страницы и на других страницах, имеющих аналогичную структуру. Парсер помогает нам выделить и импортировать повторяющиеся данные автоматически, существенно сэкономив время и предупредив возможные ошибки копирования этой информации вручную.
В нашем случае нужно было регулярно составлять по 20 однотипных таблиц, и на одну таблицу уходило по 40-50 минут. Перед нами стояла цель: автоматизировать извлечение данных с других сайтов для каждой из ячеек этой таблицы и ускорить составление таблиц.

Что будем использовать для парсинга

Для парсинга нам понадобятся:
  • приложение-скрейпер для Google Chrome — Kimono;
  • таблицы Google Docs;
  • несколько базовых выражений на xPath для формулы importxml.

Парсинг данных с помощью функции importxml в таблицах Google

Предположим, нам нужно получить много значений расстояний по прямой между двумя заданными населенными пунктами. Вводим города попарно и хотим автоматизировать импорт расстояний между ними.
Нам понадобятся:
  • таблица Google Docs;
  • несколько базовых выражений на xPath для формулы importxml.
Вначале находим сайт, на котором есть необходимая нам информация. Вводим два города, а расстояние должно расположиться в третьей ячейке таблицы.
Что сделать, чтобы спарсить часть нужной нам информации в таблицу Google? Использовать importxml.
Как правильно использовать importxml
Определяем, в каких HTML-тегах заключена нужная нам информация

1. Кликаем правой кнопкой мыши на заголовке с расстоянием и выбираем «Просмотр кода элемента». Необходимая строка заключена в html-тэге h1.
2. Проверяем адрес страницы — он имеет подходящий вид (http://marshrut.su/rasstojanie/mezhdu-gorodami/mezhdu-gorodami?ot=Астана&do=Варшава).
3. Формируем URL с помощью оператора «concatenate» — склеиваем части адреса и введенные нами города.
4. Используем «importxml» — первым аргументом будет «concatenate» (формируемый им URL), вторым — простое выражение на xPath — «//h1». Так мы указали, что необходимо спарсить в ячейку таблицы все заголовки h1. Нам повезло — такой заголовок используется один раз на странице, поэтому нам не придется обрабатывать массив данных.
1
=importxml(concatenate("http://marshrut.su/rasstojanie/mezhdu-gorodami/?ot=";A3;"&do=";B3); "//h1")
5. Получаем всю строку «Расстояние от… до… км». Обрезаем лишнее из этой строки с помощью «mid». Чтобы вычислить длину отрезка, который необходимо сократить, определим длины названий городов с помощью «len» и просуммируем с длинами других слов. Получаем конечную формулу:
1
=mid(importxml(concatenate("http://marshrut.su/rasstojanie/mezhdu-gorodami/?ot=";A3;"&do=";B3); "//h1");len(B3)+len(A3)+19;10)
Теперь можем ввести сколько угодно пар городов, «протянуть» ячейку C2 вниз и моментально получить все расстояния между этими городами.
Теперь можем ввести сколько угодно пар городов
Формула парсинга расстояния между городами в Google SpreadSheets

Парсинг данных с помощью importhtml

Нам понадобится:
  • только таблица Google Docs.
Можно получать данные без знания xPath — через importhtml. Для использования этой формулы достаточно указать URL, тип (таблица или список) и номер. Формула импортирует массив данных, с которым дальше можно будет работать при помощи формул таблиц Google.
Формулы парсинга работают не всегда, все зависит от верстки страницы. Если importxml не подходит — пробуйте importhtml. Если и он не работает — используйте Kimono. А можно и вовсе начать с Kimono.

Парсинг данных с помощью Kimono

Существует множество программ, скриптов или приложений для браузера, основной функцией которых является сбор данных из сети (парсинг) и их структурирование. Такие программы называются скрейперы, или scrapers.
Kimono — мощный и быстрый в настройке скрейпер с интуитивно понятным интерфейсом. Позволяет парсить данные с других сайтов и позже обновлять их. Бесплатный.
Познакомиться поближе и получить краткий мануал об использовании можно здесь (на русском) или на moz.com (на английском).
Давайте попробуем спарсить что-нибудь хорошее с помощью Kimono. Например, дополним созданную нами таблицу с городами списком курортов в стране Города 2. Как это можно реализовать при помощи Kimono Labs.
Нам понадобятся:
  • приложение для Google Chrome — Kimono;
  • таблица Google Docs.
1. Находим сайт с необходимой нам информацией — то есть перечнем стран и их курортов. Открываем страницу, откуда необходимо получить данные.
2. Кликаем на иконку Kimono в правом верхнем углу Chrome.
3. Выделяем те части страницы, данные из которых нам необходимо спарсить. Если нужно выделить новый тип данных на той же странице, кликаем на «+» справа от «property 1» — так указываем Kimono, что эти данные нужно разместить в новом столбце.
Все страны на странице выделены с помощью Kimono (приложение Chrome)
Все страны на странице выделены с помощью Kimono (приложение Chrome)
4. Кликнув на фигурные скобки <> и выбрав «CSV», можно увидеть, как выбранные данные будут располагаться в таблице.
Предварительный просмотр расположения данных в таблице
Предварительный просмотр расположения данных в таблице
5. Когда все данные отмечены:
  • кликаем «Done» (в правом верхнем углу);
  • логинимся в Kimono, чтобы привязать API к своему аккаунту;
  • вводим название будущего АРI;
  • кликаем «Create API».
Создаем новое API в Kimono
Создаем новое API в Kimono
6. Когда API создано, переходим в таблицу Google, куда хотим загрузить выбранные данные. Выбираем «Connect to Kimono» и кликаем на название нашего API — «Resorts». Список стран и ссылок на страницы с курортными городами выгружается на отдельный лист.
Синхронизируем Kimono с Google SpreadSheets
Синхронизируем Kimono с Google SpreadSheets
После синхронизации Kimono выгружает данные на отдельный лист
После синхронизации Kimono выгружает данные на отдельный лист
7. Переходим снова на сайт, берем для примера Ирландию, и снова выбираем через Kimono города, которые необходимо спарсить. Создаем API, называем его «Resorts in countries».
Задаем Kimono шаблон для парсинга
Задаем Kimono шаблон для парсинга
8. Переходим по ссылке в Kimono Labs. Теперь нам нужно спарсить список курортных городов по всем странам, а не только по Ирландии. Чтобы это сделать, переходим на вкладку «Crawl setup».
Расположение вкладки по настройкам обхода страниц в Kimono Labs
Расположение вкладки по настройкам обхода страниц в Kimono Labs
9. В «Crawl Strategy» выбираем «URLs from source API». Появляется поле с выпадающим списком всех API. Выбираем созданное нами ранее API «Resorts» и из него автоматически загружается список URL для парсинга. Кликаем синюю кнопку «Start Crawl» (начать обход) и следим за статусом парсинга.
Kimono обходит страницы, парсит данные по заданному ранее шаблону и добавляет их в таблицу — то есть делает все то же самое, что и для Ирландии, но уже для всех других стран, что ввели автоматически и без нашего участия.
Как добавить в Kimono список URL для парсинга, используя уже существующий API
Как добавить в Kimono список URL для парсинга, используя уже существующий API
10. Когда таблица сформирована, синхронизируем Kimono Labs с таблицей Google — точно так же, как делали это в шестом пункте. В результате, в таблице появляется второй лист с данными.
Выгружаем полученные данные из Kimono Labs в Google SpreadSheets
Выгружаем полученные данные из Kimono Labs в Google SpreadSheets
Предположим, хотим, чтобы в таблице отображались все курортные города в стране города прибытия. Данные на листах Kimono обрабатываем с помощью формул для таблиц Google, и выводим в строку список городов, где еще можно отдохнуть в Австралии, кроме Сиднея.
Например, это можно сделать так.
Разметить массив данных (список городов), используя логические функции и возвращая значение ячейке, равное TRUE или FALSE. На примере ниже выделили для себя города, которые находятся именно в Австралии:
  • TRUE = город находится в Австралии;
  • FALSE = город находится в другой стране.
Выделение необходимой части данных из всего массива с помощью формул таблиц Google
Выделение необходимой части данных из всего массива с помощью формул таблиц Google
По меткам TRUE определяем начало и конец обрабатываемого диапазона, и выводим в строку соответствующие этому диапазону города.
Конечная обработка данных
Конечная обработка данных
Отображаемый результат
Отображаемый результат
По аналогии можем вывести курортные города и для других стран.
Мы специально привели здесь достаточно простой и пошаговый пример — формулу можно усложнить, например, сделать так, чтобы достаточно было ввести страну в колонку С, а все остальные вычисления и вывод городов в строку происходили автоматически.

Результаты автоматизации

Как говорилось вначале, нам регулярно нужно составлять по 20 однотипных таблиц. Это рутинный процесс, съедающий по 40-50 минут на одну таблицу, и по 16 часов времени на каждые 20 шт.
Согласитесь, 2 рабочих дня на одинаковые таблички — необоснованная трата времени. После автоматизации на одну таблицу уходит 5-10 минут, а на 20 — около 2 часов.
Таблица имеет 17 ячеек, парсинг производится из 5 источников. Заполнение таблицы происходит автоматически при заполнении всего 2 ячеек с исходными данными. Настройка и автоматизация парсинга суммарно заняла 30 часов времени, то есть потраченное время «окупится» уже на этапе генерации второй 20-ки таблиц.
Ручная работа vs. автоматизация
Автоматизация парсинга больших объемов данных и их обработки дает хорошие результаты. В нашем случае, на составлении каждых 20 таблиц экономим 14 часов рабочего времени специалистов, и приличную сумму клиентских средств :)
Полезные ссылки:
Welcome to comments
Возникли вопросы или что-то не получается? Будем рады помочь в комментариях.

Источник. http://blog.netpeak.ua/avtomatizirovanniy-parsing-saytov-s-pomoshchyu-kimono-i-tablits-google/

Комментариев нет:

Отправить комментарий