Facebook Comments Scraper (Reaction Breakdown & Engagement)
Pricing
$19.99/month + usage
Facebook Comments Scraper (Reaction Breakdown & Engagement)
💬 Facebook Comments Scraper (Reaction Breakdown & Engagement) extracts comments from public posts—text, author, time, reactions & replies. 📥 Export CSV/JSON. 📊 Perfect for social listening, sentiment analysis & community management. ⚡ Fast, reliable, scalable.
Pricing
$19.99/month + usage
Rating
0.0
(0)
Developer
Scraply
Maintained by CommunityActor stats
0
Bookmarked
18
Total users
2
Monthly active users
2 days ago
Last modified
Categories
Share
Facebook Comments Scraper (Reaction Breakdown & Engagement Data)
Scrape comments and replies from public Facebook posts and videos, then get a per-comment reaction-type breakdown (LIKE/LOVE/HAHA/WOW/SAD/ANGRY/CARE) and locally-computed engagement analytics — engagement rate per comment, a top-commenter leaderboard, and comment velocity since the post was published. Built for social listening, engagement research, and Facebook comment-data export/API workflows that need more than a raw like count.
Features
- Bulk URLs — process multiple Facebook post/video permalinks in one run.
- Comments + first-page replies — top-level comments and their first page
of nested replies, tagged
type/isChild/parentIdso parent and reply rows are both easy to filter and easy to reassemble. - Reaction-type breakdown — raw reaction ids + counts per comment/reply,
plus a best-effort id → name map. Unknown ids stay
name: nullrather than a guessed label. - Engagement analytics —
engagementScore/engagementRatePercentper row, a per-post summary (total comments/replies, best-effort post date, comment velocity per hour), and a run-level top-commenter leaderboard ranked by total engagement. - Absolute or relative date filter — keep only comments newer than a
fixed date or a relative window (
2 weeks,3 months, …). - Honest truncation flag — every row carries
commentsTruncatedso it's always clear when a thread had more comments/replies than were fetched. - Real-time output — rows land in the Output tab as soon as each post is processed, no waiting for the whole run to finish.
Use cases
- Social-listening dashboards that need reaction sentiment, not just a like count.
- Brand/campaign post monitoring — who is most engaged, and how fast a post is picking up comments.
- Research and moderation datasets needing per-comment reaction breakdowns.
- Feeding a downstream sentiment/AI pipeline with real comment text plus its engagement context.
Input
| Field | Type | Default | Description |
|---|---|---|---|
startUrls | array (required) | — | Facebook post/video permalink URLs, one per line |
commentSettings.maxComments | integer | 10 | Max top-level comments per post |
commentSettings.maxRepliesPerComment | integer | 2 | Max replies kept per top-level comment |
commentSettings.commentsSortOrder | enum | all | most_relevant, newest, or all (original order) |
onlyCommentsNewerThan | datepicker (absolute or relative) | — | Keep only comments/replies newer than this date/window |
reactionEngagementSettings.includeReactionBreakdown | boolean | true | Include the per-comment reaction-type breakdown |
reactionEngagementSettings.computeEngagementAnalytics | boolean | true | Include engagement score/rate, post summary, and the leaderboard |
reactionEngagementSettings.topCommentersLimit | integer | 10 | How many ranked rows the leaderboard keeps |
proxyConfiguration | object | informational only | The Actor always routes through Apify residential proxy regardless of this field |
Output
Each comment/reply is one dataset row (type: "comment" or "reply"):
facebookUrl,commentUrl,id,feedbackId,date,textprofilePicture,profileId,profileName,profileUrl(when available)likesCount,commentsCount,reply(nested replies, kept for backward compatibility),threadingDepth,facebookId,inputUrltype(comment/reply),isChild,parentId,commentsTruncatedreactions.raw—[{id, name, count}, ...](raw reaction ids always present;nameis a best-effort LIKE/LOVE/HAHA/WOW/SAD/ANGRY/CARE map,nullfor unmapped ids)reactions.byType—{LIKE: n, LOVE: n, ...}summed from the mapped raw entriesreactions.totalFromBreakdown,reactions.reactorsCountReduced— cross-check totalsengagementScore,engagementRatePercent— this row's share of the post's total engagement
Once per post, a type: "postEngagementSummary" row is added with
totalComments, totalReplies, totalEngagement, postDate (best-effort,
null when it can't be reliably determined), postDateCoverage, and
commentVelocityPerHour.
At the end of the run, up to topCommentersLimit type: "commenterLeaderboard"
rows are added, ranked by totalEngagement across the whole run.
An error field (with full_url/url_key) is added instead when a post
could not be processed.
How it works
The Actor loads each post's own permalink page (through Apify's residential
proxy) and parses comments — including their first page of replies — directly
out of that page's server-rendered data. This is the same single page fetch
needed to identify the post, so no extra network round-trip is spent per
comment or per reply page. Because this reads only the first page of replies
Facebook renders server-side, very long reply threads are naturally partial —
this is disclosed honestly via commentsTruncated rather than hidden.
Reaction-type mapping
Facebook represents each reaction type as an opaque numeric id rather than a
readable name at the comment level. This Actor ships the raw ids and
counts always, plus a best-effort mapping to LIKE/LOVE/HAHA/WOW/SAD/ANGRY/CARE
built from publicly known, long-stable Facebook reaction ids. An id this
Actor doesn't recognize is reported with name: null — never a guessed name.
Cautions
- Data from publicly available posts only.
- Comply with Facebook's Terms of Service and applicable privacy laws.
- Use responsibly.