DEV Community

Cover image for How to compare 500 keywords in Google Trends (when Google only allows 5)
Jerry
Jerry

Posted on

How to compare 500 keywords in Google Trends (when Google only allows 5)

Google Trends is the best free signal for "what are people interested in", but it has one limit that makes it awkward for real work: you can compare at most 5 search terms at a time, and every comparison is rescaled so its own top value is 100.

If you have 12 keywords, or 500, the obvious workaround is to split them into batches of 5. Most scripts do that. It gives you numbers that look fine and are quietly wrong.

Why batches of 5 don't add up

Here is real data: 12 keywords, US, the last 12 months, average interest. The middle column is what you get from three separate Google Trends requests. The right column puts all 12 on one scale.

Keyword Separate batches of 5 One shared scale
ebay 62 42.29
wine 62 42.78
hoodie 38 25.96
wikipedia 27 18.62
podcast 26 18.06
matcha 79 8.64
violin 32 3.56
figma 22 2.42
badminton 12 1.27
uber app 7 0.82
costco jobs 54 0.79
bagel near me 47 0.68

In the batched version, "costco jobs" (54) looks twice as popular as "wikipedia" (27). On a shared scale it is about 24 times smaller. "matcha" looks bigger than "ebay". Each batch's 100 means something different, so you can't sort, chart or compare across batches.

The fix: chain batches through shared keywords

Every batch gets rescaled, but the ratio between two keywords in the same batch is real. So if one keyword appears in two batches, it tells you how to convert one batch's scale into the other's.

  1. Pick an anchor. Put the same keyword in every batch: the anchor plus 4 new keywords each.
  2. Rescale each batch to the first one. If the anchor averages 40 in batch 1 and 80 in batch 3, everything in batch 3 gets multiplied by 0.5.
  3. Renormalize so the overall maximum is 100.

That works when your keywords are of similar size. It breaks when they aren't, and with real keyword lists they never are. Google Trends returns whole numbers, and anything under 0.5 becomes 0. If the anchor is huge, small keywords read as 0, 1 or 2 next to it, and their converted values are mostly rounding noise.

So the second pass is a ladder:

  1. Sort keywords by the size estimated in pass 1.
  2. Measure the biggest ones together.
  3. For each next batch of smaller keywords, use as the bridge the smallest already-placed keyword that still reads clearly (5 or more on Google's scale). Each step down the ladder compares keywords of similar size, so nothing is lost to rounding.
  4. Track how many steps each keyword is from the top, and how strong each bridge reading was. That gives an honest confidence level for every keyword.

Two traps I hit while building this:

  • Google sometimes returns a blank for a keyword once. If that happens in pass 1, a big keyword looks tiny, gets sent to the bottom of the ladder, and then dwarfs its bridges. In my first version this made one keyword 4x too large while it still looked normal. The fix: when a new keyword dwarfs its bridges, set it aside and re-measure it against the largest placed keyword.
  • Rate limits. Google answers bursts with HTTP 429. pytrends, the usual Python library, was archived in 2025 and fails on exactly this. You need fresh sessions, backoff, and pacing of a few seconds between requests, or a proxy pool for volume.

I tested the stitching against a simulator of Google's rounding and noise: across 40 keywords spanning a 2,000x range, the median error is under 1 point on the 0-100 scale.

If you just want the numbers

I packaged all of this as an Apify Actor: Google Trends Scraper. Disclosure: I built it, and it's pay per result ($1-2 per 1,000 rows depending on your Apify plan; empty results are free). Besides the shared scale, it does related queries, interest by region, and today's trending searches, and it always stops inside a time limit you set.

From Python, using Apify's client (pip install apify-client):

from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("granola2/google-trends-scraper").call(run_input={
    "keywords": ["chatgpt", "gemini", "claude", "copilot", "perplexity", "midjourney",
                 "grok", "deepseek", "notebooklm", "cursor", "suno", "runway"],
    "timeRange": "today 12-m",
})

for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(f'{item["keyword"]:<12} {item["averageValue"]:>6}  {item["stitch"]["confidence"]}')
Enter fullscreen mode Exit fullscreen mode

Each row has the full weekly series (points), averageValue, peakValue, and a stitch block with the confidence. Here are 15 AI tools on one scale, worldwide, over the last 12 months:

A caveat from that chart: these are search terms, not products. "Gemini" includes the zodiac sign and "Claude" includes people named Claude. The Actor's resolveTopics option queries each term as a Google topic instead, which fixes that.

Takeaways

  • Never compare Google Trends numbers from different requests directly.
  • Put a shared keyword in every batch, then rescale through it.
  • With mixed sizes, walk down a ladder of similar-sized bridges, and keep a confidence level per keyword.
  • Retry with fresh sessions and pace your requests, or Google will start returning 429s.

Questions about the method are welcome in the comments. Happy to go deeper on the ladder or the edge cases.

Top comments (0)