Google News агрегирует заголовки тысяч издателей в единый постоянно обновляемый поток, что делает его привлекательным источником для тех, кто отслеживает тему, наблюдает за распространением новости или формирует набор данных о том, кто и когда что сообщал. Загвоздка в том, что страница создана для браузеров, а не для скриптов: она рендерится на стороне клиента и отражает автоматизированный трафик, поэтому обычный HTTP-запрос возвращает почти пустую оболочку вместо нужных заголовков.
Это руководство показывает, как парсить Google News с помощью JavaScript. Вы создадите небольшой рабочий Node-скрипт, который получает готовую страницу через Crawlbase Smart AI Proxy, затем разбирает заголовки, издателей, время публикации и авторов с помощью Cheerio и записывает их в JSON. Всё руководство ограничено публичными результатами, видимыми без авторизации, а раздел о законности в конце стоит прочитать перед тем, как применять это на реальных объёмах.
Зачем парсить Google News
Один визит на Google News показывает, как выглядит лента в конкретный момент. Ценность парсинга состоит в том, чтобы превратить этот движущийся поток в структурированные строки, которые можно хранить, запрашивать и сравнивать со временем. Несколько конкретных применений:
- Отслеживание трендов и тем. Наблюдайте, какие материалы появляются по запросу и как освещение меняется в течение дня, это полезно для исследований, журналистики и SEO-планирования.
- Мониторинг конкурентов и брендов. Собирайте упоминания компании, продукта или руководителя из множества изданий за один проход вместо ручной проверки каждого сайта.
- Рыночные и финансовые сигналы. Агрегируйте заголовки по сектору или тикеру для дашборда или модели.
- Курирование контента. Подтягивайте актуальные заголовки в рассылку или внутреннюю ленту без ручного мониторинга источников.
В каждом случае результат имеет одинаковую форму: строки с заголовком, источником, меткой времени, ссылкой и автором, с которыми можно что-то полезное делать. Именно эти данные и производит данный скрейпер.
Какие данные можно извлечь
Прежде чем писать селектор, полезно знать, какие поля присутствуют на странице результатов Google News и стоят внимания. Каждая карточка статьи в ленте содержит предсказуемый набор значений:
- Заголовок. Название статьи в том виде, в каком оно отображается в ленте.
- Издатель. Источник, опубликовавший материал (CNN, The Hill и т. д.).
- Время публикации. Относительная метка, например «21 минуту назад» или «9 часов назад».
- Автор. Подпись к статье, когда она указана; у многих карточек её нет, поэтому ожидайте пустых значений.
- Ссылка на статью. href заголовка, ведущий на страницу публикации.
Этот набор покрывает большинство задач мониторинга и исследований. В коде ниже мы извлечём заголовок, издателя, время и автора; добавить ссылку можно одной строкой, как только карточка окажется в руках.
Почему обычный запрос здесь не работает
Запросите URL Google News с помощью обычного HTTP-клиента, и вы получите ответ 200, тело которого представляет собой почти пустой каркас. Работают против вас два фактора. Во-первых, лента рендерится в браузере: исходный HTML является оболочкой, которая заполняется только после выполнения JavaScript страницы. Во-вторых, Google быстро выявляет автоматизированный трафик, поэтому IP-адреса датацентров и небраузерные паттерны запросов подвергаются ограничению или вызовам прежде, чем добираются до отрендеренного контента.
Таким образом, рабочий скрейпер Google News нуждается одновременно в двух вещах: в чём-то, что рендерит страницу как настоящий браузер, и в IP-адресе, воспринимаемом платформой как реальный посетитель. Можно собрать это самостоятельно с помощью headless-браузера и пула ротирующихся IP-адресов, однако создание и поддержка такого стека требует большей части усилий. Crawlbase Smart AI Proxy объединяет оба компонента в единую точку входа: направьте на него обычный HTTP-клиент, и он маршрутизирует запрос через ротирующиеся жилые и датацентровые IP-адреса, возвращая готовую для парсинга страницу.
Smart AI Proxy является прокси-эндпоинтом для прямой замены: вы продолжаете использовать существующий HTTP-клиент и меняете только точку подключения. Под капотом он перенаправляет запросы на Crawling API, поэтому вы получаете те же возможности рендеринга и ротации IP. Если предпочитаете вызывать API напрямую и явно передавать такие параметры, как рендеринг JavaScript, используйте Crawling API; это руководство идёт по пути прокси, поскольку это наименьшее изменение обычного запроса.
Предварительные требования
Перед написанием кода вам понадобятся три вещи:
-
Установленный Node.js. Node запускает JavaScript вне браузера и предоставляет npm для установки библиотек. Проверьте его наличие командой
node --version. - Базовые знания JavaScript. Для понимания материала достаточно уверенного владения переменными, функциями и асинхронными вызовами.
- Токен Crawlbase. Зарегистрируйте бесплатный аккаунт, откройте дашборд Smart AI Proxy и скопируйте токен доступа из деталей подключения. Этот токен выполняет роль имени пользователя прокси и передаётся непосредственно в запросе.
Настройка проекта
Создайте папку проекта, инициализируйте её и установите две библиотеки, необходимые скрейперу.
node --version mkdir google-news-scraper && cd google-news-scraper npm init -y npm install axios cheerio
Два зависимых пакета выполняют всю работу: axios выполняет HTTP-запрос и легко настраивается для работы через прокси, а cheerio разбирает полученный HTML с помощью jQuery-подобного API на сервере. Встроенные модули Node https и fs обеспечивают прокси-агент и запись файлов, поэтому больше ничего устанавливать не нужно.
Получение отрендеренной страницы через Smart AI Proxy
Первая задача состоит в получении готового HTML. Вы настраиваете HTTPS-агент, указывающий на хост и порт Smart AI Proxy, передаёте токен в качестве имени пользователя прокси и позволяете axios отправить запрос через него. Прокси рендерит страницу и возвращает реальную разметку вместо пустой оболочки, которую выдаёт прямой запрос. Замените YOUR_CRAWLBASE_TOKEN на токен из вашего дашборда.
const axios = require('axios') const https = require('https') const fs = require('fs') const token = 'YOUR_CRAWLBASE_TOKEN' const url = 'https://news.google.com/home?hl=en-US&gl=US&ceid=US%3Aen' const agent = new https.Agent({ proxy: { host: 'smartproxy.crawlbase.com', port: 8012, auth: { username: token }, }, rejectUnauthorized: false, }) async function fetchGoogleNews(target) { const response = await axios.get(target, { httpsAgent: agent }) fs.writeFileSync('response.html', response.data) console.log('Status:', response.status, '- saved response.html') return response.data } fetchGoogleNews(url).catch((err) => console.error('Fetch failed:', err.message))
Здесь несколько деталей играют важную роль. Агент направляет каждый запрос через smartproxy.crawlbase.com на порт 8012, ваш токен передаётся как имя пользователя прокси, а rejectUnauthorized: false позволяет прокси завершать TLS без ошибки несоответствия сертификата. Сохранение тела в response.html означает, что можно один раз получить страницу и затем итеративно работать с селекторами по локальному файлу, не тратя запрос на каждое изменение.
Запустите скрипт командой node scraper.js. Вы должны увидеть статус 200 и response.html, содержащий реальную разметку статей, а не пустой каркас. Это подтверждает, что рендеринг и маршрутизация работают ещё до написания единого селектора.
Google News требует отрендеренную страницу с доверенного IP-адреса, и Smart AI Proxy предоставляет и то и другое без изменения способа выполнения запросов в вашем коде. Направьте существующий HTTP-клиент на эндпоинт прокси, и он будет ротировать жилые и датацентровые IP-адреса, рендерить страницу и возвращать готовый HTML, избавляя вас от необходимости запускать headless-флот и пул прокси самостоятельно. Начните с бесплатного уровня на публичной ленте.
Парсинг результатов с помощью Cheerio
Имея сохранённый HTML, загрузите его в Cheerio и пройдитесь по карточкам статей. Каждая карточка содержит нужные поля, поэтому задача состоит в том, чтобы сопоставить заголовок, издателя, время и автора с правильным селектором внутри карточки. Проверьте актуальные названия классов в инструментах разработчика браузера на живой странице результатов, а затем подключите их.
const fs = require('fs') const cheerio = require('cheerio') function parseArticle(card) { return { headline: card.find('a.gPFEn').text().trim(), publisher: card.find('.vr1PYe').text().trim(), time: card.find('time.hvbAAd').text().trim(), author: card.find('.bInasb span[aria-hidden="true"]').text().trim(), } } function extractArticles(html) { const $ = cheerio.load(html) const articles = [] $('article.UwIKyb').each((i, el) => { articles.push(parseArticle($(el))) }) return articles }
Шаблон прост: выбираем все карточки article, затем для каждой извлекаем ссылку-заголовок, метку издателя, элемент <time> и span с именем автора. Вызов .trim() на каждом результате убирает лишние пробелы, оставляемые разметкой Google. Чтобы также получить ссылку, прочитайте href заголовка с помощью card.find('a.gPFEn').attr('href') внутри parseArticle.
Имена классов Google (короткие хешированные строки типа gPFEn и UwIKyb) изменяются без предупреждения. Воспринимайте приведённые выше селекторы как отправную точку, а не как контракт. Когда какое-то поле начинает возвращать пустые строки, повторно проверьте живую страницу в инструментах разработчика браузера и обновите селектор. Это обычное обслуживание любого продакшен-скрейпера, а не признак неисправности.
Полный скрейпер
Ниже приведены функции получения и парсинга, объединённые в один рабочий файл. Он запрашивает страницу через Smart AI Proxy, сохраняет HTML, разбирает карточки и выводит структурированные результаты. Подставьте свой токен и запустите.
const axios = require('axios') const https = require('https') const fs = require('fs') const cheerio = require('cheerio') const token = 'YOUR_CRAWLBASE_TOKEN' const url = 'https://news.google.com/home?hl=en-US&gl=US&ceid=US%3Aen' const agent = new https.Agent({ proxy: { host: 'smartproxy.crawlbase.com', port: 8012, auth: { username: token }, }, rejectUnauthorized: false, }) async function fetchGoogleNews(target) { const response = await axios.get(target, { httpsAgent: agent }) fs.writeFileSync('response.html', response.data) return response.data } function parseArticle(card) { return { headline: card.find('a.gPFEn').text().trim(), publisher: card.find('.vr1PYe').text().trim(), time: card.find('time.hvbAAd').text().trim(), author: card.find('.bInasb span[aria-hidden="true"]').text().trim(), } } function extractArticles(html) { const $ = cheerio.load(html) const articles = [] $('article.UwIKyb').each((i, el) => articles.push(parseArticle($(el)))) return articles } async function main() { const html = await fetchGoogleNews(url) const articles = extractArticles(html) fs.writeFileSync('articles.json', JSON.stringify(articles, null, 2)) console.log(articles) } main().catch((err) => console.error('Scrape failed:', err.message))
Как выглядит результат
Запустите полный скрипт и получите массив структурированных объектов статей, записанных в articles.json и выведенных в консоль. Сокращённый пример:
[ { "headline": "Morning Report: Biden, Trump duel over border during separate Texas stops", "publisher": "The Hill", "time": "21 minutes ago", "author": "Alexis Simendinger & Kristina Karisch" }, { "headline": "Takeaways from the dueling border visits", "publisher": "CNN", "time": "9 hours ago", "author": "" }, { "headline": "Funeral draws crowds to Moscow church despite tight security", "publisher": "CBS News", "time": "5 minutes ago", "author": "Haley Ott" } ]
Обратите внимание на пустого автора у второй карточки. Многие записи в Google News не содержат подписи, поэтому пустые значения нормальны, это не ошибка парсинга. Фильтруйте или устанавливайте значения по умолчанию для таких полей downstream, исходя из потребностей вашей задачи.
Оставаться незаблокированным
Даже при обработке рендеринга и ротации Google отслеживает трафик, похожий на скрейперский. Несколько привычек помогают поддерживать работоспособность запуска, и они применимы к любой сложной цели.
- Задавайте темп запросов. Непрерывное обращение к одной ленте в жёстком цикле, это самый быстрый способ получить ограничение. Распределяйте запросы во времени и варьируйте запрос или тему.
- Опирайтесь на ротацию. Распределение запросов по множеству реальных пользовательских IP-адресов, это то, что не позволяет одному адресу превысить лимит скорости. Smart AI Proxy делает это за вас; если вы используете собственный стек, взвесьте датацентровые и жилые прокси и правильно настройте ротацию.
- Читайте коды статусов. Если запуск начинает возвращать вызовы или ошибки, это означает, что текущий темп слишком высок. Снижайте нагрузку, а не продавливайте сквозь неё.
Более широкое руководство по стратегии см. в статье как парсить сайты без блокировки. Если вы парсите новости в масштабе по множеству тем, в статье о крупномасштабном веб-скрейпинге рассматривается сторона оркестрации, а материал о создании инструмента поисковой системы показывает, что можно собрать, имея стабильный поток структурированных результатов.
Законно ли парсить Google News?
Допустимость парсинга Google News зависит от условий использования Google, вашей юрисдикции и того, что вы делаете с данными, поэтому воспринимайте это как информацию к сведению, а не как юридическую консультацию. Google News является агрегатором: заголовки и фрагменты ссылаются на контент, принадлежащий отдельным издателям, а условия использования Google накладывают ограничения на автоматизированный доступ. Ни один из приведённых здесь примеров кода этого не меняет. Технически всё работает, но легальный аспект остаётся на вашей ответственности.
Несколько правил, которых стоит придерживаться. Собирайте только публичные результаты: заголовки, источники, метки времени и ссылки, видимые без авторизации. Проверяйте robots.txt Google и соблюдайте заявленные ожидания по частоте запросов, поддерживая объём запросов достаточно низким, чтобы не перегружать серверы. Не воспроизводите и не распространяйте полный текст статей, принадлежащий оригинальным издателям и обычно защищённый авторским правом. И никогда не собирайте персональные или приватные данные.
Это руководство намеренно ограничено данными публичной ленты, поскольку именно здесь проходит граница, позволяющая сохранять обоснованную позицию. Оно не касается ничего за логином, данных аккаунта или профиля, персонализированных лент, привязанных к идентифицируемому пользователю, или любых попыток обойти аутентификацию. Если вашему проекту нужно больше, чем публичные заголовки, правильный путь состоит в заключении официального соглашения о данных или использовании лицензированного новостного API, а не в разработке более умного скрейпера.
Ключевые выводы
- Google News рендерится на стороне клиента. Обычный запрос возвращает почти пустую оболочку, поэтому страницу необходимо отрендерить перед парсингом.
- Smart AI Proxy обеспечивает рендеринг и доверенный IP. Направьте существующий HTTP-клиент на эндпоинт прокси, передав токен в качестве имени пользователя, и он ротирует IP-адреса и рендерит страницу за один шаг.
- Cheerio выполняет извлечение данных. Сопоставьте заголовок, издателя, время и автора с актуальными селекторами, учитывая, что эти селекторы будут меняться со временем.
- Пустые поля нормальны. У многих карточек нет автора, поэтому обрабатывайте пустые строки, а не считайте их ошибками.
- Оставайтесь в рамках публичных данных. Соблюдайте условия использования Google и robots.txt; не собирайте полный текст статей, персональные данные или ленты за логином.
Часто задаваемые вопросы
Почему обычный запрос не возвращает заголовки из Google News?
Потому что Google News рендерит свою ленту на стороне клиента с помощью JavaScript. Исходный HTML является оболочкой, которая заполняется только после выполнения скриптов страницы в браузере, поэтому обычный HTTP-запрос возвращает статус 200 с пустыми полями статей. Для получения реальных данных необходимо сначала отрендерить страницу, чем и занимается маршрутизация через Smart AI Proxy.
Что такое Crawlbase Smart AI Proxy?
Smart AI Proxy является прокси-эндпоинтом для прямой замены, ротирующим большой пул жилых и датацентровых IP-адресов и рендерящим страницы в фоновом режиме. Вы продолжаете использовать обычный HTTP-клиент и меняете только точку подключения, передавая токен доступа в качестве имени пользователя прокси. Под капотом он перенаправляет запросы на Crawling API, поэтому вы получаете рендеринг и ротацию IP без необходимости управлять ими самостоятельно.
Что использовать для Google News: Smart AI Proxy или Crawling API?
Оба варианта обращаются к одному движку, поэтому выбирайте по стилю интеграции. Smart AI Proxy требует минимальных изменений в существующем коде: задайте хост, порт и токен прокси, и ваш текущий запрос заработает. Crawling API, это прямой вызов API, где вы явно передаёте параметры, например рендеринг JavaScript и время ожидания, что удобнее при необходимости точного управления. В этом руководстве используется прокси, поскольку он почти не требует изменений обычного запроса axios.
Почему некоторые поля автора в результате пустые?
Многие карточки Google News просто не содержат подписи, поэтому для таких записей селектор автора возвращает пустую строку. Это ожидаемое поведение, а не ошибка парсинга. Обрабатывайте это downstream, фильтруя такие строки, задавая значение по умолчанию или оставляя поле пустым, исходя из потребностей задачи.
Мои селекторы Cheerio возвращают пустые строки. Что изменилось?
Почти наверняка изменилась разметка Google. Хешированные имена классов типа gPFEn и UwIKyb изменяются без предупреждения, поэтому работавшие в прошлом месяце селекторы могут сломаться. Повторно проверьте живую страницу результатов в инструментах разработчика браузера и обновите селекторы. Периодическое обслуживание селекторов нормально для любого продакшен-скрейпера.
Можно ли использовать Smart AI Proxy для парсинга других сайтов помимо Google News?
Да. Smart AI Proxy является универсальным эндпоинтом, поэтому та же настройка работает для большинства публичных сайтов: измените целевой URL и настройте селекторы под новую страницу. Ротация IP-адресов и рендеринг помогают для широкого круга целей, что аналогично подходу, описанному в статье как парсить сайты без блокировки.
Обходите любой сайт в масштабе, без борьбы с инфраструктурой.
Crawlbase берёт на себя прокси, отпечатки и CAPTCHA, чтобы ваша команда выпускала конвейеры данных вместо поддержки обвязки краулинга. 1 000 запросов бесплатно, без карты.
