Агрегатор хорошо делает одно дело: он объединяет множество разрозненных источников в одном месте, которое читатель может просмотреть за один раз. Google News собирает заголовки из тысяч изданий, Indeed и Jooble объединяют вакансии со всего интернета, а сайты вроде Trivago выстраивают предложения от десятков провайдеров в ряд. Каждый из них берёт информацию, для получения которой иначе пришлось бы открыть двадцать вкладок, и представляет её в виде одного организованного потока.
В этом руководстве объясняется, как создаются такие сайты, от начала до конца. Вы узнаете, что такое агрегатор на самом деле, как выбрать нишу и надёжные источники, как собирать данные с помощью краулера или API, как нормализовать и дедуплицировать их, чтобы записи с разных сайтов совпадали, как хранить и обновлять их по расписанию, как представлять результат и как делать всё это ответственно. В итоге вы сможете набросать архитектуру собственного агрегатора новостей, вакансий, товаров, недвижимости или акций.
Что такое агрегатор?
Агрегатор, это сайт, который собирает контент или объявления из множества внешних источников и отображает их вместе под одной крышей, организованные по теме, категории или фильтру. Агрегатор обычно не владеет исходным контентом. Он собирает, структурирует и ссылается на него, добавляя ценность через охват, организацию, поиск и актуальность, а не через оригинальные материалы.
Такой паттерн встречается во многих нишах. Агрегаторы новостей (Google News, Feedly, Flipboard, Apple News) собирают статьи по темам. Агрегаторы вакансий (Indeed, Jooble) объединяют объявления со страниц карьеры компаний и других досок. Агрегаторы товаров и акций (Groupon для ограниченных по времени предложений, BoardGameOracle для розничных цен, сайты сравнения цен в целом) выстраивают один и тот же товар из множества магазинов. Порталы недвижимости собирают объявления о собственности, а туристические сайты вроде Tripadvisor начинали как агрегаторы тарифов, прежде чем расшириться. Сообщества вроде Reddit являются агрегаторами социального типа, продвигающими ссылки, которые толпа считает достойными прочтения.
Причина, по которой бизнес и читатели ценят такие сайты, проста: они заменяют груду отдельных инструментов и вкладок одним всесторонним обзором. Этот единый вид позволяет легче замечать тенденции, сравнивать варианты и быть в курсе темы, не посещая вручную каждый первоисточник. Та же выгода объясняет, почему компании создают внутренние агрегаторы для наблюдения за конкурентами, ценами и рыночными сигналами, этот сценарий мы рассматриваем в статье о генерации лидов с помощью веб-краулинга.
Выбор ниши и источников
Прежде чем писать код, определите, что охватывает ваш агрегатор и откуда берутся данные. Узкая ниша почти всегда выигрывает у широкой. «Вакансии удалённых дата-инженеров», «цены на настольные игры в Великобритании» или «объявления аренды в одном мегаполисе» дают вам чёткий набор источников, чёткую аудиторию и весомый повод существовать рядом с гигантами. Попытка агрегировать «все новости» или «каждый товар» с первого дня ставит вас лицом к лицу с Google.
Определив нишу, составьте список источников. Для каждого кандидата отдавайте предпочтение в следующем порядке: официальный API, затем RSS или Atom-лента, затем опубликованный экспорт данных, и только потом скрапинг страниц. Многие новостные издания публикуют RSS, доски объявлений и маркетплейсы часто предоставляют API или партнёрские ленты, а данные о недвижимости нередко доступны через лицензированные MLS-ленты. Выбор лент и API прежде всего, это не только более простое обслуживание; это наиболее надёжный и уважительный путь, который позволяет оставаться в правовом поле большинства условий использования. Оставляйте скрапинг для источников, которые действительно не предлагают структурированного доступа, и даже тогда собирайте только публичные поля листинга, которые вам нужны.
Каким бы ни был источник, проверяйте его на качество. Агрегатор наследует репутацию того, что он публикует, поэтому опора на авторитетные, хорошо поддерживаемые источники защищает вас от распространения устаревшей или ложной информации. Запишите для каждого источника, какие поля вы будете извлекать (для вакансии: название, компания, местоположение, диапазон зарплаты, ссылка; для объекта недвижимости: цена, спальни, ванные, площадь, местоположение, ссылка на объявление), чтобы последующий этап нормализации имел целевую форму для сопоставления.
Как строится агрегатор: этап за этапом
Под главной страницей каждый агрегатор представляет собой один короткий конвейер: сбор из каждого источника, нормализация результатов в единую форму, дедупликация, хранение, обновление по расписанию и представление. Этапы ниже проходят через каждый шаг в порядке его реализации.
Сбор данных с помощью краулера или API
Сбор, это этап, который регулярно получает данные из каждого источника. Для лент и API это вежливый плановый запрос, возвращающий структурированные записи, которые можно сразу разобрать. Для источников, существующих только как веб-страницы, нужен краулер, который получает HTML, и парсер, извлекающий целевые поля с помощью CSS-селекторов или XPath. Многие современные сайты с объявлениями (порталы недвижимости, доски вакансий, маркетплейсы) отрисовывают свой контент с помощью JavaScript, поэтому обычный HTTP-запрос возвращает пустую оболочку. Таким сайтам нужен краулер, выполняющий JavaScript, и именно здесь большинство самодельных агрегаторов начинают испытывать трудности.
В небольшом масштабе вы можете запускать это самостоятельно с помощью библиотеки вроде Requests и BeautifulSoup или headless-браузера. По мере добавления источников и увеличения частоты запуска накапливаются три проблемы: страницы, требующие настоящего браузера для отрисовки, IP-блокировки и ограничения частоты запросов, а также периодические CAPTCHA. Надёжное решение этих задач на многих сайтах, это постоянная инфраструктурная работа, не имеющая никакого отношения к вашему реальному продукту. Если вы выбираете между самостоятельной разработкой и готовым решением, наши заметки о создании масштабируемого конвейера веб-данных подробнее рассматривают, куда уходят усилия.
Слой сбора данных агрегатора должен отрисовывать JavaScript-страницы, ротировать IP-адреса и преодолевать блокировки для каждого добавляемого источника, именно такая сантехника стопорит эти проекты. Crawlbase Crawling API обрабатывает рендеринг, ротацию прокси и решение CAPTCHA на стороне сервера и возвращает чистые страницы, а асинхронный Crawler ставит в очередь большие задания, чтобы вы могли обновлять множество источников в масштабе. Начните с лимита до 20 000 бесплатных запросов без кредитной карты и платите только за успешные запросы.
Нормализация данных в единую форму
Каждый источник описывает одно и то же по-разному. Одна доска вакансий называет поле job_title, другая, position; один сайт недвижимости указывает цену как "$450,000", другой как 450000; даты приходят в дюжине форматов. Нормализация, это этап, который сопоставляет каждый источник с единой согласованной схемой, на которую может опираться ваш сайт. Вы заранее определяете единую форму записи, а затем пишете небольшое пер-источниковое отображение, которое переносит каждое поле в эту форму, разбирает числа и даты в настоящие типы и удаляет пробелы и посторонний код разметки.
Это также место для очистки. Удаляйте трекинг-параметры из ссылок, стандартизируйте названия мест, конвертируйте валюты при агрегировании из разных регионов и унифицируйте единицы, чтобы «3 bd» и «3 beds» стали одним значением. Результатом этого этапа является чистый, единообразный набор записей, выглядящих одинаково независимо от того, с какого сайта они пришли. Если ваш агрегатор в итоге будет обеспечивать поиск или рекомендации, именно эта согласованность делает это возможным; та же дисциплина лежит в основе любой хорошей архитектуры конвейера данных.
Дедупликация для однократного появления каждого элемента
Агрегаторы получают данные из пересекающихся источников, поэтому одна и та же вакансия, статья или объект недвижимости регулярно появляется более одного раза. Без дедупликации ваш поток выглядит раздутым и ненадёжным. Практический подход состоит в том, чтобы вычислить стабильный идентификатор для каждой записи и удалить или объединить повторы. Там, где источник даёт канонический URL или ID объявления, используйте его. Там, где нет, создайте отпечаток из полей, уникально идентифицирующих элемент, например нормализованное название плюс компания плюс местоположение для вакансии, или адрес плюс цена плюс количество спален для объекта недвижимости, и считайте совпадающие отпечатки одним элементом.
Когда два источника описывают один элемент, обычно лучше объединить, а не отбросить: сохраните более полную запись, отдайте предпочтение наиболее авторитетному источнику для канонической ссылки и отметьте, что элемент появился в нескольких местах. Сделать это хорошо, небольшая задача сопоставления данных, и именно правильное её решение отличает чистый агрегатор от шумного.
Хранение и обновление по расписанию
Нормализованные, дедуплицированные записи попадают в хранилище, как правило, в базу данных, из которой читает фронтенд. Здесь важны два архитектурных решения. Во-первых, сохраняйте стабильный идентификатор для каждого элемента, чтобы при повторном сборе данных из источника вы могли обновить существующую запись, а не вставить дубликат. Во-вторых, отслеживайте актуальность: сохраняйте время первого и последнего обнаружения каждого элемента, чтобы помечать объявления как новые, убирать их, когда они исчезают из источника, и не показывать закрытые вакансии или истёкшие акции.
Обновление выполняется по расписанию, соответствующему нише. Агрегатор последних новостей может опрашивать ленты каждые несколько минут; доска объявлений по недвижимости, несколько раз в день; еженедельный дайджест акций может запускаться ночью. Простой планировщик (задание cron, очередь или управляемый запускатель задач) запускает сбор данных из каждого источника, новые результаты проходят через нормализацию и дедупликацию, и хранилище обновляется. Это плановое обновление является пульсом всей системы: именно оно поддерживает актуальность агрегатора без ручного вмешательства.
Представление агрегированного потока
При наличии чистых данных в хранилище фронтенд относительно прост. Выберите платформу, соответствующую вашим навыкам и масштабу: CMS вроде WordPress с пользовательской лентой, конструктор сайтов или фреймворк под вашим управлением. Именно интерфейс определяет, будут ли люди возвращаться. Организуйте элементы в чёткие категории, дайте читателям фильтры и поиск, соответствующие нише (местоположение и зарплата для вакансий, цена и спальни для недвижимости, тема для новостей), и сделайте всё это быстрым на телефоне, так как значительная доля новостного и листингового трафика приходится на мобильные устройства.
Принципиально важно, чтобы каждый агрегированный элемент вёл обратно к исходному источнику. Эта ссылка одновременно является путём читателя к полному контенту и вашим атрибутированием издателю. Показывайте достаточно каждого элемента, чтобы быть полезным (заголовок, фрагмент, миниатюра, ключевые поля листинга), а затем направляйте клик дальше. Мобильное приложение или email-дайджест могут расширить охват, позволив пользователям подписываться на категории и получать оповещения о новых элементах, но сайт является основой. Один и тот же бэкенд сбора данных может питать все эти поверхности, поскольку все они читают из единого нормализованного хранилища.
Ответственная агрегация контента
Агрегатор существует за счёт чужого контента, поэтому обращаться с ним ответственно не факультативно: именно это делает сайт законным и жизнеспособным. Соблюдайте условия использования каждого источника и его robots.txt, и поддерживайте разумную частоту запросов, чтобы никогда не перегружать серверы, от которых зависите. Предпочитайте официальные ленты и API скрапингу везде, где источник их предоставляет, и потому что они надёжнее, и потому что это маршрут доступа, явно санкционированный издателем. Для лицензированных данных, таких как MLS-ленты по недвижимости или партнёрские API вакансий, используйте соответствующую программу, а не обходите её скрапингом.
Атрибуция, это главная этика агрегации. Всегда указывайте первоисточник по имени и ссылайтесь непосредственно на полный элемент, направляя читателей и трафик обратно к издателю, а не удерживая их. Не переиздавайте полные защищённые авторским правом статьи, фотографии или объявления; показывайте заголовок, короткий фрагмент и миниатюру, а затем давайте ссылку. Вот граница между легитимным агрегатором, который издатели терпят и даже приветствуют, и сайтом-копировщиком, просто дублирующим контент. Наконец, когда любое объявление затрагивает персональные данные, обрабатывайте их в соответствии с применимыми правилами конфиденциальности (GDPR, CCPA) и ограничивайтесь публичными, неличными полями объявления. При таком подходе агрегация, это давно признанная, законная практика; при небрежном подходе она влечёт удаление и худшие последствия.
Ключевые выводы
- Агрегатор превращает множество источников в один поток. Он собирает контент или объявления из внешних источников, организует их и ссылается на первоисточники, добавляя ценность через охват и актуальность, а не через оригинальный контент.
- Выбирайте узкую нишу и проверяйте источники. Сфокусированная тема выигрывает в конкуренции с гигантами, а качество источников определяет доверие ко всему сайту. Предпочитайте официальные API и ленты скрапингу.
- Разработка, это короткий конвейер. Соберите с помощью краулера или API, нормализуйте в одну схему, дедуплицируйте, сохраните и обновляйте по расписанию, прежде чем представить.
- Нормализация и дедупликация, это источник качества. Сопоставление каждого источника с единой формой и удаление повторов, вот что заставляет объявления с разных сайтов совпадать и выглядеть надёжно.
- Агрегируйте ответственно. Соблюдайте условия использования и robots.txt, предпочитайте официальные ленты, атрибутируйте и ссылайтесь на каждый источник и никогда не переиздавайте полный защищённый авторским правом контент.
Часто задаваемые вопросы
Что такое агрегатор простыми словами?
Это сайт, который собирает контент или объявления из множества внешних источников и отображает их вместе в одном организованном месте. Агрегаторы новостей объединяют заголовки, агрегаторы вакансий, объявления, а агрегаторы товаров или акций выстраивают один и тот же товар из множества магазинов. Агрегатор, как правило, не владеет контентом; он собирает, структурирует и ссылается на него.
Как агрегаторы получают свои данные?
Через слой сбора, который регулярно запрашивает каждый источник. Лучшие источники, это официальные API и RSS или Atom-ленты, возвращающие структурированные данные напрямую. Для источников, существующих только как веб-страницы, краулер получает HTML, а парсер извлекает целевые поля. Многие сайты с объявлениями используют JavaScript для рендеринга, поэтому им нужен краулер, запускающий настоящий браузер.
Что значит нормализовать и дедуплицировать агрегированные данные?
Нормализация сопоставляет каждый источник с единой согласованной формой записи, так что поле position на одном сайте и job_title на другом попадают в одно и то же место, с ценами и датами, разобранными в настоящие типы. Дедупликация удаляет повторы, которые появляются, когда пересекающиеся источники указывают один и тот же элемент, обычно путём сопоставления канонического ID или отпечатка, построенного из полей, уникально идентифицирующих элемент.
Как часто агрегатор должен обновлять свой контент?
Это зависит от ниши. Агрегатор последних новостей может опрашивать ленты каждые несколько минут, доска недвижимости, несколько раз в день, а еженедельный дайджест акций, ночью. Планировщик запускает сбор из каждого источника, результаты проходят через нормализацию и дедупликацию, и хранилище обновляется. Отслеживание времени первого и последнего обнаружения каждого элемента позволяет помечать новые элементы и убирать исчезнувшие.
Законно ли создавать агрегатор?
Агрегация, это давно признанная практика при ответственном подходе. Соблюдайте условия использования каждого источника и robots.txt, поддерживайте разумную частоту запросов, предпочитайте официальные ленты и API и используйте лицензированные программы для лицензированных данных, таких как MLS-ленты. Всегда атрибутируйте и ссылайтесь на первоисточник и никогда не переиздавайте полный защищённый авторским правом контент; показывайте заголовок, фрагмент и миниатюру, а затем давайте ссылку. Обрабатывайте любые персональные данные в соответствии с GDPR и CCPA.
Нужно ли мне писать собственный скрапер для начала?
Не обязательно. Вы можете создать собственные коллекторы, но в масштабе вам придётся обрабатывать рендеринг JavaScript, ротацию IP-адресов и CAPTCHA для каждого источника, что является значительной постоянной работой. Scraping API вроде Crawlbase Crawling API управляет этой инфраструктурой и возвращает чистые страницы, поэтому вы можете сосредоточить время на том, какие источники агрегировать и как нормализовать и представлять их.
Обходите любой сайт в масштабе, без борьбы с инфраструктурой.
Crawlbase берёт на себя прокси, отпечатки и CAPTCHA, чтобы ваша команда выпускала конвейеры данных вместо поддержки обвязки краулинга. 1 000 запросов бесплатно, без карты.
