Init

Бесплатно? Конечно же никто у вас деньги за "пойти в гугл" не возьмет... А что если попытаться автоматизировать сей процесс? Вот тут то возникают проблемы и чернозём для бизнесов.

Как и в прошлой статье я полез доставать файлы из интернетов, на этот раз из Гуглов. История повторилась и я осознал, что где-то в закромах у меня был код для этого. С радостью начав его изучать, понял, что радости там не много и легче найти что-то готовое...

Далее мы мельком посмотрим: какие решения на текущий момент нам может предложить рыночек, что и с какими дефектами отдают даром. Также изучим какие проблемы возникают при автоматизации сего процесса и как в конечном итоге это можно сделать легко и бесплатно!

Сравнение решений и проблемы

Проблема 0. Нет проблем

Существует целая индустрия, которая занимается предоставлением SERP (search engine results page - результаты страницы поиска). Например Гугл готов предоставить API к поиску сам, а другие сервисы помимо доступа к Гуглу предоставляют результаты поиска Яндекса, Baidu и прочих сервисов. Вот сравнение некоторых коммерческих решений:

  • Google custom search - 100 бесплатных запросов в день. 5$ за 1000 запросов;

  • SerpApi - 100 бесплатных запросов в месяц. Планы от 50$ до 250$ в месяц;

  • SerpWow - 100 бесплатных запросов. Планы от 25$ до 9000$ в месяц;

  • Oxylabs - 1 бесплатная неделя с 5к запросов. Планы от 49$ до 249$ в месяц.

Cущесвует с десяток подобных сервисов. С рынком в целом понятно: есть тестовые периоды\запросы, если понравилось, то - изучай документацию, прилипай к 3rd-party сервису, покупай и продлевай. Цены не облачные, но что-то рука не тянется, наверное на неё села жаба ????. Что с опен-сорсами?

Проблема 1. Решения устарели

Преимущественно, хотелось бы найти решение, которое написано на Go, чтобы использовать его в своём коде или по возможности адаптировать. Взглянем на барахолку GitHub:

  1. github.com/rocketlaunchr/google-search - Ура! Сразу нашел гуглинг на Go. Но, к моему большому сожалению оно отказывалось работать, не выдавая результатов ☹️. Разработчики наc предупреждают об этом (на момент написания пофиксили):

    DOM Гугла часто меняется и поэтому парсер нужно постоянно подпиливать...
    DOM Гугла часто меняется и поэтому парсер нужно постоянно подпиливать...

    DOM поисковиков подвергается изменениям, и поэтому приходится постоянно допиливать решения такого рода.

  2. github.com/jarun/googler - Некогда популярная тулза написанная на Python для поиска через консоль. Последний коммит в 2021, репозиторий архивирован и судя по всему решение уже не работает.

  3. github.com/ecoron/SerpScrap - Библиотека для Python. Отвалился на документации и установке, необходимо ставить доп зависимости, как пользоваться их докером не задокументировано, решение не пилится с 2019 года - не питаем сильных надежд, идём дальше...

  4. github.com/serphacker/serposcope - Устаревшая утилита с UI на Java для SEO. Вроде бы есть функционал с решением капчи ????. Не предоставляет API.

  5. github.com/Athlon1600/SerpScraper - Решение для PHP. Не уверен, что работает (последний коммит 3 года назад), но есть интересный код. Имеется функционал с решением капчи.

Проблема 2. Быстрый детекшн без браузера

Некоторые описанные и увиденные мною решения используют HTTP клиенты, которые легко обнаруживаются. Используя их через небольшой промежуток времени мы столкнемся с капчей и нашу программу будут буллить и обидно называть ботом ????. Лучшие из имплементаций используют браузер для поиска и последующего парсинга страницы, но даже такой подход не является панацеей.

К слову, для проверки бот ли вы и бенчмаркинга ваших решений можно использовать следующие сервисы:

  • bot.sannysoft.com - показывает общие параметры вашего клиента и проводит некоторые тесты;

  • whatismybrowser.com - показывает соответствует ли сообщаемый браузер истинному;

  • abrahamjuliot.github.io/creepjs - способен обнаружить методы скрытия.

Попробуйте их, может быть вам уже стоит заводить электроовцу...

Проблема 3. Это просто интерфейсы\обертки :)

Некоторые библиотеки, которые я находил оказывались лишь интерфейсами над платными сервисами. Например:

  1. github.com/towfiqi/serpbear - Что-то для SMM-щиков. Обёртка, использующая API популярных сервисов (представлены в описании проекта).

  2. github.com/serpapi/google-search-results-python - Python библиотека для взаимодействия с платным сервисом.

Ох, что же делать? Ведь всегда должен быть бесплатный и плохой аналог любого коммерческого сервиса, правильно? Не правильно...

Давайте решим проблемы

Отделяем зёрна от плевел

Автоматизируем получение SERP сами. На бумаге решение проблем не выглядит сложным. Например, чтобы найти все результаты поиска на странице Baidu мы можем использовать такой простой CSS селектор (можно запустить в консоли разработчика в вашем браузере):

// Найти все элементы `div`, которые содержат классы `c-container` и `new-pmd`
document.querySelectorAll(`div.c-container.new-pmd`)

Тоже самое можно провернуть с помощью XPath:

$x(`//div[contains(@class, "c-container") and contains(@class, "new-pmd")]`)

Далее остается только извлечь полезную информацию из полученных HTML блоков и предоставить её в удобном виде.

Скрываемся и автоматизируем

Как запускать и парсить CSS селекторы в автоматическом режиме? Для многих языков программирования существуют фреймворки осуществляющие взаимодействия с браузером, например популярные Selenium или Puppeter. В моём случае я обратил внимание на Go-Rod.

Как мы уже выяснили, в плане скрытия нашей автоматизированной активности лучше делать это через браузер, нежели просто используя HTTP клиент. К слову Go-Rod имеет расширение stealth, которе дополнительно поможет скрыть нашу активность.

Штош, дело за малым. Остается только сконструировать правильный поисковый запрос. Можно изучить этот момент самим - опытным путём, либо смотрим гайды, например вот описание параметров для Baidu. Далее, используя Go-Rod запускаем браузер в headless режиме, переходим по сконструированной URL и парсим результаты CSS селекторами... Voilà!

Обратная сторона медали

Конечно же, даже используя браузер и изощрения для скрытия - рано или поздно мы словим каптчу. Для критерия успешености\полезности решения я придумал бенчмарк 101 - если получится сделать 101 бесплатный запрос в день (у гугла 100) через одну машину (1 IP), значит решение превосходит зарубежные аналоги полезно. А учитывая что автоматизированы 3 сервиса, то втройне!

Из минусов используемого подхода можно отметить:

  1. Мы полагаемся на постоянство DOM страниц поисковиков - если на них изменится структура, названия чего-либо, то придется так же как и отмеченному выше проекту google-search исправлять наше решение. Но отмечу, что код который я делал 4 года назад до сих пор был способен спарсить результаты со страницы Гугла без изменений (но быстро обнаруживался), так что это скорее зависит от элементов страницы, которые вы выберите для "зацепки".

  2. Используя браузер вместо обычного HTTP клиента у нас немного увеличивается потребность в ресурсах и необходимы дополнительные зависимости.

Очевидно, что взаимодествие с разными поисковыми сервисами будет отличаться, но в решении, которое я опишу далее, используется унифицированный подход, и поэтому давайте посмотрим как развернуть API для поиска в 2 клика...

Результаты поиска через API

Озвученный выше подход я применил в проекте OpenSERP. Для того чтобы задействовать доступ к результатам поиска через API, можно:

  • Запустить OpenSERP в среде Docker:

docker run -p 127.0.0.1:7000:7000 -it karust/openserp serve -a 0.0.0.0 -p 7000
  • Либо использовать скомпилированную для вашей OS версию, но для этого понадобится иметь Chrome на машине.

Запустив наш сервер мы можем использовать следующий запрос, чтобы получить 25 результатов поиска на русском языке по запросу Гугл с сайта habr.com:

GET http://127.0.0.1:7000/google/search?text=Гугл&lang=RU&limit=25&site=habr.com

Пример результата в формате JSON ????:

[
    {
        "rank": 1,
        "url": "https://habr.com/ru/companies/ispsystem/articles/694988/",
        "title": "Почему Google убивает свои проекты?",
        "description": "Если вы зайдете на сайт Killed By Google , то увидите длинный список из 259 сервисов, которые компания Google уже закрыла, и еще несколько, которые будут ..."
    },
    {
        "rank": 2,
        "url": "https://habr.com/ru/news/711824/",
        "title": "Google уволит 12 тыс. сотрудников по всему миру — это ...",
        "description": "20 янв. 2023 г. — Alphabet Inc., материнская компания Google, заявила, что планирует ликвидировать около 12 тыс. рабочих мест, сократив штат на 6%."
    },
...
]

Для того чтобы использовать Яндекс или Байду, мы используем соответсвующий эндпоинт - yandex или baidu вместо google в запросе. Параметры запросов и их описание представлены на странице репозитория.

Так же есть возможность вывода результатов через CLI.

Заключение

Несмотря на наличие платных опций для автоматизации поиска через известные движки - всегда должна быть free альтернатива. Поэтому было создано open-source решение OpenSERP, который поддерживает поиск по нескольким движкам (Google, Yandex, Baidu), может разворачиваться на вашем железе и помогает избежать привязки к платному 3rd-party сервису.
Конечно же ещё нужна определенная работа, чтобы решением можно было пользоваться в промышленных масштабах. Но в любом случае надеюсь, что оно может пригодиться читателю, поэтому приглашаю отметить проект :)

PS

Возможно кому-то также будет интересно почитать про автоматизацию поиска в веб-архивах.

Комментарии (0)