I Got Tired of Instagram Comment Scrapers Asking for My Password. So I Built One That Can’t.
A free Chrome extension that exports Instagram comments to CSV — no login, no API key, no monthly quota.
I Got Tired of Instagram Comment Scrapers Asking for My Password. So I Built One That Can’t.
A free Chrome extension that exports Instagram comments to CSV — no login, no API key, no monthly quota.

The 200-comment wall
If you’ve ever tried to export the comments off an Instagram post, you know the routine.
You search “Instagram comment exporter.” You find a slick-looking extension. You install it. You open your post, hit Export — and a modal slides up:
You’ve reached your free limit of 100 comments. Upgrade to Pro for $19/month to unlock unlimited exports.
So you go back and try another one. This one doesn’t have a cap — but it wants your Instagram username and password first, because it logs into your account on a server somewhere to pull the data. Or it wants a Business account connected to the Graph API, which means an app review, a Facebook Page, and a permissions flow that takes a week.
I hit this wall three times in one afternoon while trying to pull about 800 comments off a single campaign post. Not for anything exotic — I just wanted the usernames and the text in a spreadsheet so I could sort them.
By the fourth tool, I stopped searching and opened a code editor.
The thing nobody tells you about Instagram comments
Here’s the realization that made this whole project take an afternoon instead of a month:
The comments are already on your screen.
When you open an Instagram post and scroll the comment pane, your browser downloads every one of those comments, parses them, and paints them into the page. The username is there. The text is there. The timestamp is sitting in a datetime attribute. The like count is right there under the text.
The data isn’t behind a wall. It’s rendered in front of you.
So why does a tool need your password to read something that’s already in your own browser window?
It doesn’t. And that single question is the entire design of this extension.
What I built
IG Comment Extractor is a Chrome extension that watches the comments render as you scroll, collects them into memory, and exports them to CSV when you click a button.
That’s it. That’s the whole thing.
The important part is what it doesn’t do:
- It makes zero network requests. There is no server. Nothing you scroll gets uploaded anywhere, because there is nowhere for it to go.
- It never sees your credentials. It uses the session you’re already logged into, the same way any page you visit does. There’s no login screen in the extension because there’s nothing to log into.
- It has no counter. There is no
if (count > 100) showUpgradeModal()line, because there's no paid tier to upsell you to.
You scroll, it collects, you export. If you scroll through 2,000 comments, you export 2,000 comments.
How it actually works
The core of it is about 40 lines of DOM reading. Every Instagram comment’s timestamp is wrapped in a permalink that looks like this:
/p/DXyZ123abc/c/17851234567890123/
That number at the end is the comment ID — Instagram’s own stable, unique identifier for that specific comment. The extension uses it as the primary key:
const COMMENT_PERMALINK_RE = /^\/p\/[^/]+\/c\/(\d+)\/?$/;
This turns out to matter more than it sounds. Because the ID is unique and stable, deduplication is free. Instagram loves to re-render chunks of the comment list as you scroll — the same comment can pass through the DOM half a dozen times. Tools that dedupe on “username + text” will happily give you a CSV where the same person appears four times, or worse, silently drop two different people who both replied with the same emoji.
Keying on the real comment ID means you get each comment exactly once, no matter how many times Instagram repaints it.
From there, a MutationObserver watches the page and fires a scan every time new comments appear:
const observer = new MutationObserver(() => {
scanForComments();
});
observer.observe(document.body, { childList: true, subtree: true });
And for each new permalink it finds, it walks up the DOM to pull out the username, the comment text, any @mentions, and the like count.
The part that took the longest
Naively, this is a 20-minute project. The reason it wasn’t is a subtle race condition.
Instagram hydrates comments in stages. There’s a window — sometimes only a few hundred milliseconds — where the timestamp and text are in the DOM but the username hasn’t rendered yet. If you scan during that window, you get a comment with a blank author.
The obvious fix is to skip those and move on. That’s also the wrong fix: skip it once and it’s in your seen set forever, so that comment is silently gone from your export. You'd never know. Your CSV just quietly has 1,847 rows instead of 1,900.
So there are two collections instead of one:
const collected = new Map(); // fully resolved
const pending = new Map(); // has text + timestamp, username still hydrating
Anything with an unresolved username lands in pending and gets retried on every subsequent scan instead of being dropped. And because mutations can go quiet before hydration finishes — you stop scrolling, the observer stops firing, the username lands a beat later — there's a one-second interval as a safety net:
setInterval(scanForComments, 1000);
Then, at export time, the pending rows get included anyway with a blank username:
// include unresolved-username rows too, rather than lose their
// timestamp/text entirely - blank username beats a missing row
That comment in the source is the whole philosophy of the tool. A visibly incomplete row is honest. A missing row is a lie. If a scraper drops data silently, you can’t correct for what you don’t know is gone.
What you get out
A UTF-8 CSV (with a BOM, so Excel doesn’t mangle emoji and non-Latin scripts — a genuinely irritating problem with a lot of exporters) containing:
ColumnWhat it isusernameThe commenter's handlecomment_idInstagram's stable unique ID for the commenttextComment body, with @mentions preserved inlinelikesLike count on that commentcreated_atISO 8601 timestamp from the datetime attribute
That comment_id column is worth calling out. Most exporters don't give it to you. With it, you can re-scrape the same post next week and diff the two files to find exactly what's new — no fuzzy matching, no guessing. Without it, incremental collection is basically impossible.
How it compares
I’m not going to name names, because pricing pages change and I’d rather this post age well. But every Instagram comment tool I tried falls into one of three buckets, and it’s worth knowing which one you’re installing.
Bucket 1: Freemium extensions
The most common. Free to install, and they work — up to 50, or 100, or 200 comments. Then the paywall.
The frustrating part isn’t the price. It’s that the limit is completely artificial. The data was already in your browser. The extension read all of it. Then it counted to 100 and put up a wall.
Difference here: there’s no counter, because there’s no upgrade to sell. The ceiling is however far you’re willing to scroll.
Bucket 2: Cloud-based scrapers
You hand over your Instagram login. Their servers log in as you and pull the data. These genuinely can go deeper — they’ll scroll for you, unattended, across many posts.
The trade is real, though: your session credentials live on someone else’s infrastructure, every comment you collect passes through their systems, and automated logins from a datacenter IP are a well-known way to get an account flagged.
Difference here: the extension has no server component at all. host_permissions is scoped to https://www.instagram.com/* and nothing else. There's no credential to leak because it never asks for one, and there's no upload path because there's no backend.
Bucket 3: Official Graph API tools
The legitimate, well-behaved route. Also the one with the most friction: you need an Instagram Business or Creator account, a linked Facebook Page, a registered app, and an approved permissions review. And you can generally only read comments on your own posts.
Difference here: no setup, no approval, works on any post you can already open in your browser. But to be clear — if you’re building production infrastructure on top of Instagram data, the Graph API is the correct answer and you should use it. This is a tool for the ad-hoc case, not a replacement for a real API integration.
Side by side
Freemium extensionsCloud scrapersGraph APIIG Comment ExtractorCostFree tier, then paidSubscriptionFreeFreeComment capYes, typically 50–200Plan-dependentRate limitedNoneWants your passwordNoYesNoNoSends data to a serverSometimesAlwaysTo MetaNeverSetup timeSecondsMinutesDaysSecondsWorks on others’ postsYesYesNoYesGives you comment_idRarelySometimesYesYes
Using it
- Install it from the Chrome Web Store: **IG Comment Extractor**
- Open any Instagram post in a normal browser tab.
- Scroll the comment pane. Keep clicking “View more comments” until you’ve got what you need — the extension’s counter ticks up live as it collects.
- Click the extension icon, hit Export CSV, pick a location.
There’s also a Clear button that resets the collection between posts. It’s slightly smarter than it needs to be: cleared comment IDs stay suppressed even though they’re still sitting in the DOM, so the next background scan doesn’t instantly re-discover everything you just cleared. (I found that one the annoying way.)
One honest limitation: the extension doesn’t scroll for you. It’s a collector, not a bot. It reads what you load. This is a deliberate choice — automated scrolling is exactly the behavior that gets accounts rate-limited and flagged, and I’d rather the tool be slow than get your account restricted. If you need 3,000 comments, you’re going to be scrolling for a few minutes.
On using this responsibly
Worth saying plainly, because a post about a scraping tool that skips this part isn’t being straight with you.
This extension reads public comments that Instagram has already displayed to you as a logged-in user. That’s a meaningfully different act from breaking into private data. But “technically visible” isn’t the same as “do whatever you like with it”:
- Instagram’s Terms of Service restrict automated data collection. Reading your own screen is a gray area, not a green light. Know that you’re in it.
- Comment authors are real people. Usernames and comment text are personal data under GDPR and similar regimes. If you’re collecting at scale in a commercial context, you have obligations — a lawful basis, retention limits, the rest of it.
- Don’t build spam lists. Exporting 500 usernames to cold-DM them is exactly the thing that makes platforms hostile to legitimate research tooling.
The use cases I built this for: analyzing sentiment on your own campaign posts, running giveaway draws that need an auditable participant list, and academic research on public discourse. Those are what it’s good at.
Why it’s free
No trick, no bait-and-switch waiting in v2.
It’s a few hundred lines of DOM parsing with no server, no database, and no ongoing cost to me. There’s nothing to monetize because there’s nothing to run. Charging a subscription for a static file that executes entirely on your own machine would be charging rent on something that costs nothing to keep alive.
The features people usually pay for — unattended scrolling, multi-post queues, cloud storage — are the exact features I deliberately left out, because they’re the ones that require a backend and get accounts flagged.
So it stays free. That’s the whole business model.
→ Install IG Comment Extractor from the Chrome Web Store
If you hit a post where extraction breaks, I want to hear about it. Instagram changes its DOM structure regularly, and the class-name heuristics this relies on are the first thing to break when they do.
메타데이터
- post_id
- bde331fedbbb
- slug
- i-got-tired-of-instagram-comment-scrapers-asking-for-my-password-so-i-built-one-that-cant-bde331fedbbb
- url
- https://medium.com/@abdelfatahmennoun4/i-got-tired-of-instagram-comment-scrapers-asking-for-my-password-so-i-built-one-that-cant-bde331fedbbb
- canonical_url
- https://medium.com/@abdelfatahmennoun4/i-got-tired-of-instagram-comment-scrapers-asking-for-my-password-so-i-built-one-that-cant-bde331fedbbb
- author_url
- https://medium.com/@abdelfatahmennoun4
- status
- ok
- fetched_at
- 2026-09-02 13:45:48