If you have tried to scrape G2 reviews with a quick requests.get(), you already know how it goes: a 403, a CAPTCHA, or a blank page. G2 is one of the tougher public sites to pull at scale. But the data behind it (ratings, structured pros and cons, and which competitor a reviewer switched away from and why) is worth the trouble if you do any competitive intelligence.
This guide covers what a G2 review actually contains, why the naive approach fails, a Python path that works, a no-code shortcut, and a plain comparison so you can pick the right route. If you want a deeper field reference, there is a longer review holds more than it looks. Per review you can pull:
Overall rating (1 to 5) plus six sub-ratings (ease of use, ease of setup, quality of support, meets requirements, and more)
Structured pros, cons, and "problems solved" as separate fields, not one text blob
Switching data: the competitor the reviewer came from, and why they left (the field most people are actually after)
Reviewer context: industry, role, company size, country- Dates, verification, and the incentivized flag
The sub-ratings and switching fields are the reason to scrape G2 instead of skimming it by hand.
Why scraping G2 is hard: DataDome
G2 runs on Apify handles the DataDome, proxy, and parsing layer and hands back structured JSON. No login, no proxy setup.
From Python, using the Apify client:
from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("factden/g2-reviews-scraper").call(run_input={
"mode": "reviews",
"startUrls": ["https://www.g2.com/products/slack/reviews", "notion"],
"maxReviewsPerProduct": 200,
"sortReviews": "helpful",
})
for review in client.dataset(run["defaultDatasetId"]).iterate_items():
print(review["overallRating"], review["reviewTitle"], review.get("previousCompetitors"))
Pass full product URLs or bare slugs (notion, slack). There is also a Products mode that finds competitor products by keyword before you pull their reviews.
What comes back: 27 structured fields
| Group | Fields |
|---|---|
| Ratings | overallRating, subRatings (ease of use, setup, support, meets requirements) |
| Structured text | pros, cons, problemsSolved, recommendations, reviewText |
| Switching / battlecard | didSwitchFromCompetitor, previousCompetitors, whySwitched |
| Reviewer | reviewerIndustry, reviewerRole, companySize, reviewerCountry, reviewerName |
| Meta | isIncentivized, helpfulVotes, submittedAt, reviewUrl, productSlug, productName |
| AI-ready | markdownContent (a self-contained markdown block per review, for RAG / vector DBs) |
A trimmed sample row, so you can see the shape:
{
"productName": "Slack",
"overallRating": 5,
"subRatings": {"easeOfUse": 6, "easeOfSetup": 6, "qualityOfSupport": 5, "meetsRequirements": 6},
"reviewTitle": "Runs our whole company",
"pros": "Channels keep every project in one place.",
"cons": "Notifications get noisy at scale.",
"didSwitchFromCompetitor": true,
"previousCompetitors": ["Microsoft Teams"],
"whySwitched": "Better threads and a faster mobile app.",
"companySize": "Mid-Market",
"reviewerRole": "IT Administrator",
"isIncentivized": false
}
The two fields most scrapers drop, previousCompetitors + whySwitched (resolved to real product names) and the per-dimension subRatings, are what make this useful for battlecards. Full field list and copy-paste snippets are in the (also mirrored on HuggingFace and Kaggle). Load it into pandas and the sub-ratings and switching fields show up straight away.
FAQ
Is scraping G2 reviews legal? The reviews are publicly available. As with any scraping, check G2's Terms of Service and your local rules (GDPR and similar for personal data), and use the data responsibly.
Does G2 have an API? Yes, but it is enterprise-tier: a sales call, a contract, and procurement. For most teams, scraping the public pages, or using a ready-made actor, is the faster route to the same public data.
How do I stop getting blocked? Residential proxies, a real browser fingerprint, and human-like pacing, or a tool that bundles all three. Datacenter IPs and plain requests will not survive DataDome.
How much does it cost? DIY costs proxies plus your time. The actor is pay-per-result at $0.004 per row, with about 1,250 rows free on Apify's $5 new-account credit.
Can I get the "switched from" competitor data? Yes. That is the previousCompetitors and whySwitched fields, resolved to product names. It is the reason most people scrape G2 in the first place.
Can I filter out incentivized (gift-card) reviews? Yes. Every row carries an isIncentivized flag, so you can recompute a rating on organic reviews only. G2's own UI will not let you do that.
Related
- I mapped switching and sub-ratings across 25 tools in and Trip.com and Ctrip hotel reviews.
Questions, or a field you wish it extracted? Drop a comment.
SOCIAL SHARE CARD GENERATOR