# Google News Keyword & Full-Text Article Scraper (`nimbryxo-studio/google-news-keyword-and-full-text-article-scraper`) Actor

Search Google News by keyword with real resolved article links, headlines, sources, and dates, plus optional full article text and image extraction, filterable by date, language, and publisher.

- **URL**: https://apify.com/nimbryxo-studio/google-news-keyword-and-full-text-article-scraper.md
- **Developed by:** [Nimbryxo-studio](https://apify.com/nimbryxo-studio) (community)
- **Categories:** News, Automation, SEO tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.49 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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 Keyword & Full-Text Article Scraper

Search Google News for any keyword and get back real, resolved article links — not Google's redirect URLs — along with headline, source, and publish date. Turn on full-text and image extraction when a snippet isn't enough and you need the actual article body.

### What this actor does

- Searches Google News for one or more keywords in a single run and deduplicates articles that match more than one query
- Resolves each result to the publisher's real article URL instead of a Google redirect link whenever it can
- Filters results by recency, a custom date range, language, country, a specific publisher domain, or excluded words
- Can optionally fetch each article's page to pull the full body text and the main article image
- `fullText`, `imageUrl`, and `author` are always present on every record but come back `null` when the corresponding option is off or nothing was found; `publishedAt`, `snippet`, `source` and `domain` are empty strings when Google News doesn't supply them

### Output per article

- `query` — the search keyword that returned this article
- `title` — the article headline
- `url` — the publisher's actual article URL, resolved from Google News (if resolution fails, the Google News link is kept)
- `source` — the publisher name, e.g. `BBC`, `Reuters`
- `domain` — the publisher's domain, e.g. `bbc.com` (from the resolved URL, or from Google News' source link when unresolved)
- `publishedAt` — the article's publication date and time in ISO 8601, as listed by Google News
- `snippet` — the short summary Google News shows for the article
- `fullText` — the full article body text; `null` unless `extractFullText` is enabled
- `imageUrl` — the article's main image URL; `null` unless `includeImages` is enabled
- `author` — the article's byline; `null` unless `extractFullText` or `includeImages` is enabled (either one opens the article page) and the page publishes one
- `language` — the language code used for the search
- `scrapedAt` — when the actor started on that query

### Input

| Field | Type | Default | Description |
|---|---|---|---|
| `queries` | array of strings | – | Search keywords; each is searched separately and results are deduplicated across all of them. Required. |
| `maxResultsPerQuery` | integer | `20` | Maximum articles to return per query (1–100). |
| `language` | string | `en` | Language code for the search, e.g. `en`, `de`, `fr`, `es`. |
| `country` | string | `US` | Country code for regional news, e.g. `US`, `GB`, `DE`, `IN`. |
| `dateRange` | string | `any` | Recency filter: `1h`, `6h`, `1d`, `7d`, `1m`, `1y`, or `any`. Ignored when `dateFrom`/`dateTo` are set. |
| `dateFrom` | string | – | Only articles published on or after this date (`YYYY-MM-DD`); overrides `dateRange`. |
| `dateTo` | string | – | Only articles published on or before this date (`YYYY-MM-DD`); use together with `dateFrom`. |
| `siteFilter` | string | – | Restrict results to one publisher domain, e.g. `reuters.com`. |
| `excludeWords` | array of strings | – | Words or phrases added to the search as exclusions, so Google News leaves out matching articles. |
| `extractFullText` | boolean | `false` | Fetch each article's page and extract the full body text and author byline. |
| `includeImages` | boolean | `false` | Fetch each article's page and extract its main image URL (the author byline is picked up too when present). |
| `maxConcurrency` | integer | `5` | How many articles to process in parallel when `extractFullText`/`includeImages` is on (1–20). |

### Example: quick scan of today's headlines

```json
{
  "queries": ["artificial intelligence", "climate change"],
  "maxResultsPerQuery": 20,
  "dateRange": "1d"
}
```

### Example: full article text and images

```json
{
  "queries": ["renewable energy"],
  "maxResultsPerQuery": 10,
  "extractFullText": true,
  "includeImages": true
}
```

### Example: one publisher, custom date range, with exclusions

```json
{
  "queries": ["elections"],
  "siteFilter": "bbc.com",
  "dateFrom": "2026-01-01",
  "dateTo": "2026-02-28",
  "excludeWords": ["opinion", "editorial"],
  "maxResultsPerQuery": 50
}
```

### Example: non-English regional news

```json
{
  "queries": ["Nachrichten"],
  "language": "de",
  "country": "DE",
  "maxResultsPerQuery": 10
}
```

### Use cases

- **Media monitoring** — track coverage of your brand, competitors, or industry across the publishers Google News indexes
- **Market research** — pull news mentioning a company, product, or market trend for analysis
- **Newsletter curation** — build a themed news digest from one or more topics
- **Sentiment analysis** — feed full article text into an NLP pipeline to gauge coverage tone on a topic
- **Academic or policy research** — gather a dated, filtered news dataset for a study
- **Dataset building** — collect full article text at scale for downstream text-analysis work

### FAQ

**Does this return the real article link or a Google redirect?**
The real, resolved publisher URL, not the `news.google.com` redirect link Google News shows in its own results. In the rare case a link can't be resolved, the Google News link is returned in `url` instead.

**Why are `fullText`, `imageUrl`, or `author` null in my results?**
All three fields are always present on the record, but they only get a real value when you turn on `extractFullText` and/or `includeImages` and the article page actually has that data; otherwise they come back as `null`. Pages that fail to load also leave them `null`. By default (both options off) the actor returns headlines and snippets only, which is faster.

**Can full-text extraction read paywalled articles?**
No — sites behind a paywall (e.g. subscription-only news sites) won't return usable full text, since the actor only reads what's publicly visible on the page.

**Can I search multiple keywords at once?**
Yes, add as many entries as you like to `queries`; results across all of them are deduplicated by their Google News link, so an article found by an earlier query is not repeated for a later one.

**What's the difference between `dateRange` and `dateFrom`/`dateTo`?**
`dateRange` is a quick recency filter (e.g. "past week"). Setting `dateFrom` and/or `dateTo` gives you a custom date window instead and makes the actor ignore `dateRange`. Both are passed to Google News as search conditions, so the dates Google applies are what count.

**Can I restrict results to one news source?**
Yes, set `siteFilter` to that publisher's domain, e.g. `reuters.com`.

**How many articles can I get per query?**
Up to `maxResultsPerQuery`, capped at 100, limited by how many matching articles Google News returns for that query and filter combination in a single result list (there is no paging beyond it).

**Is this affiliated with Google?**
No. This is an independent, third-party actor that reads Google News' publicly available search results; it is not affiliated with or endorsed by Google.

# Actor input Schema

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

One or more search keywords. Each query is processed separately. Results are deduplicated across queries.

## `maxResultsPerQuery` (type: `integer`):

Maximum number of articles to return per query.

## `language` (type: `string`):

2-letter BCP-47 language code for Google News results (e.g. 'en', 'de', 'fr', 'es').

## `country` (type: `string`):

ISO 3166-1 alpha-2 country code for regional news (e.g. 'US', 'GB', 'DE', 'IN').

## `dateRange` (type: `string`):

Filter articles by recency. Ignored if dateFrom/dateTo are set.

## `dateFrom` (type: `string`):

Filter articles published on or after this date (YYYY-MM-DD). Overrides dateRange.

## `dateTo` (type: `string`):

Filter articles published on or before this date (YYYY-MM-DD). Use with dateFrom.

## `siteFilter` (type: `string`):

Restrict results to a specific domain (e.g. 'reuters.com', 'bbc.com').

## `excludeWords` (type: `array`):

Words or phrases to exclude from results.

## `extractFullText` (type: `boolean`):

Fetch each article and extract the full body text using trafilatura. Uses Playwright to render the article page.

## `includeImages` (type: `boolean`):

Extract the main og:image URL from each article page. Uses Playwright to render the article page.

## `maxConcurrency` (type: `integer`):

Number of parallel browser pages (for full text/images). Higher = faster but more memory.

## Actor input object example

```json
{
  "queries": [
    "artificial intelligence",
    "climate change"
  ],
  "maxResultsPerQuery": 20,
  "language": "en",
  "country": "US",
  "dateRange": "any",
  "extractFullText": false,
  "includeImages": false,
  "maxConcurrency": 5
}
```

# Actor output Schema

## `results` (type: `string`):

Dataset with scraped articles

# 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",
        "climate change"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("nimbryxo-studio/google-news-keyword-and-full-text-article-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",
        "climate change",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("nimbryxo-studio/google-news-keyword-and-full-text-article-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",
    "climate change"
  ]
}' |
apify call nimbryxo-studio/google-news-keyword-and-full-text-article-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,nimbryxo-studio/google-news-keyword-and-full-text-article-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/7LV8qekDbhuvsPtdv/builds/nb5nBoeTHtEgc79u6/openapi.json
