10 способов использования функции Import XML для анализа страниц сайта
В статье я расскажу о том, как получить количество товаров и отзывов, дату последнего Google cache и про другие применения функции ImportXML в Google Spreadsheets для быстрого анализа данных страниц.
ImportXML(Url;XPath) — формула Google Spreadsheets, которая импортирует данные из источников в формате XML, HTML, CSV, TSV по URL и применении языка запросов XPath.
Более детально о XPath запросах можно ознакомится в статье.
Для примера просто взяла сайты из ТОПа по конкурентным запросам таким как «холодильники», «samsung galaxy s7» и т.д
1. Импорт Title, Description, H1
Самый просто пример ImportXML для парсинга TDH. Удобно тем, что подходит для любого сайта. Mожно брать и использовать, не углубляясь в XPath. Рассмотрим на примере Title для страницы:
В коде страницы находим <title>
Title для страницы уникален и лежит между тегами <title> </title>.
Таким образом XPath для страницы сайта будет выглядеть «//title».
//title — указывает на относительный путь к тегу title. То есть нас не интересует на какой глубине (уровне вложенности) от корня title находится.
Полная функция для Google Spreadsheets будет выглядеть так:
=IMPORTXML("http://comfy.ua/holodil-nik-s-nizhnej-morozilkoj-lg-ga-b419secl.html";"//title")
Применение для списка страниц:
По аналогии находим H1. Xpath для h1 имеет вид «//h1»
С Description ситуация немного сложнее.
Рассмотрим часть кода:
<meta name="description" content="Заказывай на сайте ➥ забирай сегодня! Тел. ☎ 0(800)303-505. Низкие цены на холодильники ✔оплата частями ✔кредит 0% ✔доставка по всей территории Украины в Комфи" />
В данном случае нам нужно не текстовое значение тега, а значение атрибута content.
XPath имеет вид: «//meta[@name=’description’]/@content»
Мы ищем тег meta со значение атрибута content. Но таких тегов может быть больше, чем 1. Нам нужен именно тот, у которого значение атрибута name=’description’
=IMPORTXML("http://comfy.ua/holodil-nik-s-nizhnej-morozilkoj-lg-ga-b419secl.html";"//meta[@name='description']/@content")
Финальная таблица:
Данный пример помог ознакомиться с самыми простыми запросами XPath.
2. Количество отзывов на странице товаров
Данное решение нельзя отнести к 100% универсальному, но тем не менее для большинства ecommerce сайтов применимо.
Количество отзывов будем вытаскивать из микроразметки. Нам также ничто не мешает вытаскивать его и из контента сайта, но не всегда для пользователя количество отзывов будет видимо.
Рассмотрим 4 наиболее популярных способа представления отзывов в микроразметке:
- Количество отзывов присутствует в контенте страницы. Разметка Shema.org:
<span itemprop="reviewCount" content="16">16</span>
Так например, представляются отзывы, если они присутствуют в контенте, то есть видимы для пользователя.
В таком случае, XPath: «//*[@itemprop=’reviewCount’]»Вместо указания названия тега ставим *, что означает, что нам подходит любой тег с атрибутом itemprop=’reviewCount’. Так как сам тег может быть и div, span, a, h2 и т.п
- Количество отзывов скрыто от пользователя и присутствует только в коде сайта. Разметка Shema.org:
<meta itemprop="reviewCount" content="21"/>
В таком случае, XPath: «//meta[@itemprop=’reviewCount’]/@content»
- Количество отзывов присутствует в контенте страницы. Разметка Data-Vocabulary.org
XPath: «//*[@property=’v:count’]» - Количество отзывов скрыто от пользователя и присутствует только в коде сайта. Разметка Data-Vocabulary.org
XPath: «//meta[@property=’v:count’]/@content»
Cамо собой при необходимости данный список можно расширять под другие форматы микроразметки. Но это уже выходит за рамки быстрого анализа через Google Spreadsheets.
Учитывая 4 варианта представления данных в микроразметке делаем сравнительный анализ для страниц:
Финальная формула выглядит так:
=Iferror( IMPORTXML(A2;"//meta[@itemprop='reviewCount']/@content"); Iferror( IMPORTXML(A2;"//*[@property='v:count']"); Iferror( IMPORTXML(A2;"//*[@itemprop='reviewCount']"); IMPORTXML(A2;"//meta[@property='v:count']/@content") ) ) )
Понятно, что для всех случае жизни применять данный метод тяжело, но всегда можно написать такую формулу, которая сможет это сделать в рамках одного сайта:
Подобный анализ уже может нам помочь в планировании стратегии по написанию отзывов на страницы товаров.
3. Количество внешних ссылок со страницы
Пример кода:
<a href="/kata/122/apple/" id="b_116">
XPath: «//a»
Формула:
=COUNTA(IMPORTXML(A2;"//a"))
Результат:
Как видим в последних двух случаях ребята закрыли возможность парсить так просто их данные 🙂
4. Количество контента на странице
Пример кода:
XPath: «//p»
Формула:
=LEN(concatenate(IMPORTXML(A3;"//p")))
Результат:
5. Получить список товаров со страницы категории
Здесь, очевидно, уже нельзя найти шаблонное решение, но тем не менее для работы с одним сайтов вполне подойдет для использования на постоянной основе.
Пример кода:
Алгоритм составления XPath разобьем на несколько шагов:
- Поиск уникального атрибута или значения атрибута (в первую очередь обращаем внимание на class и id) для основного блока с товарами, чтобы избежать ситуации с дополнительными блоками товаров из других категорий. В данном случае, можно использовать:
<table class="products-tiles">
- Проверка уникальности атрибута через поиск по коду страницы
- Поиск уникального атрибута для каждой карточки внутри блока товаров с наличием ссылки на сам товар в данном теге или в дочернем теге.
- Задаем XPath:
«http://comfy.ua/refrigerator/»;«//table[@class=’products-tiles’]//p[@class=’products-tiles__cell__name’]/a/@href»
Рассмотрим детальнее
//table[@class=’products-tiles’] — задаем путь к сетке товаров
//p[@class=’products-tiles__cell__name’] — игнорируя уровень вложенности переходим к товару
/a/@href — зная, что ссылка лежит в следующем теге, указываю прямой путь «/»,а не относительный «//» - Проверяем результаты на реальном примере.
Видим, что часть урлов задублировалось, можем это устранить функцией UNIQUE():
Финальная формула:
=UNIQUE( IMPORTXML( "http://comfy.ua/refrigerator/"; "//table[@class='products-tiles']//p[@class='products-tiles__cell__name']/a/@href" ) )
6. Количество товаров на страницах категории. Наличие товаров.
Полезный навык для выбора страниц категорий, брендов и фильтров для продвижения, если их очень много. Отсеиваем страницы без товаров и товаров «Нет в наличии».
Воспользуемся той же формулой, какую использовали в предыдущем пункте. Считаем количество элементов в списке:
=COUNTUNIQUE(IMPORTXML(A2;"//table[@class='products-tiles']//p[@class='products-tiles__cell__name']/a/@href"))
Но, необходимо учесть момент, что при выводе ошибки о том, что элементы не найдены так же возвращается 1. Поэтому добавляем проверку:
=IF( ISERROR( IMPORTXML(A2;" //table[@class='products-tiles'] //p[@class='products-tiles__cell__name']/a/@href" ) ); 0; COUNTUNIQUE( IMPORTXML(A2; "//table[@class='products-tiles'] //p[@class='products-tiles__cell__name']/a/@href") ) )
При подсчете количества товаров в наличии будем подсчитывать количество кнопок «Купить» у товаров:
Заменяем часть запроса XPath, оставляя путь к блоку товара, но меняем подсчет количества названий товара, на подсчет кнопок «Купить».
XPath выглядит так: «//table[@class=’products-tiles’]//span[@class=’buy’]»
Конечная формула:
=IF( ISERROR( IMPORTXML(A2; "//table[@class='products-tiles']//span[@class='buy']" ) ); 0; COUNTA( IMPORTXML(A2; "//table[@class='products-tiles']//span[@class='buy']") ) )
И сам результат легко применять для быстрого отсеивания страниц, которые не подходят для продвижения:
7. Канонические страницы
Пример кода:
<link rel="canonical" href="http://comfy.ua/refrigerator/brand__beko/" />
XPath: «//link[@rel=’canonical’]/@href»
Формула:
=COUNTA(IMPORTXML(A2;"//link[@rel='canonical']/@href"))
Результат:
8. Страницы с мета-тегом noindex
Пример кода:
<meta name="robots" content="INDEX,FOLLOW" />
XPath: «//meta[@name=’robots’]/@content»
Формула:
=COUNTA(IMPORTXML(A2;"//meta[@name='robots']/@content"))
9. Ответ сервера
Для получения ответа сервера необходимо найти любой сервис, помогающий по адресу URL определить ответ сервера. Есть 2 условия выбора такого сервиса:
- При вводе URL на сайте сервиса, URL нашего сайта должен отображаться в URL сайта сервиса:
https://2ip.ru/server-response/?host=http%3A%2F%2Fcomfy.ua%2Frefrigerator%2F
- Сам запрос на сайт должен обрабатываться до окончательной загрузки html страницы, а не после.
Пример кода:
XPath: «//div[@class=’ip-entry’]//big»
Формула:
=IMPORTXML(CONCATENATE("https://2ip.ru/server-response/?host=";A2);"//div[@class='ip-entry']//big")
Результат:
10. Время последнего кэша страницы в Google
Пример кода:
XPath: «//div[@id=’google-cache-hdr’]/div»
Исходя из XPath находим конечную формулу:
- Используем начальную формулу по аналогии, как предыдущем пункте:
=IMPORTXML( CONCATENATE("http://webcache.googleusercontent.com/search?q=cache:";A2); "//div[@id='google-cache-hdr']/div" )
- Заметим, что наш результат лежит в первой строке, 3 столбце условного диапазона:
Применяем формулу Index(диапазон;1;3) для выбора нужной ячейки.
- Обрезаем стандартный текст, чтобы осталась только дата:
И так итоговая формула выглядит:
=SUBSTITUTE( INDEX( IMPORTXML( CONCATENATE("http://webcache.googleusercontent.com/search?q=cache:";A2); "//div[@id='google-cache-hdr']/div"); 1; 3 ); ". It is a snapshot of the page as it appeared on "; "" )
Результат:
#REF! указывает на отсутствие страницы в кэше, но нужно быть осторожным и проверить на паре примеров, где не определилась дата.
Данные формулы будут полезны для короткого постраничного анализа страниц для крупных проектов.
а как бороться с этим http://prntscr.com/eqq0nm ?
Есть определенный лимит запросов на один Google Spreadsheets. Я просто создаю новый гугл спредшитс, делаю часть запросов там, а в рабочий док вставляю только значения. Данный способ и не предназначен изначально для большого объема данных. Но для небольшого анализа подходит.
Скажите, а можно получить список всех ссылок на странице с анкорами этих ссылок? Чтобы можно было построить карту меню, например?
Ищу полдня, и не могу найти как реализовать.
Здравствуйте. Можно.
В одной ячейке пишите =IMPORTXML(«Ваш урл»; «//a/@href»), а в соседней клетке справа пишите =IMPORTXML(«Ваш урл»; «//a»),
В итоге получите список урлов, а справа список анкоров
Здравствуйте. Попробовал эту формулу. качает все меню, вообще все ссылки со страницы. а мне надо скачить только товары. возможно это? Спасибо
На нужной странице пишеч: Объем импортированных данных превышает допустимый.
Вопрос такой, как обновить полученные данные? Т.е. один раз спарсили когда фомулу вставили, через 5мин/5 дней нужно обновить их. Есть мысли?
Написать скрипт обновления в час, в день, в неделю.
как?
Подскажите по 4 пункту..
Задача забрать весь plain-text со страницы не прописывая class =ЕСЛИОШИБКА(ДЛСТР(СЦЕПИТЬ(IMPORTXML(A2;»//div[@class=’typo’]»)));»НЕ ВЕРНЫЙ CLASS»)
Значем что текст стоит в основном в часть данных структурируются в таблицу .. какую тут формулу можно сконструировать? или как допились эту =ДЛСТР(СЦЕПИТЬ(IMPORTXML(A5;»//p))) что бы в данные вытягивало колличество слов из
Спасибо.
Попробуйте так:
=ДЛСТР(СЦЕПИТЬ(ЕСЛИОШИБКА(IMPORTXML(A3;»//p»);»»);ЕСЛИОШИБКА(IMPORTXML(A3;»//table»);»»)))
есть ли возможность парсить таким образом сайт morningstar .com
например раздел «Movers»—«Stock Name» (таблица)?
//div[@class=’main-content’]//div[@class=’table-wrapper’]//span[@class=’no-wrap’]
не получается, спасибо за совет
Прошу помощи с формулой, нужно с сайта https://www.turkishairlines.com/ru-ua/flights/flight-status/?t=1&flight=420&date=260419 вытащить статус рейса
Добрый день!
Как получить данные таблицы дислокация в гогл таблицу, фото находится по ссылке
https://drive.google.com/file/d/1P6aQw8vDMusCzmEGgrxtybifReFxA-Z6/view?usp=sharing
Может вы подскажете
нужно получить, скажем, по ссылке https://www.google.com/search?client=firefox-b-d&q=android
строку «Результатов: примерно 5 970 000 000 (0,67 сек.)»
Пишу в ячейку
=IMPORTXML(«https://www.google.com/search?client=firefox-b-d&q=android»;»//div[@id=’resultStats’]»)
или
=IMPORTXML(«https://www.google.com/search?q=android»;»//div[@id=’resultStats’]»)
Выдает
Ошибка
Ссылка https://www.google.com/search?client=firefox-b-d&q=android недействительна
Нервы сдают)
Парсинг сайтов это самый лучший способ автоматизировать процесс сбора и сохранения информации. Благодаря парсеру можно создавать и обновлять сайты, схожие по оформлению, содержанию и структуре. Если коротко, вы получаете исходный код страницы, программа проходит по нему, как по обычным словам, и находит некоторые соответствия, которые записаны в ее программный код. Она сравнивает их, сопоставляет и сохраняет то, что нужно вам по определенным условиям. Последний шаг сохранение в удобном для вас формате данных. То есть какие-то программы или скрипты будут сохранять в SQl, какие-то в XML, кто-то в обычном TXT либо в табличном документе.