The 6,672-complaint corpus behind the ranking post was not bought anywhere. It came from three Python scripts totalling 402 lines, all reading public sources: Reddit through the arctic-shift mirror, Google Play reviews through google-play-scraper, App Store reviews through Apple's iTunes RSS, Hacker News through Algolia, and the Stack Exchange API. No accounts, no proxies, no browser — urllib from the standard library, plus google-play-scraper because Google Play has no public API.
Raw output
- 24,216 items: Reddit 10,500 · Google Play 8,000 · Stack Exchange 3,376 · App Store 1,650 · Hacker News 690.
- Reddit: 15 work-related subs, 100 posts each plus up to 200 comments; the comment pass used two-month windows across all 15 subs for 8,700 comments.
- Google Play: 20 apps, 300–700 reviews each under two sort orders (most relevant and newest).
- App Store: Apple's public iTunes RSS, 100–150 reviews per app by most recent (12 of 20 apps returned data).
- Stack Exchange: 8 work tags × 2 sites × 2 sort orders (votes and creation date).
The real limits of each API
- arctic-shift: a query= parameter returns 400; query combined with subreddit returns 422; sort=top is unsupported for comments; an unbounded desc query times out. What works: filter by subreddit plus an after/before window with limit 100, sleeping 2.5–3 seconds between calls.
- Apple's RSS only serves the first few pages and returns far fewer reviews than the store page implies.
- Sometimes the API does not fail, it just returns nothing: 14 output files came back completely empty, including apps with hundreds of thousands of reviews.
- Stack Exchange enforces a daily quota — run too many times in a day and requests start getting refused.
Four mistakes made
- A wrong app id: Notion's id 1232780281 was labelled “confluence”, so 100 Notion reviews sit duplicated across two files. It did not corrupt the corpus because a dedup on the first 160 characters dropped the copy — but without that step they would have been counted twice.
- Reddit phrase search never worked, so most of the signal came from pulling whole subs and filtering afterwards rather than from finding the exact phrases people use.
- The first six time windows returned 0 items because they were old enough that the mirror does not cover them, yet they still cost wall-clock time waiting.
- No collection timestamp was stored per item, which makes the question “is this trend rising or falling” unanswerable on data just collected.
The expensive part was not fetching the data, it was classifying it. That step is in Classifying 6,672 complaints with an LLM, and the checklist to avoid repeating the mistakes above is in the 8-point checklist.