How to Scrape Google News Headlines and Real Article URLs
Google News is still one of the fastest ways to see what is being written about a topic, a company or a person, across languages and countries. The painful part is the links: many scrapers leave you with Google redirect URLs instead of the publisher's article. This guide shows how to scrape Google News search results, topics and top stories, and keep the real article URL.
You will use the Google News Scraper on Apify. It covers keyword search, topic headlines and top stories in 47 country and language editions, and can resolve Google redirects to the publisher's own URL. You also get the title, publisher, date and related coverage.
By the end of this article you will have a CSV or JSON file on your machine, and a short Python snippet you can rerun or schedule. The same Actor is also callable from JavaScript and from AI agents through the Apify MCP server.
What you need
- An Apify account. The Free plan is enough to try a small run.
- A list of inputs for the Actor (URLs, IDs or search terms — details in the steps below).
- Optional: Python 3 with the
apify-clientpackage if you want to automate the run.
No Google login and no proxy setup are required for normal use. Think of it as a small Google News API you do not have to maintain.
How to run it in the Apify Console
Step 1: Open the Actor
Open https://apify.com/veenkes/veenkes-google-news and click Try for free.
Step 2: Enter queries or topics
A search query such as artificial intelligence is enough. You can also add topic pages. Pick an edition such as US:en, GB:en, DE:de or JP:ja.
Step 3: Set a time range
Use a rolling window (for example the last 7 days) or explicit dates. Keep max items per query small on the first run, and leave URL resolution on if you want publisher links.
Step 4: Export
Start the run and download CSV or JSON. De-duplication can drop the same article if several queries return it.
Time range applies to search queries. URL resolution is the difference between a redirect and a link you can fetch or open directly.
How to run it from Python
Install the official client and call the Actor by its Store id veenkes/veenkes-google-news. Replace YOUR_APIFY_TOKEN with a token from Apify Console > Integrations. Do not commit the token to a public repository.
pip install apify-client from apify_client import ApifyClient client = ApifyClient("YOUR_APIFY_TOKEN") run = client.actor("veenkes/veenkes-google-news").call(run_input={ "queries": [ "artificial intelligence" ], "region": "US:en", "timeRange": "7d", "maxItemsPerQuery": 50, "resolveUrls": True }) # Write every dataset item, then export from the Console or keep going in code. for item in client.dataset(run["defaultDatasetId"]).iterate_items(): print(item) The JavaScript client (apify-client on npm) uses the same Actor id and the same input object. You can also start the run with a plain HTTP POST to the Apify API if you prefer.
Sample output
Here is a shortened example of one dataset record (field values are illustrative of the schema, taken from a real sample run shape):
{ "title": "1 killed, 4 injured in shooting in Washington, D.C.'s Logan Circle neighborhood; suspect is dead", "publisher": "CBS News", "publisherUrl": "https://www.cbsnews.com", "url": "https://www.cbsnews.com/news/washington-dc-shooting-gym-vida/", "googleNewsUrl": "https://news.google.com/rss/articles/CBMibkFVX3lxTE95dkVUTlk2aDQ5YWFfUFBxNWRuSDBoQkdsRlpwN2J6ZTZaSDF0STRpTktzVm0yQTBEd3Z1XzVJT2tXb2M3cVFyejJRZ2k1R3JuMlJpQ1pnRmw3YXJ1NEpaY0xKblVHcnd…", "articleId": "CBMibkFVX3lxTE95dkVUTlk2aDQ5YWFfUFBxNWRuSDBoQkdsRlpwN2J6ZTZaSDF0STRpTktzVm0yQTBEd3Z1XzVJT2tXb2M3cVFyejJRZ2k1R3JuMlJpQ1pnRmw3YXJ1NEpaY0xKblVHcnd1NmFoMkt3", "publishedAt": "2026-11-12T19:28:18.000Z", "position": 1, "sourceType": "topic", "query": null, "topic": "TOP_STORIES", "language": "en", "country": "US", "relatedArticles": [ { "googleNewsUrl": "https://news.google.com/rss/articles/CBMidEFVX3lxTFBxRDBQN3NNZV80TkVLTktzU0V2VzdEYVIwNWRqYkhsd1lZYnRCVkxSdzZzREg0cHVPVjNLSmxwclBxRERaR2Vwb1ducldyWDQybzdfZ2M3M1R1dFBBczd2ZFhESjFEd1B…", "title": "Live updates: 55-year-old alleged gunman identified after 1 killed and 4 injured in DC shooting", "publisher": "CNN" }, { "googleNewsUrl": "https://news.google.com/rss/articles/CBMixgFBVV95cUxQV3BES0JvbS1IdmF6dG9uc3BvdUlUTmVrenVKUFl0cGFVTWM2ZEhtVWt2TUVMbFBmWGhQbDlFNXBCYTZSbllUeklFT1hUM3ZNODRjdHI0bm5HTzh0VGFmQ21PQW1yTkt…", "title": "Logan Circle mass shooting suspect was feuding with condo building management", "publisher": "NBC4 Washington" } ], "urlResolved": true, "scrapedAt": "2026-11-12T21:32: … } Once the run has finished, open the dataset in the Console and use Export > CSV if a spreadsheet is your destination. JSON is usually better for code and for language models.
What to use the data for
Media-monitoring teams watch brand and competitor names in several editions. Researchers build a headline corpus for a topic. AI briefing agents need a short list of recent stories with working URLs. A scheduled hourly or daily run is a simple news radar.
Pricing
Pay-per-result pricing starts at $2.00 per 1,000 articles on the Apify Free plan, with lower unit prices on paid Apify plans, plus a small per-run start fee. Always check the live pricing on the Actor page, because plans and unit prices can change. For a first test, keep the input tiny so you can inspect the schema before you scale up.
Scheduling and automations
In the Apify Console you can schedule the Actor (daily or hourly) and leave the same input in place. For incremental jobs, prefer a "since" or "posted after" style filter when the Actor offers one, so you are not paying to re-collect old rows. When a run finishes you can send a webhook, or connect the Actor in Zapier, Make or n8n. AI agents can discover and call veenkes/veenkes-google-news through Apify's MCP server using the same input.
Good practices and limits
This is not an official Google News API, and the Actor is not affiliated with Google. Headlines and snippets belong to their publishers; use them for monitoring and research rather than republishing a news site. Resolved URLs still point at the publisher, who may have their own access rules.
If a run returns fewer rows than you expected, check the input caps, language or country filters, and the Actor log. A zero-row run is usually a filter or an unavailable source, not a silent crash — read the log before you increase limits.
Next step
Open the Actor and run a small job: Google News Scraper: Search, Topics & Article URLs.
If you later want this on a schedule, save the input that worked, add a date filter where it applies, and export CSV automatically from the dataset or from the API snippet above.

