Бессерверный парсер выдачи Google на Javascript

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

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

Kimono — мощный и быстрый в настройке скрейпер с интуитивно понятным интерфейсом. Позволяет парсить данные с других сайтов и позже обновлять их. Бесплатный.

Познакомиться поближе и получить краткий мануал об использовании можно (на русском) или на moz.com (на английском). Давайте попробуем спарсить что-нибудь хорошее с помощью Kimono. Например, дополним созданную нами таблицу с городами списком курортов в стране Города 2. Как это можно реализовать при помощи Kimono Labs. Нам понадобятся:

  • приложение для Google Chrome — Kimono;
  • таблица Google Docs.

1. Находим сайт с необходимой нам информацией — то есть перечнем стран и их курортов. Открываем страницу, откуда необходимо получить данные.

2. Кликаем на иконку Kimono в правом верхнем углу Chrome.

3. Выделяем те части страницы, данные из которых нам необходимо спарсить. Если нужно выделить новый тип данных на той же странице, кликаем на «+» справа от «property 1 » — так указываем Kimono, что эти данные нужно разместить в новом столбце.

4. Кликнув на фигурные скобки <> и выбрав «CSV », можно увидеть, как выбранные данные будут располагаться в таблице.

5. Когда все данные отмечены:

  • кликаем «Done » (в правом верхнем углу);
  • логинимся в Kimono, чтобы привязать API к своему аккаунту;
  • вводим название будущего АРI;
  • кликаем «Create API ».

6. Когда API создано, переходим в таблицу Google, куда хотим загрузить выбранные данные. Выбираем «Connect to Kimono » и кликаем на название нашего API — «Resorts ». Список стран и ссылок на страницы с курортными городами выгружается на отдельный лист.

7. Переходим снова на сайт, берем для примера Ирландию, и снова выбираем через Kimono города, которые необходимо спарсить. Создаем API, называем его «Resorts in countries ».

9. В «Crawl Strategy » выбираем «URLs from source API ». Появляется поле с выпадающим списком всех API. Выбираем созданное нами ранее API «Resorts » и из него автоматически загружается список URL для парсинга. Кликаем синюю кнопку «Start Crawl » (начать обход) и следим за статусом парсинга. Kimono обходит страницы, парсит данные по заданному ранее шаблону и добавляет их в таблицу — то есть делает все то же самое, что и для Ирландии, но уже для всех других стран, что ввели автоматически и без нашего участия.

10. Когда таблица сформирована, синхронизируем Kimono Labs с таблицей Google — точно так же, как делали это в шестом пункте. В результате, в таблице появляется второй лист с данными.

Предположим, хотим, чтобы в таблице отображались все курортные города в стране города прибытия. Данные на листах Kimono обрабатываем с помощью формул для таблиц Google, и выводим в строку список городов, где еще можно отдохнуть в Австралии, кроме Сиднея.

Например, это можно сделать так . Разметить массив данных (список городов), используя логические функции и возвращая значение ячейке, равное TRUE или FALSE. На примере ниже выделили для себя города, которые находятся именно в Австралии:

  • TRUE = город находится в Австралии;
  • FALSE = город находится в другой стране.

По меткам TRUE определяем начало и конец обрабатываемого диапазона, и выводим в строку соответствующие этому диапазону города.

По аналогии можем вывести курортные города и для других стран.

Мы специально привели здесь достаточно простой и пошаговый пример — формулу можно усложнить, например, сделать так, чтобы достаточно было ввести страну в колонку С, а все остальные вычисления и вывод городов в строку происходили автоматически.

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

Как говорилось вначале, нам регулярно нужно составлять по 20 однотипных таблиц. Это рутинный процесс, съедающий по 40-50 минут на одну таблицу, и по 16 часов времени на каждые 20 шт. Согласитесь, 2 рабочих дня на одинаковые таблички — необоснованная трата времени. После автоматизации на одну таблицу уходит 5-10 минут, а на 20 — около 2 часов. Таблица имеет 17 ячеек, парсинг производится из 5 источников. Заполнение таблицы происходит автоматически при заполнении всего 2 ячеек с исходными данными.

Настройка и автоматизация парсинга суммарно заняла 30 часов времени, то есть потраченное время «окупится» уже на этапе генерации второй 20-ки таблиц.

Макрос написан для плагина iMacros браузера Firefox. Версии на момент создания макроса:
Версия iMаcros — 8.9.4
Версия Firefox — 42.0
.

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

Особенности Google SERP Parser

Макрос сохраняет в отдельный файл google_search.txt результаты поисковой выдачи Google: название сайта, ссылка на сайт.

Расширенный макрос (платная версия) дополнительно имеет такие возможности:

  • Возможность устанавливать количество сайтов, которые нужно сохранить. Можно установить любое (!!!) количество сайтов;
  • Не сохраняются данный Картинок, Новостей и рекламных сайтов с пометкой «Ad»

Код для iMacors

SET !LOOP 1 TAG XPATH=".//*[@id="rso"]/div/div/div[{{!LOOP}}]/div/h3/a" EXTRACT=HREF TAG XPATH=".//*[@id="rso"]/div/div/div[{{!LOOP}}]/div/h3/a" EXTRACT=TXT SAVEAS TYPE=EXTRACT FOLDER=* FILE=google_search.txt

SET ! LOOP 1

TAG XPATH = EXTRACT = HREF

TAG XPATH = ".//*[@id="rso"]/div/div/div[{{!LOOP}}]/div/h3/a" EXTRACT = TXT

SAVEAS TYPE = EXTRACT FOLDER = * FILE = google_search . txt

Инструкция

  1. Скопировать скрипт желательно в Notepad++, но можно и в блокнот.Обязательно поставить кодировку UTF-8.
  2. Сохранить файл макроса с расширением .iim , например в моем случае Google_Serp_Parser_W1S.iim.
  3. Файл макроса поместить в папку Mаcros. Обычно путь такой: C:\Users\USER_NAME\Documents\iMacros\Macros
  4. Открыть браузер Firefox, зайти на страницу Google, ввести поисковый запрос, нажать поиск и далее ничего не нажимать.
  5. Включить iMacros, найти в левом окошке сохраненный максрос, в моей случае Google_Serp_Parser_W1S.iim, навести на него курсор (нажать левой кнопкой мышки один раз)
  6. В поле «Повторить макрос — Макс:» ввести количество сайтов, но не более 10.
  7. Нажать Воспр.(Цикл) «.

Как открыть текстовый файл в Excel вы можете прочитать

  • Количество результатов по запросу
  • Ссылки, анкоры и сниппеты из выдачи
  • Список связанных ключевых слов(Related keywords)
  • Определяет посчитал ли Google запрос опечаткой или нет
  • Парсит из рекламных блоков ссылку, анкор и сниппет. Следует обратить внимание, что в переменную $link будут попадать ссылки, которые имеют вид для получения ссылок которые мы видим при выдаче под анкорами, нужно использовать переменную $visiblelink. Это касается только блока рекламы.



Возможности(top)

  • Поддержка всех поисковых операторов Гугла(site:, inurl: и т.д.)
  • Парсит максимальное отдаваемое гуглом число результатов - 10 страниц по 100 элементов в выдачи
  • Может автоматически парсить больше 1000 результатов на запрос - подставляет дополнительные символы(опция Parse all results)
  • Возможность поиска связанных ключевых слов
  • Поддерживает выбор страны поиска, города, региона, домена, языка результатов
  • Поддерживает указание времени выдачи
  • Возможность парсить по новостям и блогам
  • Можно указать парсить ли выдачу если гугл сообщает о том что по указанному запросу ничего не найдено и предлагает результаты по схожему запросу
  • Поддерживает отключение фильтра гугла по скрытию похожих результатов(filter=)
  • Возможность выбора языка интерфейса Google, выдача результатов в парсере и в браузере, при идентичных настройках, максимально идентична

Варианты использования(top)

  • Сбор баз ссылок - для A-Poster, XRumer, AllSubmitter и т.д.
  • Оценка конкуренции для кейвордов
  • Поиск беклинков(упоминаний) сайтов
  • Проверка индексации сайтов
  • Поиск уязвимых сайтов
  • Любые другие варианты подразумевающие парсинг гугла в том или ином виде

Примеры(top)

Запросы(top)

  • В качестве запросов необходимо указывать поисковые фразы, точно так же как если бы их вводили прямо в форму поиска Гугла, например:

окна Москва
site:http://lenta.ru
inurl:guestbook

Нажмите, чтобы раскрыть...

Результаты(top)

  • В результате отображен список ссылок по запросам:

http://lenta.ru/
http://vesti.lenta.ru/
http://old.lenta.ru/
http://1991.lenta.ru/
http://vip.lenta.ru/
http://pda.lenta.ru/
http://3m.lenta.ru/
http://lm-3.lenta.ru/
http://aquarium.lenta.ru/magazine/
http://real.lenta.ru/
http://megafon.lenta.ru/
http://okna-rassvet.ru/
http://www.montblanc.ru/
http://www.probkiizokna.ru/
http://www.panorama-group.ru/
http://www.oknadoz.ru/
http://www.okna-darom.ru/
http://www.oknarosta.ru/
...

Нажмите, чтобы раскрыть...

Возможные настройки(top)

Параметр Значение по умолчанию Описание
Links per page 100 Количество ссылок в выдачи на каждую страницу
Pages count 5 Количество страниц для парсинга
Google domain www.google.com Домен Гугла для парсинга, поддерживаются все домены
Results language Any language Выбор языка результатов(параметр lr=)
Search from country Global Выбор страны откуда осуществляется поиск(гео-зависимый поиск, параметр gl=)
Location (city) - Поиск по городу, региону. Можно указывать города в виде novosibirsk, russia; полный список локаций можно найти по ссылке . Также необходимо выставлять корректный домен гугла
Hide omitted results Определяет скрывать ли опущенные результаты(параметр filter=)
Serp time All time Время серпа(временно-зависимый поиск, параметр tbs=)
Serp type Main Определяет парсить с главной страницы, по новостям или блогам
Parse not found Определяет парсить ли выдачу если Гугл сообщил что по указанному запросу ничего не найдено и предложил выдачу по другому запросу
Use AntiGate Определяет использовать ли antigate для обхода каптч
AntiGate preset default Пресет парсера Util:AntiGate. Необходимо предварительно настроить парсер Util::AntiGate - указать свой ключ доступа и другие параметры, после чего выбрать созданный пресет здесь
Use digit captcha Включает принудительное использование цифровой каптчи
Use sessions Cохраняет хорошие сессии что позволяет парсить еще быстрее, получая меньшее число ошибок.
Interface language English Возможность выбора языка интерфейса Google, для максимальной идентичности результатов в парсере и в браузере

В процессе оптимизации сайта очень часто возникает необходимость проанализировать имеющиеся в индексе поисковых систем страницы. Чтобы не парсить выдачу Яндекса или Google вручную, можно использовать программу ComparseR. В данном материале я рассмотрю две практические задачи в которых мне совсем недавно пригодился данный софт, и в которых, естественно, он может пригодиться владельцам сайтов и оптимизаторам:

  1. Удаление битых страниц, которые попали в индекс после выгрузки из 1С с ошибочными символьными кодами разделов и товаров;
  2. Составление карты редиректов при объединении разделов сайта.

Удаление битых страниц после некорректной выгрузки из 1С

Один из клиентов, заказавших продвижение сайта , в процессе работ по оптимизации продолжал доработку выгрузки товаров из 1С. В связи с этим при каждой выгрузке каталога менялись символьные коды элементов. К ним добавлялась частица «_1», «_2» и т.д. При этом каждая выгрузка успевала частично проиндексироваться.

Итог: мы получили в индексе около 4 000 страниц, 3 600 из которых оказались битыми и отдавали 404 ошибку.

Ни для кого далеко не секрет, что в Яндекс и Google существует ограничение на парсинг выдачи в 1 000 элементов. Здесь мы сталкиваемся с первой проблемой: как спарсить 4 000 страниц при ограничении в 1000? Именно в этом случае на помощь и приходит ComparseR.

Если на сайте корректная ссылочная структура и все страницы можно найти по ссылкам на страницах (во втором случае рассмотрим ситуацию, когда это не так), то в первую очередь необходимо провести сканирование сайта с помощью краулера и построить дерево текущей структуры:

Делается это как раз из-за ограничения в 1000 страниц парсинга выдачи. В случае с построением дерева ComparseR сможет обойти данный лимит при помощи запросов к поиску по каждому разделу сайта отдельно. Для этого запустим парсинг с помощью метода перебора с минимальным количеством запросов. В моем случае приходилось делать запуск раза 4, прежде чем были собраны все страницы, находящиеся в индексе.


Отправляем все несуществующие страницы на удаление с помощью функции «Добавить/Удалить URL» и оставляем сайт индексироваться.

Составление карты редиректов при объединении разделов сайта

У интернет-магазина были разные разделы для розничных и корпоративных клиентов. При этом ассортимент их пересекался примерно на 40%, а оставшиеся 60% товаров корп. раздела вполне могли пригодиться и розничным покупателям. Было решено объединить их, и, чтобы не потерять аудиторию из поиска, которая шла на корпоративный раздел, настроить 301 редиректы.

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

Естественно, количество покупок резко сократилось, так как люди попадали из поиска на 404 страницу, а программисты не могли ничего сделать, так как сопоставлять в корпоративном разделе с розничным было уже нечего.

Благо, ComparseR после версии 1.0.77 научился делать произвольные запросы к выдаче. Именно это нас и спасло. Страниц товаров в корпоративном разделе было проиндексировало около 1 800, корректной структуры, чтобы построить дерево, также не осталось из-за удаления корпоративного каталога. Пришлось взять страницу раздела из кэша Яндекса и вручную скопировать все урлы его подразделов.

После этого отправляем произвольные запросы по очереди к обеим поисковым системам:


Результатом будет полученный список страниц, которые проиндексированы в поисковых системах. Выгружаем в excel. Изначально сделали скрипт, который сопоставлял товары по символьным кодам, но, к сожалению, оказалось, что символьные коды некоторых элементов были изменены, а вот наименования остались прежними. Разбираем title на куски, убрав из него шаблонные элементы.

Результатом стал готовый список наименований товаров, по которому программисты уже вытащили корректные url перемещенных в розничный раздел элементов и сопоставили их со списком спарсеyных страниц. Задача решена.

Ни для кого из вас не секрет, что для продвижения сайтов нужны ссылки и желательно много и бесплатно. Где же их взять? Существует сайты, которые получают контент благодаря пользователям. Например, каталоги сайтов, статей и компаний. Базой называется собрание адресов таких сайтов.
Вне зависимости от того, какую базу вы собираете, можно найти сайты по соответствующим запросам в поисковых системах. Этот процесс называется парсингом выдачи . Обычно парсится Google и на это есть три причины:
1.Хорошее качество поиска
2.Высокая скорость ответа
3.Наличие оператора inurl :
Этот оператор имеет следующий вид inurl:«содержание url искомых страниц ». С помощью этого оператора можно искать конкретные движки сайтов. В Яндексе нет аналогов этому оператору.

Например, чтобы найти большую часть каталогов Made-Cat нужно в поисковой строке Google ввести запрос: inurl:"ext/rules" или inurl:"add/1" .

Правда, с использованием этого оператора нужно знать несколько моментов. Первое - для Google большинство спецсимволов - то же самое, что и пробел. Это плохо потому, что некоторые движки будут парситься с огромным количеством мусора. Например, в выдаче по запросу inurl:«xxx/yyy» можно встретить как страницы, содержащие «xxx?yyy», так и страницы, содержащие «xxx.yyy».
Второе - для многих запросов поисковик при использовании этого оператора показывает не всю выдачу как раз для того, чтобы ограничить дорвейщиков.
Иногда я запрос с оператором inurl заменяю запросом в виде -intext:"XXX" -intitle:"XXX" "XXX". Другими словами, мы говорим Google искать XXX, но не в тексте и не в заголовке, а кроме этого есть только URL. Правда, такая замена не равнозначна: если искомый XXX есть в заголовке или в тексте и одновременно в URL, то такая страница показана не будет.

При парсинге есть обычно две задачи:
1. Напарсить как можно больше URL.
2. Захватив при этом как можно меньше мусора - страниц, которые нам не нужны.

Для решения первой задачи используется следующим метод. Например, по запросу «XXX» выдается только 1000 сайтов, а в Интернете их, скажем, полмиллиона. Чтобы увеличить выдачу, добавим в к основному запросу(ам) «бесполезные» уточнения:
«XXX» фирма
«XXX» компания
«XXX» найти
«XXX» сайт
«XXX» страница
«XXX» главная
В качестве уточнения берем общеупотребительные слова, которые могут встретиться на любом сайте. Хотя более полезно сайты разделять на непересекающиеся категории: только английский, только русский, только украинский. Либо добавлять поиск по зоне домена inurl:«.com», inurl:«.net»… Возьмем, например, запрос «каталог». Страниц в интернете с таким словом 209 000 000, но нам выдается не больше 1000. Используя шесть запросов
1.Каталог inurl:«.com»
2.Каталог inurl:«.net»
3.Каталог inurl:«.biz»
4.Каталог inurl:«.ru»
5.Каталог inurl:«.info»
6.Каталог inurl:«.org»
Мы получим не 1000, а 6000 каталогов. Применив находчивость, можно получить несколько десятков тысяч URL. Но большинство будет мусором.

Порой проблемы с мусором весьма существенные, потому приходится перед парсингом качество выдачи по каждому запросу проверять вручную, чтобы автомат не захватил много ненужных сайтов, а вы потом не мучились, проверяя их. Помогает нахождение «полезных» уточнений.
Например, при запросе inurl:"add/1" можно наблюдать много мусора, этому нужно добавить уточнение inurl:"add/1" "URL вашего сайта" . Можно пойти дальше и отфильтровать «серые» каталоги «inurl:"add/1" "URL вашего сайта" -"URL где стоит ссылка"»

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

Использование бесплатного десктопного парсера

Программа не требует установки и поэтому пользоваться ей можно сразу после закачки.Работает программа только с Google и обладает спартанским интерфейсом, но, как говорится, «дареному коню в зубы не смотрят».

1.Поле ввода запросов. Сюда нужно ввести список запросов к Google, например, inurl:«xxx» (обратите внимание на то, что оператор и запрос пишутся без пробела).
2.Поле ввода-вывода URL запросов к Google. В этом поле будет появляться, какие URL Google парсятся при выполнении запросов. При желании можно самому сюда ввести список urls Google, которые нужно отпарсить. К примеру: «http://www.google.com.ua/search?hl=ru&q=XXX&btnG=%D0%9F%D0%BE%D0%B8%D1%81%D0%BA+%D0%B2+Google&meta=»
3.Поле вывода результа – URL сайтов, которые нашлись.
4.Процент выполненения задачи
5.Фильтр на парсинг только русскоязычных сайтов
6.Задержка в тысячных долях секунды. От 0 до 60 000. Задержка нужна, чтобы гугл не понял, что его парсит программа и не заблокировал вам доступ к ресурсам.
7.Кнопка «Поехали» запускает парсинг.
8.Показывает страницу, которая парситься в данный момент. Пользы особой нет, скорее для развлечения.

Дополнительно над полем ввода запросов (1) есть кнопка «преобразовать», которая преобразует запросы inurl:«XXX» в -intext:"XXX" -intitle:"XXX" "XXX"

Как пользоваться программой? Ввести в левое поле ввода(1) список запросов, подождать и копировать из правого поля ввода(3) результат. Потом отчистить дубли доменов, например, с помощью http://bajron.od.ua/?p=67. Реузльтаты хранятся в формате списка URL найденных сайтов.
Программа избавляет от большей части рутинной работы и парсит намного быстрее человека.