CoderCastrov logo
CoderCastrov
Эликсир

Давайте создадим ваш личный SEMRush с помощью Elixir!

Давайте создадим ваш личный SEMRush с помощью Elixir!
просмотров
5 мин чтение
#Эликсир
Table Of Content

Привет всем! Я рад, что моя статья о парсинге Google с использованием Elixir и Crawly набрала 200 аплодисментов! И, как я обещал, мы продолжим следовать пагинации Google и получать более значимые данные из результатов. Итак, давайте сделаем это на практике!

Постановка задачи

Многие онлайн-бизнесы полагаются на поисковые системы как на свой основной источник дохода, особенно интернет-магазины, инструменты и поставщики услуг. Известно, что 80% кликов приходится на веб-сайт, занимающий первую позицию в результатах поиска.

Обычно цифровые компании начинают с платной рекламы в поисковых системах, чтобы получить первые продажи и привлечь клиентов. Однако вскоре становится понятно, что намного выгоднее оказаться на первом месте органически. В этот момент компании начинают проводить промо-активности (обычно инвестируя в качественные обратные ссылки) и отслеживать изменения своей позиции.

Еще одна часть их цифровой стратегии - анализ конкурентов, который помогает понять сложность продвижения в определенных условиях.

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

Что такое SEMRush?

Ну, SEMRush - это, безусловно, гигант в мире интернет-маркетинга. Они предоставляют удивительную видимость ваших позиций и позиций ваших конкурентов. Отслеживание позиций там просто выше всяких ожиданий! Вы можете узнать больше о них здесь.

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

Можем ли мы все-таки сделать что-то, чтобы сравняться с их уровнем?

Насколько мне известно, нет другого инструмента, который предоставляет такой же уровень видимости. Пожалуйста, дайте мне знать в комментариях, если вы знаете кого-то еще, кого стоит попробовать :). Однако в рамках этого руководства мы построим свой собственный парсер на Elixir, который легко сравнится с их уровнем :).

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

Определение задачи

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

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

Мы будем основывать нашу работу на простом парсере Google, который мы построили в прошлый раз. Чтобы вспомнить, в прошлый раз мы создали парсер, который извлекает данные (URL, заголовок, описание) с первой страницы результатов поиска Google. Однако мы расширим наши данные следующим образом: URL, заголовок, описание, позиция в результатах поиска.

Начало работы

Давайте склонируем репозиторий Google SERP crawly, чтобы продолжить с места, где мы остановились в первой статье:

git clone [https://github.com/oltarasenko/crawly_serp.git](https://github.com/oltarasenko/crawly_serp.git)

Давайте также определим интерфейс, который позволяет запустить паука с заданным запросом в основном модуле приложения (google_serp.ex):

@doc """
Start a crawler with a given keyword as a starting point

## Examples

    iex> GoogleSerp.crawl("scraping elixir")
    :ok

"""
def crawl(query) do
  Crawly.Engine.start_spider(Spider**, **query: query)
end

Таким образом, никто не будет догадываться, как начать работу. Вы можете вызвать GoogleSerp.crawl("scraping elixir"), и он даст вам ожидаемые результаты!

Извлечение запросов к пагинации Google

Давайте исследуем, как следовать за элементом пагинации Google.

Оказывается, есть как минимум два варианта:

  • Извлечение ссылок с использованием селекторов CSS

Таким образом, можно получить ссылки с помощью:

links = Floki.find(document**, **"a.fl") |> Floki.attribute("href")
  • Однако есть более лучший (и более простой) способ сделать это. Оказывается, Google автоматически переходит на следующую страницу, как только вы добавляете параметр get &start=<number> в свой URL.

Мы будем использовать этот второй способ, так как нас интересует только первые 100 позиций в Google, и это требует всего лишь небольшой корректировки функции init, которую мы определили ранее.

@impl Crawly.Spider
def init(options) do
  # Чтение начальных URL из опций, переданных из основного модуля
  template = fn(query**, **start) ->
    "https://www.google.com/search?q=#{query}&start=#{start}"
  end
  starts = for x `<- 0..**10, **do: x * **10  **query =
    options
    |>` Keyword.get(:query**, **"scraping elixir")
    |> URI.encode() 

  [start_urls: Enum.map(starts**, **fn x -> template.(query**, **x) end)]
end

Хорошо, это все. Теперь давайте посмотрим, как добавить позицию к извлеченному элементу.

Расширение структуры элемента текущим размещением на странице

Давайте расширим нашу функцию parse_item следующим образом:

�� page_number = response.request_url |> URI.parse() |> Map.get(:query) |> URI.decode_query() |> Map.get("start"**, **"0") |> String.to_integer() ��

Добавим элемент позиции в структуру элемента:

�� items = search_results |> Enum.with_index() |> Enum.map(fn({block**, **i}) -> block |> parse_search_result() |> Map.put(:position**, **page_number + i) end) ��

Мы закончили! Этого должно быть достаточно для наших целей.

Просмотр собранных результатов

Давайте начнем магию:

�� GoogleSerp.crawl("crawly elixir")14:47:45.570 [debug] Starting the manager for Elixir.Spider14:47:45.574 [debug] Starting requests storage worker for Elixir.Spider...14:47:45.580 [debug] Started 8 workers for Elixir.Spider :ok ��

И через некоторое время у вас будут готовы данные:

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

Как обычно, все можно найти здесь на GitHub.

Выводы

В этой статье показано, как создать парсер, который позволяет отслеживать ваши позиции в результатах поиска Google. Это позволяет вам иметь бесплатную версию SEM Rush. Конечно, мы далеки от наивной идеи о том, что мы можем полностью сравняться с их настоящей инфраструктурой и функциями. Однако это может быть хорошей отправной точкой для людей, которые только начинают свой бизнес и ищут дешевый вариант для выполнения той же работы.

В противном случае, я хочу предложить еще одну небольшую задачу для моих дорогих читателей :). Давайте добьемся 300 аплодисментов на этой статье, чтобы я мог понять интерес. После этого я обещаю развернуть парсер Google, который мы только что создали, на нашем демо-экземпляре CrawlyUI, с возможностью парсить данные по поисковым запросам :). Так что представьте себе легковесную версию SemRush, доступную для ваших потребностей без каких-либо проблем.

Если вы считаете, что то, что мы делаем, интересно, мы будем очень признательны за вашу поддержку проекта!