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

В этом руководстве показано, как парсить данные Forbes с помощью JavaScript и Node.js, используя Cheerio. Вы создадите небольшой работающий скрипт, который получает публичную тематическую или разделовую страницу Forbes через Crawling API, разбирает заголовок, авторскую подпись, ссылку на статью, дату публикации и раздел для каждой истории, обрабатывает разбивку на страницы и экспортирует результат в JSON и CSV. Всё руководство ограничено публичными метаданными листинга: только заголовками и ссылками, без полного текста статей или медиаконтента. Раздел о законности в конце не является формальностью, поскольку контент Forbes защищён авторским правом, поэтому прочитайте его перед реальным использованием.

Что вы создадите

Скрипт на Node.js, который принимает публичный URL раздела или темы Forbes, получает отрендеренный HTML через Crawling API и извлекает структурированную запись для каждой карточки статьи на странице листинга. В качестве примера используется раздел технологий, из которого извлекаются следующие поля:

  • Заголовок название статьи на карточке листинга.
  • Автор подпись автора, участника или штатного журналиста, указанного на карточке.
  • Ссылка публичный URL отдельной статьи.
  • Дата публикации дата или относительное время, указанное в листинге для истории.
  • Раздел тема или канал, которому принадлежит листинг, например технологии или бизнес.

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

Почему обычный запрос не работает на Forbes

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

Поэтому работающий парсер Forbes требует двух вещей в одном запросе: браузера, который реально рендерит страницу, и IP-адреса, который сайт воспринимает как реального пользователя. Можно собрать это самостоятельно, используя headless-браузер и пул ротируемых резидентских прокси, но поддерживать всё это в рабочем состоянии и есть основная часть работы. Crawling API объединяет оба требования в одном вызове: вы отправляете URL, API рендерит страницу за надёжным IP и возвращает готовый HTML для разбора с помощью Cheerio.

Используйте JavaScript-токен

Crawling API предоставляет два токена: обычный и JavaScript. Forbes требует рендеринга страницы в реальном браузере, поэтому для всех запросов в этом руководстве используйте свой JavaScript-токен. Обычный токен возвращает нерендеренную оболочку, и ваши селекторы вернут пустые результаты.

Предварительные требования

Перед написанием кода необходимо подготовить несколько вещей. Это не займёт много времени.

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

Node.js версии 16 или выше. Проверьте версию командой node --version. Если её нет, установите с сайта Node.js или через менеджер версий, например nvm.

Аккаунт Crawlbase и токен. Зарегистрируйтесь, откройте панель управления и скопируйте свой JavaScript-токен. Бесплатный тариф предоставляет до 20 000 бесплатных запросов без привязки карты, и вы платите только за успешные запросы. Обращайтесь с токеном как с паролем: он аутентифицирует ваши запросы, поэтому не добавляйте его в систему контроля версий.

Настройка проекта

Создайте папку проекта, инициализируйте её и установите две библиотеки, необходимые парсеру.

bash
node --version

mkdir forbes-scraper && cd forbes-scraper
npm init -y

npm install crawlbase cheerio

Две зависимости выполняют всю работу: crawlbase, официальный Node-клиент для Crawling API, а cheerio разбирает возвращаемый HTML с jQuery-подобным API, позволяя извлекать поля по CSS-селекторам. Создайте файл scraper.js в этой папке и добавьте код из шагов ниже.

Шаг 1: получение отрендеренной страницы листинга

Начните с получения готовой страницы. Импортируйте класс CrawlingAPI, инициализируйте его с вашим JavaScript-токеном и запросите публичный URL раздела Forbes. Forbes загружает карточки по мере прокрутки, поэтому передача ajax_wait и короткого page_wait сообщает API ждать динамического контента перед возвратом. Проверка статус-кода перед разбором позволяет явно обнаруживать ошибки.

javascript
const { CrawlingAPI } = require('crawlbase');

const api = new CrawlingAPI({ token: 'YOUR_CRAWLBASE_TOKEN' });

const forbesPageURL = 'https://www.forbes.com/technology/';

api
  .get(forbesPageURL, { ajax_wait: 'true', page_wait: '5000' })
  .then((response) => {
    if (response.statusCode === 200) {
      console.log(response.body.slice(0, 500));
    }
  })
  .catch((error) => console.error('API request error:', error));

Запустите скрипт командой node scraper.js, вы должны увидеть реальную разметку листинга Forbes в начале тела, а не пустую оболочку. Это подтверждает работу рендеринга перед написанием первого селектора. Crawling API использует предоставленный JavaScript-токен для рендеринга страницы в реальном браузере, а ajax_wait с page_wait дают время загрузке ленивых карточек, так что ссылки на статьи присутствуют в возвращаемом HTML.

Crawlbase Crawling API

Первый запрос только что вернул полностью отрендеренную страницу раздела Forbes без headless-браузера или прокси на вашей стороне. Crawling API запускает страницу в реальном браузере, ротирует резидентские IP на стороне сервера и обрабатывает лимиты и проверки, которые Forbes применяет к парсерам, так что из одного вызова вы получаете готовый HTML. Начните с публичного раздела на бесплатном тарифе, затем добавьте парсер.

Шаг 2: разбор каждой карточки статьи с помощью Cheerio

Получив отрендеренный HTML, загрузите его в Cheerio и обойдите карточки статей. Forbes размещает каждую историю в элементе потока, а ссылка на заголовок является тем же якором a.color-link, который сайт использует по всем своим листингам, поэтому выбираются все ссылки на статьи, а затем из каждой карточки считываются заголовок, авторская подпись, дата публикации и раздел. Защитное считывание каждого поля не позволяет одному отсутствующему значению прервать выполнение.

javascript
const cheerio = require('cheerio');

function parseForbesData(html, section) {
  const $ = cheerio.load(html);
  const articles = [];
  const seen = new Set();

  // One record per article card in the listing stream
  $('article.stream-item').each((_, element) => {
    const card = $(element);

    const titleLink = card.find('a.color-link').first();
    const headline = titleLink.text().trim();
    let link = titleLink.attr('href') || '';
    if (link && link.startsWith('/')) {
      link = new URL(link, 'https://www.forbes.com').href;
    }

    const author = card.find('.stream-item__author').text().trim();
    const date = card.find('.stream-item__date').text().trim();

    // Skip empty cards and de-duplicate repeated links
    if (!headline || !link || seen.has(link)) return;
    seen.add(link);

    articles.push({
      headline,
      author: author || 'N/A',
      date: date || 'N/A',
      section: section || 'N/A',
      link,
    });
  });

  return articles;
}

Несколько деталей обеспечивают точность соответствия странице. Каждая история находится в элементе article.stream-item, а ссылка на заголовок, это якорь a.color-link внутри него, тот же класс ссылки, что используется в устаревших листингах Forbes. Автор берётся из .stream-item__author, дата публикации, из .stream-item__date. Ссылка считывается из атрибута href якоря и разворачивается в абсолютный URL, чтобы работать вне страницы, а Set удаляет дублирующиеся ссылки, которые поток листинга нередко повторяет. Раздел передаётся от вызывающего кода, поскольку вы уже знаете, URL какого канала запросили.

Селекторы меняются

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

Шаг 3: сборка полного скрипта с экспортом в JSON и CSV

Теперь объедините получение данных и их разбор в один работающий скрипт, затем запишите записи на диск как в JSON, так и в CSV.

javascript
const fs = require('fs');
const { CrawlingAPI } = require('crawlbase');
const cheerio = require('cheerio');

const api = new CrawlingAPI({ token: 'YOUR_CRAWLBASE_TOKEN' });

async function crawl(pageUrl) {
  const response = await api.get(pageUrl, { ajax_wait: 'true', page_wait: '5000' });
  if (response.statusCode === 200) return response.body;
  console.error(`Request failed: ${response.statusCode}`);
  return null;
}

function toCsv(rows) {
  const headers = ['headline', 'author', 'date', 'section', 'link'];
  const escape = (value) => `"${String(value).replace(/"/g, '""')}"`;
  const lines = [headers.join(',')];
  for (const row of rows) {
    lines.push(headers.map((h) => escape(row[h])).join(','));
  }
  return lines.join('\n');
}

async function main() {
  const section = 'technology';
  const url = `https://www.forbes.com/${section}/`;
  const html = await crawl(url);
  if (!html) return;

  const articles = parseForbesData(html, section);
  fs.writeFileSync('forbes.json', JSON.stringify(articles, null, 2));
  fs.writeFileSync('forbes.csv', toCsv(articles));
  console.log(`Saved ${articles.length} articles to JSON and CSV`);
}

main();

Вставьте функцию parseForbesData из шага 2 в тот же файл, чтобы main могла её вызвать. Запустите командой node scraper.js и получите два файла: forbes.json с полными структурированными записями и forbes.csv, готовый для открытия в таблице. Вспомогательная функция toCsv заключает каждое поле в кавычки и удваивает встроенные кавычки, что важно здесь, поскольку заголовки часто содержат запятые.

Как выглядит результат

Файл JSON содержит по одному объекту на статью: заголовок, авторскую подпись, дату публикации, раздел и ссылку. Приведённые значения являются иллюстративными заполнителями, а не реальными данными Forbes.

json
[
  {
    "headline": "How AI Startups Are Reshaping Enterprise Software",
    "author": "Jane Doe",
    "date": "Jun 10, 2026",
    "section": "technology",
    "link": "https://www.forbes.com/sites/example/2026/06/10/ai-startups-enterprise/"
  },
  {
    "headline": "The Quiet Rise Of Mid-Market Cloud Providers",
    "author": "John Smith",
    "date": "Jun 9, 2026",
    "section": "technology",
    "link": "https://www.forbes.com/sites/example/2026/06/09/mid-market-cloud/"
  }
]

CSV содержит те же строки с заголовком, поэтому его можно открыть в Excel, Google Sheets или любом конвейере данных, поддерживающем файлы с разделителями.

csv
headline,author,date,section,link
"How AI Startups Are Reshaping Enterprise Software","Jane Doe","Jun 10, 2026","technology","https://www.forbes.com/sites/example/2026/06/10/ai-startups-enterprise/"
"The Quiet Rise Of Mid-Market Cloud Providers","John Smith","Jun 9, 2026","technology","https://www.forbes.com/sites/example/2026/06/09/mid-market-cloud/"

Обработка разбивки на страницы

Одна страница раздела, это демонстрация; реальная задача получает больше, чем первый пакет заголовков. Страницы разделов Forbes открывают дополнительные результаты через параметр запроса page, поэтому можно перебирать номера страниц, получать каждую через Crawling API, разбирать той же функцией и останавливаться, когда страница не возвращает новых статей. Поскольку все страницы листинга имеют одинаковую структуру карточек, написанный парсер работает на всех без изменений.

javascript
async function scrapeAllPages(section, maxPages) {
  const all = [];
  const seen = new Set();

  for (let page = 1; page <= maxPages; page++) {
    const url = `https://www.forbes.com/${section}/?page=${page}`;
    const html = await crawl(url);
    if (!html) break;

    const batch = parseForbesData(html, section)
      .filter((a) => !seen.has(a.link));
    if (batch.length === 0) break; // no new articles

    batch.forEach((a) => seen.add(a.link));
    all.push(...batch);
    console.log(`Page ${page}: ${batch.length} new articles`);

    // Pace requests so you stay under the rate limit
    await new Promise((r) => setTimeout(r, 2000));
  }

  return all;
}

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

Как оставаться незаблокированным

Даже при наличии рендеринга Forbes отслеживает трафик, характерный для парсеров. Несколько привычек помогут поддерживать работоспособность, и они применимы к любой сложной коммерческой цели.

  • Соблюдайте темп запросов. Вводите паузу между загрузками страниц, а не обходите раздел в плотном цикле. Распределение запросов, главный фактор соблюдения лимитов Forbes.
  • Используйте ротацию. Пул резидентских IP распределяет запросы по множеству адресов реальных пользователей, чтобы ни один из них не превысил лимит или не получил проверку. Crawling API делает это за вас; если вы строите собственный стек, это ключевой компонент.
  • Следите за статус-кодами. Если сессия начинает возвращать проверки или ответы не со статусом 200, это сигнал о том, что текущая частота запросов или IP-уровень уже недостаточны. Воспринимайте это как повод снизить активность, а не как шум.

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

Законно ли парсить Forbes?

Допустимость парсинга Forbes зависит от условий использования Forbes, вашей юрисдикции и того, что вы делаете с данными. Условия Forbes ограничивают автоматический доступ и повторное использование контента, поэтому парсинг может нарушать их независимо от тщательности вашего инструментария. Код в этом руководстве этого не меняет; он лишь делает техническую часть рабочей. Прочитайте Условия использования Forbes и его robots.txt, соблюдайте все заявленные ограничения скорости и воспринимайте оба документа как границы того, что вы можете собирать. Никогда не парсите ничего за логином или платным доступом: статьи за paywall и только для подписчиков находятся вне зоны доступа, а обход средств контроля доступа к ним, это отдельная и более серьёзная граница.

Данное руководство намеренно ограничено публичными метаданными листинга: заголовком, авторской подписью, публичной ссылкой на статью, датой публикации и разделом, которые любой может видеть на странице раздела без аккаунта. Принципиально важно, что оно не собирает тело статьи, фотографии, графики или видео. Статьи и медиаконтент Forbes являются объектами авторского права, и копирование или republication полного текста или медиа является нарушением авторских прав, а не добросовестным парсингом. Сбор заголовков и ссылок для индексирования, мониторинга или отсылки к оригиналу принципиально отличается от воспроизведения самого контента. Храните только факты и указатели, давайте ссылки на источник и не представляйте редакционные материалы Forbes как свои или не прячьте их за своим барьером.

Если вашему проекту нужно больше, чем публичные заголовки и ссылки, правильный путь, санкционированный, а не более изощрённый парсер. Forbes предлагает официальные ленты, лицензионные и синдикационные договорённости для повторного использования контента с чёткими условиями, правилами атрибуции и коммерческими правами. Это правильные инструменты, когда вам нужен полный текст, большие объёмы, гарантированная структура или право на republication. При сомнении в допустимости использования получите лицензию или соглашение о данных, а не считайте молчание согласием.

Итоги

Ключевые выводы

  • Forbes рендерит листинги на стороне клиента и защищает трафик. Обычный запрос возвращает пустую оболочку или проверку, поэтому необходим рендеринг страницы за надёжным IP с использованием JavaScript-токена перед разбором.
  • Crawling API делает оба в одном вызове. Рендерит страницу в реальном браузере, ротирует резидентские IP и ждёт ленивых карточек, возвращая готовый HTML для разбора с Cheerio.
  • Cheerio извлекает метаданные. Выбирайте все элементы article.stream-item, считывайте заголовок и ссылку из якоря a.color-link, а также автора, дату и раздел, и рассчитывайте на изменение имён классов.
  • Разбивка на страницы и экспорт. Перебирайте страницы разделов Forbes до отсутствия новых статей, дедуплицируйте по ссылке, соблюдайте темп и записывайте структурированные записи в JSON и CSV.
  • Оставайтесь в рамках публичных метаданных и соблюдайте авторские права. Собирайте только заголовки, ссылки, подписи и даты, но не тела статей или медиа, соблюдайте ToS, robots.txt и paywall, предпочитайте официальные ленты Forbes или лицензирование для повторного использования.

Часто задаваемые вопросы

Можно ли извлекать данные с Forbes?

Вы можете собирать публичные метаданные листинга, такие как заголовки, ссылки на статьи, подписи и даты публикации, если соблюдаете Условия использования Forbes и его robots.txt и не копируете полный текст статей или медиа. Ограничивайте сбор публичными страницами, никогда не трогайте ничего за логином или paywall, и предпочитайте официальные ленты Forbes или лицензионное соглашение для повторного использования контента. Это руководство остаётся в этих рамках, сохраняя только заголовки и ссылки, но не тела статей.

Почему обычный запрос возвращает неполные данные с Forbes?

Потому что Forbes загружает большую часть контента листинга на стороне клиента с помощью JavaScript и блокирует автоматический трафик. Сырой HTTP-запрос с IP датацентра обычно возвращает пустую оболочку или страницу блокировки, а не карточки статей. Для получения полной страницы необходим её рендеринг за надёжным IP, чем занимается Crawling API при использовании JavaScript-токена вместе с ajax_wait и page_wait.

Зачем использовать Crawling API вместо самостоятельного запуска Puppeteer?

Headless-браузер, такой как Puppeteer, может рендерить Forbes, но тогда придётся запускать и поддерживать парк браузеров, подключать пул ротируемых резидентских прокси и самостоятельно обрабатывать проверки, что составляет большую часть работы и медленно при больших объёмах. Crawling API объединяет рендеринг, ротацию IP и обработку проверок в одном вызове, так что вы отправляете URL и получаете готовый HTML. Вы тратите время на разбор данных, а не на поддержку инфраструктуры.

Мои селекторы возвращают пустые значения. Что изменилось?

Почти наверняка разметка Forbes. Имена классов, такие как stream-item__author, и якоря заголовков a.color-link, меняются со временем, поэтому работавшие ранее селекторы могут перестать работать. Проверьте живую страницу в инструментах разработчика браузера, обновите селекторы в parseForbesData, и всё снова заработает. Периодическое обновление селекторов нормально для любого производственного парсера.

Можно ли парсить полный текст статей Forbes?

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

Могу ли я попасть под блокировку при парсинге Forbes?

Да, если вы отправляете слишком много запросов слишком быстро с одного адреса. Crawling API снижает этот риск, ротируя резидентские IP и обрабатывая проверки, но вы всё равно должны соблюдать темп, добавлять паузы между страницами и следить за статус-кодами, чтобы снижать активность при появлении проверок. Эти привычки важны для любой сложной коммерческой цели.

Начать создавать

Обходите любой сайт в масштабе, без борьбы с инфраструктурой.

Crawlbase берёт на себя прокси, отпечатки и CAPTCHA, чтобы ваша команда выпускала конвейеры данных вместо поддержки обвязки краулинга. 1 000 запросов бесплатно, без карты.

Самообслуживание · Звонок отдела продаж не требуется · Доступны корпоративные объёмы краулинга