# Google News Scraper - Keywords, Topics, 20+ Countries (`bachiembmt/google-news-rss-scraper`) Actor

Google News scraper for keywords, topics and top stories in 20+ countries. Export headlines, publishers and dates as JSON/CSV, with optional real article URLs, full text, Bing News and only-new mode for alerts. For media monitoring, PR tracking and news datasets.

- **URL**: https://apify.com/bachiembmt/google-news-rss-scraper.md
- **Developed by:** [Ha Phan Thanh Hai](https://apify.com/bachiembmt) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 articles

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Google News Scraper

Scrape **Google News** by keyword, topic or top stories across 20+ countries and get headlines, publishers, dates and links as clean JSON/CSV for media monitoring and news datasets. No login, no API key.

### What does Google News Scraper do?

- Search with Google operators (`site:`, `"exact phrase"`, `intitle:`, `OR`) or use topic feeds (BUSINESS, TECHNOLOGY, SPORTS...).
- Fetch each query for several countries and languages in one run.
- Choose a time range from the last hour to any time; use `splitByDay` to go past ~100 results.
- Optionally resolve Google redirect links to the real publisher URL (`decodeUrls`).
- Optionally extract full article text, author and image (`extractContent`).
- Optionally add Bing News as a second engine; dedupe across queries, countries and engines.

### Why use it

- **Multi-country, multi-query** in one run.
- **Two engines** (Google and Bing) with an `engine` field.
- **Only-new mode** (`onlyNew`) for scheduled alerts without duplicates.
- **Low price**: $1.00 per 1,000 articles, platform usage included.
- **No login, no API key, no proxy.**

### Use cases

- Brand and PR monitoring with scheduled daily runs.
- Competitor and industry news alerts into Slack or email.
- Market research and trend analysis from headline streams.
- SEO and content ideas from what publishers cover.
- News datasets for LLM training, RAG and summarisation.

### How to use

1. Open the Actor on Apify and click **Try for free** (or call it through the API).
2. Add search **queries** and/or **topics**, pick **countries** and a **time range**.
3. Click **Start**, then download the dataset as JSON, CSV, Excel or HTML, or read it through the API.

#### Input example

```json
{
  "queries": ["artificial intelligence", "site:reuters.com oil"],
  "topics": ["TECHNOLOGY"],
  "countries": ["us", "vn"],
  "timeRange": "7d",
  "maxArticlesPerQuery": 100,
  "splitByDay": false,
  "decodeUrls": false,
  "dedupe": true
}
```

`maxArticlesPerQuery` applies per query and country. Default input finishes in well under a minute.

### Output example

```json
{
  "query": "artificial intelligence",
  "country": "vn",
  "title": "AI: Ai muốn mua?",
  "source": "Công an Nhân dân",
  "sourceUrl": "https://cand.vn",
  "publishedAt": "2026-10-21T02:04:07+00:00",
  "googleUrl": "https://news.google.com/rss/articles/CBMiWkFV...?oc=5",
  "articleUrl": "https://cand.vn/ai-ai-muon-mua-post825422.html",
  "snippet": null
}
```

`articleUrl` is filled only when `decodeUrls` is on (otherwise `null`). `snippet` is whatever extra text Google puts in the feed description; for most results it is empty (Google News does not publish article summaries).

### Decoding original URLs

Google News links (`news.google.com/rss/articles/...`) are redirects. With `decodeUrls` the Actor resolves each one through Google's own web endpoint (2 requests per article, throttled, about 1.5 s per article). Use it for a few hundred articles per run, not thousands. If Google changes the endpoint or throttles, `articleUrl` stays `null` and the `googleUrl` still works in a browser.

### Content extraction

Off by default. When on, Google results are decoded first (2 extra requests), then each article page is fetched (max 1 request/s per host, 20 s timeout). Expect about 55% of pages to yield text; paywalls, consent walls and JS-only pages return no content and are not charged the `content` event. A 40-article run takes about 1.5 minutes.

### Pricing

Pay per event, no subscription. You pay only for what is returned:

| Event | Price per 1,000 | 1,000 | 10,000 | 100,000 |
|---|---|---|---|---|
| article | $1.00 | $1.00 | $10.00 | $100.00 |

Example: 1,000 articles cost $1.00; 10,000 cost $10.00.

Optional full-text extraction (`extractContent`) adds **$2.00 per 1,000** articles whose text was actually extracted (e.g. 1,000 articles with text: $1.00 + $2.00 = $3.00). Pages that return no text are not charged for it. Platform usage is included.

### Integrations & API

Run it from code with the Apify API. Replace `<APIFY_TOKEN>` with your API token.

**Python** (`pip install apify-client`)

```python
from apify_client import ApifyClient

client = ApifyClient("<APIFY_TOKEN>")
run = client.actor("bachiembmt/google-news-rss-scraper").call(run_input={"queries": ["artificial intelligence"], "countries": ["us"], "timeRange": "7d", "maxArticlesPerQuery": 30})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)
```

**cURL** (run synchronously and get dataset items)

```bash
curl -X POST "https://api.apify.com/v2/acts/bachiembmt~google-news-rss-scraper/run-sync-get-dataset-items?token=<APIFY_TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{"queries": ["artificial intelligence"], "countries": ["us"], "timeRange": "7d", "maxArticlesPerQuery": 30}'
```

Works with:

- **Make** and **Zapier**: use the Apify app/module to run this Actor and pass the dataset on.
- **n8n**: use the Apify node or an HTTP Request node with the API call above.
- **Google Sheets**: export the dataset as CSV, or use the Apify integration to append rows automatically.
- **Webhooks**: trigger your own endpoint when a run finishes; combine with Apify schedules for recurring jobs.
- **AI agents**: expose the Actor as a tool through the [Apify MCP server](https://mcp.apify.com).

### FAQ

**Does it give article summaries?**
Google News does not publish summaries, so `snippet` is usually empty. Turn on `extractContent` for the main text of the article page.

**Why are original URLs null?**
`articleUrl` is only filled when `decodeUrls` is on; otherwise you get the Google redirect link in `googleUrl`.

**How do I get only fresh articles?**
Schedule the Actor with `onlyNew: true`.

**Do I need an account or API key for the source?**
No. The Actor needs no login or source API key. You only need an Apify account to run it.

**Is it legal to scrape this data?**
The Actor collects public feed metadata (headlines, links). Respect Google's terms and the publishers' copyright, especially if you enable full-text extraction. This is general information, not legal advice.

### Limitations

- Bing returns only ~10-15 items per query and country (no paging).
- Google RSS returns up to ~100 items per request; `splitByDay` multiplies requests (1 per day) and is for keyword queries only.
- The feed shows what Google News ranks, not a full archive; very old dates are patchy.
- Requests are throttled to about 1 per second; large multi-country runs take time.
- Respect Google's terms and the publishers' copyright; this Actor only collects public feed metadata.

# Actor input Schema

## `queries` (type: `array`):

Keywords to search. Google operators work: site:reuters.com, "exact phrase", intitle:, OR. Leave empty if you only want topics / top stories.

## `topics` (type: `array`):

Optional topic feeds: TOP_STORIES, WORLD, NATION, BUSINESS, TECHNOLOGY, ENTERTAINMENT, SPORTS, SCIENCE, HEALTH.

## `countries` (type: `array`):

Two-letter codes: us, gb, ca, au, in, ie, nz, sg, za, de, fr, es, it, br, mx, ar, jp, kr, vn, id, th, ph, tr. Each query is fetched once per country.

## `timeRange` (type: `string`):

Only articles published within this window (applied via Google's when: operator for keyword queries).

## `maxArticlesPerQuery` (type: `integer`):

Google RSS returns at most ~100 items per request. Use splitByDay for more.

## `splitByDay` (type: `boolean`):

One request per day (after:/before:) over the time range (30 days when 'any') to get well over 100 articles per query. Keyword queries only.

## `decodeUrls` (type: `boolean`):

Resolve news.google.com links to the publisher URL (2 extra throttled requests per article, ~1.5 s each).

## `dedupe` (type: `boolean`):

Skip articles already returned earlier in this run: same URL, or near-identical title (also across queries, countries and engines).

## `sources` (type: `array`):

News engines to query: google (default) and/or bing. Bing returns ~10-15 items per query and has no topic feeds.

## `extractContent` (type: `boolean`):

Fetch each article page and extract main text, author, image and language into 'content' etc. Implies URL decoding for Google results. Slow (~2-4 s per article); paywalled pages are skipped. Extra charge per extracted article.

## `onlyNew` (type: `boolean`):

Skip articles already returned by earlier runs for the same query and country (state kept in the named key-value store 'google-news-seen').

## Actor input object example

```json
{
  "queries": [
    "artificial intelligence"
  ],
  "countries": [
    "us"
  ],
  "timeRange": "7d",
  "maxArticlesPerQuery": 30,
  "splitByDay": false,
  "decodeUrls": false,
  "dedupe": true,
  "sources": [
    "google"
  ],
  "extractContent": false,
  "onlyNew": false
}
```

# Actor output Schema

## `articles` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "queries": [
        "artificial intelligence"
    ],
    "countries": [
        "us"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("bachiembmt/google-news-rss-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "queries": ["artificial intelligence"],
    "countries": ["us"],
}

# Run the Actor and wait for it to finish
run = client.actor("bachiembmt/google-news-rss-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "queries": [
    "artificial intelligence"
  ],
  "countries": [
    "us"
  ]
}' |
apify call bachiembmt/google-news-rss-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,bachiembmt/google-news-rss-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/Pw1dp0hplKev5G28n/builds/cIiBfjNsodVNorQ1X/openapi.json
