Go программирования

Создание готового веб-краулера на Go

Использование GoRoutines, каналов и других конструкций

Для большинства программистов поисковый робот служит базовой утилитой. Он позволяет очищать и обрабатывать контент с любого веб-сайта. В первые дни моего программирования, очищая веб-сайт, я мог генерировать ключевые идеи без особых усилий вручную. На странице поиска Amazon я мог легко проанализировать цену, средн. просмотрите рейтинг и марку всех товаров и представьте в таблице. Вы спрашиваете «почему»? Позвольте мне объяснить ... Основная потребность большинства программистов - автоматизировать повседневные процессы. В случаях, когда я обычно просматриваю несколько веб-сайтов, чтобы собрать данные и принять решение, веб-сканеры частично их автоматизируют. Подключите его к другим инструментам анализа данных, и он откроет еще больше возможностей. Вы также можете сканировать «средний» веб-сайт и выяснять тенденции или популярные темы. Вы можете очищать несколько новостных веб-сайтов и сопоставлять результаты, создавать облака слов и т. Д. Это полностью дает вам ложное ощущение власти! Веб-сайты для отслеживания цен создаются с использованием веб-сканеров, которые сканируют страницы различных веб-сайтов с продуктами и каждый день хранят цены на продукты и т. Д. Возможности приложений безграничны.

Сканирование - это не то же самое, что сканирование!

Прежде чем понять, как создать веб-сканер, проверьте разницу между поисковым роботом и парсером. Сканирование Интернета - это то, чем занимаются поисковые системы: они просматривают Интернет, ищут любую информацию, нажимают на каждую доступную ссылку. Основное назначение парсера - извлечение данных с веб-страниц. Теперь, когда вы знаете разницу, давайте посмотрим, как создать эффективный поисковый робот.

Дизайн веб-краулера

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

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

Созданные компоненты:

  1. CrawlerMain: основной метод запуска программы.
  2. CrawlerBO (бизнес-объект): содержит бизнес-логику для поискового робота. Управляет вызовами между другими компонентами.
  3. WebpageReader: принимает URL-адрес веб-страницы в качестве входных данных, соединяет и извлекает контент.
  4. WebsiteConnector: содержит логику для создания http-соединения и возвращает соединение с веб-сайтом для извлечения контента.
  5. LinksExtractor: принимает веб-сайт в качестве входных данных, содержит логику для извлечения гиперссылок с веб-сайта.

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

В этом веб-сканере, поскольку он извлекает ссылки с веб-сайта, я хочу также сканировать эти ссылки. Чтобы выполнить это эффективно, нам нужно сделать программу параллельной. Затем я могу увеличить количество потоков для параллельного обхода извлеченных ссылок. Для этого мы добавим 3 канала -

  1. Канал сайтов: содержит URL-адреса веб-сайтов для сканирования.
  2. Канал CrawledLinks: содержит ссылки, найденные на просканированном веб-сайте.
  3. Канал PendingNumSites: содержит количество ожидающих сканирования сайтов.

Нам нужен CrawledLinksChannel, чтобы мы могли отфильтровать повторяющиеся ссылки перед отправкой на сканирование. Таким образом, он не будет зацикливаться. Мы будем поддерживать карту в памяти для хранения списка просканированных веб-сайтов и фильтрации дубликатов. Чтобы сделать его готовым к работе, используйте распределенную базу данных вместо карты в памяти.

Канал PendingNumSites помогает понять, есть ли еще сайты для сканирования. Когда ссылка добавляется в SitesChannel, она добавляет +1 к PendingNumSites, а при сканировании добавляет -1. Мы настроим монитор для поддержания текущего счета, и когда счет достигнет 0, он закроет все каналы, чтобы завершить программу.

Добавив все эти компоненты, дизайн будет выглядеть так:

Реализация поискового робота

Использование горутин, каналов и групп ожидания

WebCrawlerMain создает все необходимые компоненты для поискового робота и запускает сканирование, добавляя сайты для сканирования. Здесь я создаю 50 горутин для сканирования веб-сайтов. WaitGroups позволяет основной программе ждать, пока все потоки не завершат выполнение. Как описано выше, он создает 3 канала и добавляет один сайт к sitesChannel.

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

WebpageReader подключается к веб-сайту, извлекает ссылки и добавляет в канал.

Фильтрация повторяющихся веб-сайтов

Это важный шаг, который не позволяет программе зайти в бесконечный цикл.

По мере того как CrawlerBO читает из sitesChannel, добавление сайта в него отправит его для сканирования.

Закрытие каналов

После успешного сканирования всех веб-сайтов он должен закрыть все каналы.

Вы можете найти полную реализацию кода здесь.

Вывод

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