Facebook Comments Scraper (Reaction Breakdown & Engagement) avatar

Facebook Comments Scraper (Reaction Breakdown & Engagement)

Pricing

$19.99/month + usage

Go to Apify Store
Facebook Comments Scraper (Reaction Breakdown & Engagement)

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

Scraply

Maintained by Community

Actor stats

0

Bookmarked

18

Total users

2

Monthly active users

2 days ago

Last modified

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/parentId so 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: null rather than a guessed label.
  • Engagement analyticsengagementScore / engagementRatePercent per 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 commentsTruncated so 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

FieldTypeDefaultDescription
startUrlsarray (required)Facebook post/video permalink URLs, one per line
commentSettings.maxCommentsinteger10Max top-level comments per post
commentSettings.maxRepliesPerCommentinteger2Max replies kept per top-level comment
commentSettings.commentsSortOrderenumallmost_relevant, newest, or all (original order)
onlyCommentsNewerThandatepicker (absolute or relative)Keep only comments/replies newer than this date/window
reactionEngagementSettings.includeReactionBreakdownbooleantrueInclude the per-comment reaction-type breakdown
reactionEngagementSettings.computeEngagementAnalyticsbooleantrueInclude engagement score/rate, post summary, and the leaderboard
reactionEngagementSettings.topCommentersLimitinteger10How many ranked rows the leaderboard keeps
proxyConfigurationobjectinformational onlyThe 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, text
  • profilePicture, profileId, profileName, profileUrl (when available)
  • likesCount, commentsCount, reply (nested replies, kept for backward compatibility), threadingDepth, facebookId, inputUrl
  • type (comment/reply), isChild, parentId, commentsTruncated
  • reactions.raw[{id, name, count}, ...] (raw reaction ids always present; name is a best-effort LIKE/LOVE/HAHA/WOW/SAD/ANGRY/CARE map, null for unmapped ids)
  • reactions.byType{LIKE: n, LOVE: n, ...} summed from the mapped raw entries
  • reactions.totalFromBreakdown, reactions.reactorsCountReduced — cross-check totals
  • engagementScore, 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.