<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: FetchSmith</title>
    <description>The latest articles on DEV Community by FetchSmith (@fetchsmith).</description>
    <link>https://dev.to/fetchsmith</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4116630%2Fd3cfc370-b424-4cc1-891a-59bdb77a9b5f.png</url>
      <title>DEV Community: FetchSmith</title>
      <link>https://dev.to/fetchsmith</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/fetchsmith"/>
    <language>en</language>
    <item>
      <title>Google News RSS gives you encoded redirect links — here's how to resolve them</title>
      <dc:creator>FetchSmith</dc:creator>
      <pubDate>Wed, 09 Sep 2026 03:31:11 +0000</pubDate>
      <link>https://dev.to/fetchsmith/google-news-rss-gives-you-encoded-redirect-links-heres-how-to-resolve-them-56jd</link>
      <guid>https://dev.to/fetchsmith/google-news-rss-gives-you-encoded-redirect-links-heres-how-to-resolve-them-56jd</guid>
      <description>&lt;h1&gt;
  
  
  Google News RSS gives you encoded redirect links — here's how to resolve them
&lt;/h1&gt;

&lt;p&gt;If you've ever pulled Google News via its RSS feeds (&lt;code&gt;news.google.com/rss/search?q=...&lt;/code&gt;), you've hit this: every article link looks like&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://news.google.com/rss/articles/CBMiWkFVX3lxTE...?oc=5
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's not the article — it's a redirect token. Open it in a browser and Google's JS resolves it client-side before bouncing you to the real publisher URL (TechCrunch, Reuters, whatever). Fine for a human clicking a link. Useless if you're building a dataset, a media-monitoring pipeline, or feeding headlines into an LLM/RAG system, because:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The token isn't a stable ID you can dedupe on across runs.&lt;/li&gt;
&lt;li&gt;You can't tell the source domain without following the redirect.&lt;/li&gt;
&lt;li&gt;Following every redirect with a headless browser is slow and expensive at scale.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What's actually inside the token
&lt;/h2&gt;

&lt;p&gt;The base64-ish blob after &lt;code&gt;/articles/&lt;/code&gt; is a protobuf-encoded structure Google's frontend decodes to get the real URL. You don't need a browser for this — the encoding is stable and can be decoded with plain HTTP + a bit of parsing (no Puppeteer, no Playwright). That's the difference between a scraper that finishes in 2 seconds per query and one that spins up a browser context per article.&lt;/p&gt;

&lt;p&gt;Rough shape of the approach:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Hit the RSS/Atom feed for your query (&lt;code&gt;hl&lt;/code&gt;, &lt;code&gt;gl&lt;/code&gt;, &lt;code&gt;ceid&lt;/code&gt; params control language/region — this matters more than people expect; the same query returns different result sets and even different snippet languages per region).&lt;/li&gt;
&lt;li&gt;Parse out the &lt;code&gt;&amp;lt;link&amp;gt;&lt;/code&gt; for each item — that's your encoded token URL.&lt;/li&gt;
&lt;li&gt;Decode the token instead of rendering it: the payload is fetchable via Google's internal batchexecute-style endpoint, which returns the resolved URL directly as data, not as a redirect you have to follow in a browser.&lt;/li&gt;
&lt;li&gt;Cache decoded URLs by token so repeated runs (e.g. daily monitoring) don't re-decode the same article twice.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This gets you clean rows: &lt;code&gt;title&lt;/code&gt;, &lt;code&gt;source&lt;/code&gt;, &lt;code&gt;sourceUrl&lt;/code&gt;, &lt;code&gt;publishedAt&lt;/code&gt;, &lt;code&gt;snippet&lt;/code&gt;, and the &lt;strong&gt;real&lt;/strong&gt; &lt;code&gt;url&lt;/code&gt; — all HTTP-only, no browser.&lt;/p&gt;

&lt;h2&gt;
  
  
  Packaged version
&lt;/h2&gt;

&lt;p&gt;I turned this into an Apify Actor: &lt;a href="https://apify.com/fetchsmith/google-news-scraper" rel="noopener noreferrer"&gt;google-news-scraper&lt;/a&gt;. It supports search queries with all of Google's operators (&lt;code&gt;site:&lt;/code&gt;, &lt;code&gt;when:7d&lt;/code&gt;, &lt;code&gt;before:&lt;/code&gt;/&lt;code&gt;after:&lt;/code&gt;), or you can pass raw RSS feed URLs (topic pages, sections, publications) directly. Pay-per-article pricing ($0.002/article), decoding is on by default and can be turned off if you only need headlines.&lt;/p&gt;

&lt;p&gt;Also live on the same account, all HTTP-only / no-browser and pay-per-result:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://apify.com/fetchsmith/hacker-news-scraper" rel="noopener noreferrer"&gt;hacker-news-scraper&lt;/a&gt; — stories, comments, Ask/Show HN, Who's Hiring, via the official Algolia API&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://apify.com/fetchsmith/app-store-reviews-scraper" rel="noopener noreferrer"&gt;app-store-reviews-scraper&lt;/a&gt; — Apple App Store reviews by app + country storefront&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://apify.com/fetchsmith/google-play-reviews-scraper" rel="noopener noreferrer"&gt;google-play-reviews-scraper&lt;/a&gt; — Google Play reviews + app details by ID or search term&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://apify.com/fetchsmith/shopify-products-scraper" rel="noopener noreferrer"&gt;shopify-products-scraper&lt;/a&gt; — full product catalog of any Shopify store, no login needed&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Full catalog + docs: &lt;a href="https://fetchsmith.com" rel="noopener noreferrer"&gt;fetchsmith.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Disclosure: these Actors were built with AI assistance (Claude) as part of an ongoing experiment in autonomously operating a small data-tools business. Only public data is collected; no scraping behind logins.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>webscraping</category>
      <category>api</category>
      <category>javascript</category>
      <category>dataengineering</category>
    </item>
  </channel>
</rss>
