# Google News Scraper (`mina_safwat/google-news-scraper`) Actor

Scrapes Google News search results, topics and top stories by country and language, with the real article link, publisher and publish time; optional full article text.

- **URL**: https://apify.com/mina_safwat/google-news-scraper.md
- **Developed by:** [Mina](https://apify.com/mina_safwat) (community)
- **Categories:** News, SEO tools, AI
- **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

### What does Google News Scraper do?

**Google News Scraper** turns [Google News](https://news.google.com) into
structured data. Give it **search queries** or paste **Google News links**
(topics, sections such as Business or Technology, publications, top stories),
pick a **country and language**, and optionally a **time range**. You get one
row per article with the **headline, publisher, the real article link on the
publisher's site** (not a news.google.com redirect), the **publish time in
UTC** and its position in the results. Switch on **full article text** to
also get each article's text, summary, lead image and authors.

Try it with the prefilled query: open the Actor, click **Start**, and 20
articles arrive in about 5 seconds. Because it runs on the Apify platform,
you also get API access, scheduled runs, integrations (Google Sheets, Make,
Zapier, webhooks, Slack), run monitoring and automatic retries.

### Why scrape Google News?

- **Media monitoring and PR**: track every story about your brand, products,
  competitors or executives, in any country and language Google News covers.
- **Market and investment research**: follow news on companies, sectors and
  commodities, and feed headlines into dashboards or sentiment models.
- **News alerts**: schedule a run every hour with **Published within: Last
  hour** and send new articles to Slack or email.
- **Research and AI datasets**: collect thousands of articles on a topic over
  a date range, with full text, for analysis or model training.
- **SEO and content research**: see which publishers rank in Google News for
  your keywords.

### How to scrape Google News

1. Type what you want to follow into **Search queries**, one query per line,
   for example `artificial intelligence` or `"interest rates" site:reuters.com`.
2. Or open [news.google.com](https://news.google.com), go to a topic, section
   or search, and paste the address into **Google News links**.
3. Set **Country** and **Language** for the edition you want (US + en, GB +
   en, DE + de, FR + fr, IN + hi, EG + ar…).
4. Optionally pick **Published within** (last hour, 24 hours, 7 days, 30 days,
   year) or a **date range**, and set **Max articles per query or link**.
5. Click **Start**, then download the results as JSON, CSV, Excel or HTML.

### Input

Everything is set on the Input tab. In JSON, the input looks like this:

```json
{
    "queries": ["artificial intelligence", "\"interest rates\" site:reuters.com"],
    "startUrls": ["https://news.google.com/topics/CAAqJggKIiBDQkFTRWdvSUwyMHZNRGx6TVdZU0FtVnVHZ0pWVXlnQVAB?hl=en-US&gl=US&ceid=US:en"],
    "country": "US",
    "language": "en",
    "timeRange": "7d",
    "maxResults": 500,
    "includeArticleText": false
}
```

| Field | What it does |
|---|---|
| `queries` | Search words, one query per line. Google's operators work: `"exact phrase"`, `-word`, `OR`, `site:`, `intitle:`. |
| `startUrls` | Google News links: a search, topic, section (`/headlines/section/topic/TECHNOLOGY`), publication, or the top stories page. Plain strings or `{"url": "…"}` objects; `https://` is optional. A link with its own `hl`, `gl` and `ceid` keeps that edition. |
| `country` | Two-letter code of the edition, such as `US`, `GB`, `DE`, `IN`. Default: `US`. |
| `language` | Language of the edition, such as `en`, `de`, `fr`, `ar`, `pt-BR`. Default: `en`. |
| `timeRange` | `any` (default), `1h`, `1d`, `7d`, `30d` or `1y`. |
| `dateFrom`, `dateTo` | A date range instead, such as `2025-01-01` to `2025-01-31`. Days are Google's own calendar days (US Pacific time): an article is kept when its Pacific date is from `dateFrom` through `dateTo`. Google also sends articles of the day after the range; they are dropped, not saved. |
| `maxResults` | Articles per query or link. Default: 100, up to 10,000. |
| `includeArticleText` | Adds the full text, description, lead image and authors from the publisher's page. Default: off. |

If Google has no edition for a country and language (for example Egypt in
English), it serves its nearest edition; the run's status message says which,
and each row's `edition` field shows the edition the article really came from.

### Output

Each article is one row. A real row from the prefilled run:

```json
{
    "title": "The AI doom scenario you've never heard of may be the hardest to stop",
    "publisher": "CBS News",
    "publisherUrl": "https://www.cbsnews.com",
    "url": "https://www.cbsnews.com/news/ai-doom-scenario-gradual-disempowerment/",
    "googleNewsUrl": "https://news.google.com/rss/articles/CBMieEFVX3lxTE5mMmdEVkNzd21X…?oc=5",
    "publishedAt": "2026-10-19T15:33:00Z",
    "publishedDateOnly": false,
    "position": 1,
    "query": "artificial intelligence",
    "feedUrl": "https://news.google.com/search?q=artificial%20intelligence&hl=en-US&gl=US&ceid=US%3Aen",
    "edition": "US:en",
    "articleId": "CBMieEFVX3lxTE5mMmdEVkNzd21X…",
    "scrapedAt": "2026-10-20T14:01:08.674347+00:00"
}
```

With **Add full article text** on, each row also carries the page's text and
metadata (text shortened here):

```json
{
    "title": "How electric school buses power 1,000 homes in California – and make money",
    "publisher": "Electrek",
    "url": "https://electrek.co/2026/10/20/how-electric-school-buses-power-1000-homes-in-california-and-make-money/",
    "publishedAt": "2026-10-20T14:00:00Z",
    "articleText": "A fleet of 74 school buses have spent the last two years powering about a thousand homes, taking stress off the grid, thanks to V2G chargers built in America.…",
    "wordCount": 893,
    "description": "These US-built V2G chargers power a thousand homes with school bus batteries, saving the grid and making money along the way.",
    "imageUrl": "https://electrek.co/wp-content/uploads/sites/3/2024/05/Zum_electric-school-buses-v2g.jpg?quality=82&strip=all&resize=1200,628",
    "authors": ["Jameson Dow", "Fred Lambert"]
}
```

You can download the dataset in various formats such as JSON, HTML, CSV, or
Excel.

### Data fields

| Field | Description |
|---|---|
| `title` | Headline, without the " - Publisher" Google adds to it. |
| `publisher` | Publisher name, such as Reuters or BBC. |
| `publisherUrl` | Publisher's home page. |
| `url` | The article on the publisher's own site, decoded from Google's redirect link. In the rare case it can't be decoded, the Google News link (the run log counts these). |
| `googleNewsUrl` | The article's news.google.com link. |
| `publishedAt` | Publish time, ISO 8601 in UTC. |
| `publishedDateOnly` | `true` when Google gives only the publish day, not the time: `publishedAt` is then midnight US Pacific time of that day (07:00Z or 08:00Z). Common for articles older than a few days. |
| `position` | 1-based order within the query or link. |
| `query` | The search words (empty for topic, section and top stories links). |
| `feedUrl` | The Google News page the article was listed on. |
| `edition` | The edition served, such as `US:en` or `DE:de`. |
| `articleId` | Google's id for the article. |
| `articleText`, `wordCount` | Full text and its length. Only with full article text; empty when the page is paywalled, blocked or has no readable body. |
| `description`, `imageUrl`, `authors` | The page's own summary, lead image and authors. Only with full article text. |
| `scrapedAt` | When the row was saved. |

### How much does it cost to scrape Google News?

You pay per article saved; see the **Pricing** tab for the exact price. Rows
with full article text also count one **article-text** event each, and only
when text was actually read. Nothing is charged for queries that find
nothing or links that can't be read.

The Actor uses plain HTTP requests (no browser) and no paid proxy in normal
runs, so it is fast: the prefilled run finishes in about 5 seconds, and 2,000
articles take about 2 minutes. Apify's monthly free credit is enough to try it
on a few thousand articles.

### Tips and advanced options

- **More than 100 articles per query.** A Google News feed holds about 100
  articles. Above that, the Actor splits a search into date windows and reads
  them newest first, down to single days, so a popular query can return
  thousands of articles. Without a time range it goes back up to a year; set
  `dateFrom`/`dateTo` to go further back. For older dates Google files
  articles by day only, so one day yields at most about 100 articles.
- **Order of results.** Up to 100 articles come in Google's relevance order;
  above 100 (paged by date) they come newest first.
- **Topic and section links** list 30-100 current articles and can't be paged
  back in time. A time range is still applied to their articles.
- **Hourly monitoring.** Use `timeRange: "1h"` on a schedule; each run then
  reads one feed per query and finishes in seconds.
- **Full text takes longer.** Each article is then opened on the publisher's
  site and its page parsed, which is CPU-heavy: about 100 articles in 2 minutes
  at the default 512 MB, or in 45 seconds at 2048 MB (Run options → Memory),
  for a slightly higher platform cost. Leave it off when headlines and links
  are enough.
- Each article appears once per query or link; the same article found by two
  queries appears under each of them.

### FAQ, disclaimers and support

**Is it legal to scrape Google News?** The Actor reads public pages and
feeds that anyone can open without logging in. Whether you may use the
results depends on your purpose and where you are: Google's terms and the
publishers' copyright apply to article text, so check them before
republishing. Articles can name people; personal data is protected by laws
such as the GDPR, so only process it with a legitimate reason. If in doubt,
ask a lawyer.

**Why did a query or link return nothing?** It is listed with the reason in
the `FAILED_INPUTS` record of the run's key-value store, and the run's status
message sums it up. Typical reasons: no articles match the query and time
range, a link that isn't a Google News list page (story "Full coverage" pages
and single article links have no article list), or a topic id Google doesn't
know. These are not charged.

**Why is `articleText` empty for some articles?** Paywalled pages, pages
that block automated visits and pages that load their text with scripts give
no readable body. The row is kept with its headline and link, and the
article-text event isn't charged for it.

**Can I get a specific country's news?** Yes: set `country` and `language`
to an edition Google News offers, or paste a news.google.com link from that
edition.

Found a bug or need another field? Open an issue on the **Issues** tab and
we'll look at it quickly. Need a custom news pipeline? Get in touch through
the Issues tab as well.

# Actor input Schema

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

Words to search Google News for, one query per line. Google's search operators work too, such as "exact phrase", -exclude, OR, site:reuters.com or intitle:tesla.

## `startUrls` (type: `array`):

Google News pages to read, one per line: a search (news.google.com/search?q=…), a topic (news.google.com/topics/…), a section such as Business or Technology, a publication, or the top stories page (news.google.com). A link that names its own edition (hl, gl and ceid in the address) keeps it; others use the country and language below. Story ("Full coverage") pages and single article links have no article list and are listed in FAILED_INPUTS.

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

Two-letter country code of the Google News edition, such as US, GB, DE, IN or EG. If Google has no edition for this country and language, it serves its nearest one and the run's status message says which.

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

Language code of the edition, such as en, de, fr, ar or pt-BR. Each country offers only its own languages: Egypt has ar, India has en and hi, Switzerland has de and fr.

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

Only articles published in this period. For links other than searches the period is applied to the feed's articles after reading it.

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

Only articles published on or after this day (US Pacific calendar day), such as 2026-09-01. Use either this pair of dates or "Published within", not both.

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

Only articles published on or before this day, such as 2026-09-30. Days are Google's US Pacific calendar days.

## `maxResults` (type: `integer`):

Stops after this many articles for each query or link. A Google News feed holds about 100 articles; above 100, searches are read day by day, newest first, so they can reach thousands (up to a year back unless you set dates). Topic, section and top stories links stop at the 30-100 articles Google lists.

## `includeArticleText` (type: `boolean`):

Adds articleText, wordCount, description, imageUrl and authors to each row. Paywalled or script-only pages give no text; their row is still saved, with those fields empty, and is not charged the article-text event.

## Actor input object example

```json
{
  "queries": [
    "artificial intelligence"
  ],
  "startUrls": [],
  "country": "US",
  "language": "en",
  "timeRange": "any",
  "maxResults": 20,
  "includeArticleText": false
}
```

# Actor output Schema

## `dataset` (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"
    ],
    "maxResults": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("mina_safwat/google-news-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"],
    "maxResults": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("mina_safwat/google-news-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"
  ],
  "maxResults": 20
}' |
apify call mina_safwat/google-news-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,mina_safwat/google-news-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/gpqPelu9t1axAhcj3/builds/IpVbtgEMYm1WiEE9W/openapi.json
