DEV Community

Ben
Ben

Posted on

Compare competitor Facebook pages by their latest 60 posts, without logging in

A follower count says how many people once clicked Follow. It does not say how often a page posts, what a post gets back, or which kind of post works for it. This guide measures that for six large Facebook pages from their latest 60 posts each: posting pace, reactions, comments and shares, the split by post type, video views, and which reactions people use. It is for marketers and analysts who benchmark competitors, and it needs no Facebook account.

The posts come from Facebook Posts Scraper on Apify, which reads public pages the way a visitor without an account sees them. Everything below was measured on October 4, 2026.

Six pages, 360 posts

One run, six pages, 60 posts each, 75 seconds:

Page Followers Posts per week Median reactions per post Reactions per week Median comments Median shares
MrBeast 49M 8.6 73,356 2,102,174 1,970 437
Nike 39M 0.1 3,634 910 293 350
NASA 28M 8.6 2,923 39,254 126 249
Meta 106M 10.3 2,162 90,624 435 154
National Geographic 51M 31.1 740 175,180 28 54
BBC News 62M 171.8 438 257,044 138 34

The table is sorted by what a single post gets, and that order hides half of the picture. BBC News is last per post and second per week, because it publishes about 25 posts a day. National Geographic posts four to five times a day and collects more reactions in a week than Meta or NASA, although its typical post gets a third or less of theirs.

Followers explain little. Meta's own page has 106 million of them and a typical post gets 2,162 reactions, which is 20 per million followers. NASA has 28 million followers and gets 104 per million. Nike's page is a different case: its latest 60 posts reach back to October 2016 and the newest is from September 2025, so a page with 39 million followers shows a visitor almost no ordinary posts.

Which kind of post gets the reaction

Every row carries a type. Median reactions by type, with the number of posts in brackets:

Page Photo Video Link Share of another post
NASA 4,040 (32) 5,142 (18) 550 (6)
National Geographic 973 (25) 2,037 (19) 300 (11)
BBC News 1,196 (23) 270 (14) 345 (23)

On National Geographic a video gets almost seven times the reactions of a link post. On BBC News the photo post leads and video comes last. NASA's own photos and videos get seven to nine times what its shares of other pages' posts get. The pattern differs from page to page, which is the reason to measure the pages in your own market instead of following a general rule.

All 155 videos in the sample came with a view count. The median video of MrBeast had 3,594,727 views, Nike's 240,660 (six videos), NASA's 85,857, National Geographic's 61,705, Meta's 32,265 and BBC News's 16,169.

How people react

The reactions come split by kind. Across the 60 posts of each page:

Page Like Love Haha Angry
MrBeast 91.6% 5.3% 2.4% 0.0%
Meta 90.7% 7.2% 0.5% 0.1%
National Geographic 87.7% 8.3% 0.5% 0.0%
Nike 78.4% 19.5% 0.2% 0.3%
NASA 75.4% 20.5% 0.6% 0.1%
BBC News 58.7% 1.8% 30.4% 3.3%

One in five reactions on NASA's and Nike's posts is a heart. On BBC News 30% are "Haha", and that figure shows why a total can mislead: a single post about international politics drew 21,360 of the page's roughly 27,300 "Haha" reactions. Use the median for a page's normal post and read the outliers one by one.

Run it yourself

Without code: open the Actor, paste the page links into Facebook pages, set Maximum posts per page to 60, run it, and export the dataset as CSV or Excel. The columns used here are pageName, type, createdAt, reactions, reactionCounts, comments, shares and videoViews.

With Python:

import os
import statistics
import sys
from collections import defaultdict
from datetime import datetime

from apify_client import ApifyClient

pages = sys.argv[1:] or ["NASA", "natgeo"]
client = ApifyClient(os.environ["APIFY_TOKEN"])
run = client.actor("benthepythondev/facebook-posts-scraper").call(run_input={"pages": pages, "maxResults": int(os.environ.get("POSTS", "60"))})
dataset_id = run["defaultDatasetId"] if isinstance(run, dict) else run.default_dataset_id
by_page = defaultdict(list)
for row in client.dataset(dataset_id).iterate_items():
    by_page[row["pageName"]].append(row)

print(f"{'page':<30}{'posts':>6}{'per week':>10}{'reactions':>11}{'comments':>10}{'shares':>8}{'video %':>9}{'video views':>13}")
for name, posts in sorted(by_page.items(), key=lambda item: -statistics.median(post["reactions"] for post in item[1])):
    dates = sorted(datetime.fromisoformat(post["createdAt"]) for post in posts)
    days = max((dates[-1] - dates[0]).total_seconds() / 86400, 1)
    views = [post["videoViews"] for post in posts if post["videoViews"]]
    middle = lambda field: statistics.median(post[field] for post in posts)
    print(f"{name[:29]:<30}{len(posts):>6}{len(posts) / days * 7:>10.1f}{middle('reactions'):>11,.0f}{middle('comments'):>10,.0f}{middle('shares'):>8,.0f}"
          f"{100 * sum(post['type'] == 'video' for post in posts) / len(posts):>8.0f}%{statistics.median(views) if views else 0:>13,.0f}")
Enter fullscreen mode Exit fullscreen mode

Run as APIFY_TOKEN=<your token> POSTS=9 python facebook_page_benchmark.py NASA natgeo, it printed this on October 4:

page                           posts  per week  reactions  comments  shares  video %  video views
NASA - National Aeronautics a      9      10.4      2,886        94     242      56%       88,884
National Geographic                9      50.4        645        17      33      22%       15,215
Enter fullscreen mode Exit fullscreen mode

A post costs $0.004 on Apify's Free plan, so the 360 posts behind the first table cost $1.44. The follower counts came from Facebook Pages Scraper, which returned the six pages in 16 seconds.

Going further

  • The same period for every page. Sixty posts are two and a half days of BBC News and nine years of Nike. For a like-for-like comparison set postedAfter and postedBefore instead of a count. Facebook starts the list at the upper date, so an old period does not cost the months after it: one week of NASA from a year earlier came back as four posts in 14 seconds.
  • What people write. Facebook Comments Scraper takes the url of a post and returns its comments with their replies. The 1,000 newest comments of one post took 60 seconds.
  • Communities instead of pages. Facebook Groups Scraper reads the posts of public groups in the same row format: 420 posts from seven groups in 100 seconds.
  • A weekly watch. With onlyNewPosts and a schedule, each run returns only the posts published since the previous one.

Limits to keep in mind

  • Facebook gives a visitor three posts per request. A page yields about 100 recent posts a minute; posts from years ago come slower.
  • Only public pages and profiles can be read. Pages that Facebook shows to logged-in users only, such as pages with an age limit, return nothing.
  • The counts describe the day of the run. A post from yesterday is still collecting reactions, so a page that posts many times a day looks weaker per post than it will a week later.
  • Follower counts are the rounded figures Facebook shows ("62M followers").
  • Reaction counts say how many people reacted, not how many saw the post. Facebook does not show reach to visitors.

A note on data and law

The Actors read only what Facebook shows publicly to any visitor and do not log in. Page posts can contain personal data, and comments always do, so GDPR, CCPA and similar rules apply to how you store and use them, and Facebook's terms apply to you as well.

Try it

The four Actors are linked above, and each can be tried on Apify's free plan. If you do not have an Apify account yet, you can create one here. That is an affiliate link: the author may earn a commission if you later pay for Apify, at no extra cost to you.

Top comments (0)