Plotting number of subreddits moderated within top 1,000 most subscribed subs, vs. Subreddit Subscriber Aggregate.

Click on images below to enlarge.



The data is from http://redditlist.com/ and https://www.reddit.com/. C# was written to parse both websites and generate output formatted for a GoogleCharts Bubble Chart. This script was ran on 5/14/2020.

If you would like to parse the top 1,000 most subscribed-to subreddit mod usernames, and aggregate their frequency yourself. Feel free to download visual studio and run the code below in a simple .NET Console Application. Of course this being a hard parse it is only bound to work so long as redditlist and reddit don’t change their html structure, otherwise it can be used as a reference.

Crawl redditlist.com

Collect the middle column for the first 8 pages listing 125 each.



Crawl reddit.com

Iterate over each subreddit’s /about/moderators page and collect usernames shown below.



Regular Expression patterns used to collect information:

@"_blank(.*?)</div>" @">(.*?)</a>" @"listing-stat'>(.*?)</span>" @"<span class=" "user" "><a href=" "https://old.reddit.com/user/(.*?)/" @"_blank(.*?)</div>" @">(.*?)</a>" @"listing-stat'>(.*?)</span>" @"<span class=""user""><a href=""https://old.reddit.com/user/(.*?)/"

C# .NET Console Application

using System ; using System.Collections.Generic ; using System.IO ; using System.Linq ; using System.Net ; using System.Text ; using System.Text.RegularExpressions ; using System.Threading.Tasks ; namespace RedditMegaModBubbleParse { class Program { static void Main ( string [ ] args ) { Dictionary < string , int > dictSub_SubscriberCount = new Dictionary < string , int > ( ) ; //PARSE TOP 1000 Subreddit names and subscribers// List < string > top500Subreddits = new List < string > ( ) ; for ( int page = 1 ; page < 9 ; page ++ ) { WebClient wc = new WebClient ( ) ; string htmlString = wc . DownloadString ( "http://redditlist.com/?page=" + page ) ; MatchCollection matches = Regex . Matches ( htmlString, @"_blank(.*?)</div>" , RegexOptions . Singleline ) ; int count = 0 ; foreach ( Match match in matches ) { if ( count > 125 && count <= 250 ) { Console . WriteLine ( count ) ; string sHtmlChunk = match . Groups [ 1 ] . Value ; Match mSubName = Regex . Match ( sHtmlChunk, @">(.*?)</a>" ) ; Match mSubscriberCount = Regex . Match ( sHtmlChunk, @"listing-stat'>(.*?)</span>" ) ; if ( mSubName . Success && mSubscriberCount . Success ) { string sSubName = mSubName . Groups [ 1 ] . Value ; Console . WriteLine ( "Subreddit Name : " + sSubName ) ; string sSubscriberCount = mSubscriberCount . Groups [ 1 ] . Value ; int iSubscriberCount = int . Parse ( Regex . Replace ( sSubscriberCount, "," , "" ) ) ; Console . WriteLine ( "Subreddit Count : " + iSubscriberCount ) ; dictSub_SubscriberCount . Add ( sSubName, iSubscriberCount ) ; } Console . WriteLine ( ) ; } count += 1 ; } } Dictionary < string , int > dictModCount = new Dictionary < string , int > ( ) ; Dictionary < string , int > dictModSubscriberAggregate = new Dictionary < string , int > ( ) ; int count_sub = 0 ; foreach ( string subreddit_name in dictSub_SubscriberCount . Keys ) { try { count_sub += 1 ; Console . WriteLine ( "*** Subreddit " + count_sub + " ~~~ " + "[" + subreddit_name + "] ***" ) ; WebClient wc = new WebClient ( ) ; string subreddit_clean = Regex . Replace ( subreddit_name, " " , "" ) ; string url_glue = "https://old.reddit.com/r/" + subreddit_clean + "/about/moderators" ; Console . WriteLine ( url_glue ) ; string htmlString = wc . DownloadString ( url_glue ) ; MatchCollection matches = Regex . Matches ( htmlString, @"<span class=" "user" "><a href=" "https://old.reddit.com/user/(.*?)/" , RegexOptions . Singleline ) ; foreach ( Match match in matches ) { Console . WriteLine ( match . Groups [ 1 ] . Value ) ; string modname = match . Groups [ 1 ] . Value ; if ( dictModCount . ContainsKey ( modname ) ) { int existingcount = dictModCount [ modname ] ; existingcount += 1 ; dictModCount [ modname ] = existingcount ; int existingSubscriberCount = dictModSubscriberAggregate [ modname ] ; existingSubscriberCount += dictSub_SubscriberCount [ subreddit_name ] ; dictModSubscriberAggregate [ modname ] = existingSubscriberCount ; } else { dictModCount . Add ( modname, 1 ) ; dictModSubscriberAggregate . Add ( modname, dictSub_SubscriberCount [ subreddit_name ] ) ; } } } catch ( Exception x ) { Console . WriteLine ( "ERROR ACCESSING SUBREDDIT INVITE ONLY!!!!!!!" ) ; } } Console . WriteLine ( ) ; string masteroutput = "" ; foreach ( KeyValuePair < string , int > item in dictModCount . OrderByDescending ( key => key . Value ) ) { Console . WriteLine ( "['" + item . Key + "', " + item . Value + ", " + dictModSubscriberAggregate [ item . Key ] + ", '1' , " + dictModSubscriberAggregate [ item . Key ] + " ]," ) ; masteroutput += "['" + item . Key + "', " + item . Value + ", " + dictModSubscriberAggregate [ item . Key ] + ", '1' , " + dictModSubscriberAggregate [ item . Key ] + " ], \r

" ; } //save to C:\Airplanes\ StreamWriter streamWrite ; streamWrite = File . AppendText ( "C: \\ Airplanes \\ output.txt" ) ; streamWrite . WriteLine ( masteroutput ) ; streamWrite . Close ( ) ; Console . ReadLine ( ) ; } } } using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net; using System.Text; using System.Text.RegularExpressions; using System.Threading.Tasks; namespace RedditMegaModBubbleParse { class Program { static void Main(string[] args) { Dictionary<string, int> dictSub_SubscriberCount = new Dictionary<string, int>(); //PARSE TOP 1000 Subreddit names and subscribers// List<string> top500Subreddits = new List<string>(); for (int page = 1; page < 9; page++) { WebClient wc = new WebClient(); string htmlString = wc.DownloadString("http://redditlist.com/?page=" + page); MatchCollection matches = Regex.Matches(htmlString, @"_blank(.*?)</div>", RegexOptions.Singleline); int count = 0; foreach (Match match in matches) { if (count > 125 && count <= 250) { Console.WriteLine(count); string sHtmlChunk = match.Groups[1].Value; Match mSubName = Regex.Match(sHtmlChunk, @">(.*?)</a>"); Match mSubscriberCount = Regex.Match(sHtmlChunk, @"listing-stat'>(.*?)</span>"); if (mSubName.Success && mSubscriberCount.Success) { string sSubName = mSubName.Groups[1].Value; Console.WriteLine("Subreddit Name : " + sSubName); string sSubscriberCount = mSubscriberCount.Groups[1].Value; int iSubscriberCount = int.Parse(Regex.Replace(sSubscriberCount, ",", "")); Console.WriteLine("Subreddit Count : " + iSubscriberCount); dictSub_SubscriberCount.Add(sSubName, iSubscriberCount); } Console.WriteLine(); } count += 1; } } Dictionary<string, int> dictModCount = new Dictionary<string, int>(); Dictionary<string, int> dictModSubscriberAggregate = new Dictionary<string, int>(); int count_sub = 0; foreach (string subreddit_name in dictSub_SubscriberCount.Keys) { try { count_sub += 1; Console.WriteLine("*** Subreddit " + count_sub + " ~~~ " + "[" + subreddit_name + "] ***"); WebClient wc = new WebClient(); string subreddit_clean = Regex.Replace(subreddit_name, " ", ""); string url_glue = "https://old.reddit.com/r/" + subreddit_clean + "/about/moderators"; Console.WriteLine(url_glue); string htmlString = wc.DownloadString(url_glue); MatchCollection matches = Regex.Matches(htmlString, @"<span class=""user""><a href=""https://old.reddit.com/user/(.*?)/", RegexOptions.Singleline); foreach (Match match in matches) { Console.WriteLine(match.Groups[1].Value); string modname = match.Groups[1].Value; if (dictModCount.ContainsKey(modname)) { int existingcount = dictModCount[modname]; existingcount += 1; dictModCount[modname] = existingcount; int existingSubscriberCount = dictModSubscriberAggregate[modname]; existingSubscriberCount += dictSub_SubscriberCount[subreddit_name]; dictModSubscriberAggregate[modname] = existingSubscriberCount; } else { dictModCount.Add(modname, 1); dictModSubscriberAggregate.Add(modname, dictSub_SubscriberCount[subreddit_name]); } } } catch (Exception x) { Console.WriteLine("ERROR ACCESSING SUBREDDIT INVITE ONLY!!!!!!!"); } } Console.WriteLine(); string masteroutput = ""; foreach (KeyValuePair<string, int> item in dictModCount.OrderByDescending(key => key.Value)) { Console.WriteLine("['"+item.Key + "', " + item.Value+", "+ dictModSubscriberAggregate[item.Key]+", '1' , "+ dictModSubscriberAggregate[item.Key] + " ],"); masteroutput += "['" + item.Key + "', " + item.Value + ", " + dictModSubscriberAggregate[item.Key] + ", '1' , " + dictModSubscriberAggregate[item.Key] + " ],\r

"; } //save to C:\Airplanes\ StreamWriter streamWrite; streamWrite = File.AppendText("C:\\Airplanes\\output.txt"); streamWrite.WriteLine(masteroutput); streamWrite.Close(); Console.ReadLine(); } } }

Congrats to the May 2020 top 50 Reddit Megamods

In order of the most subreddits modded within top 1,000 most subscribed-to subreddits.

AutoModerator MAGIC_EYE_BOT BotTerminator Blank-Cheque RepostSentinel cyXie Umbresp AssistantBOT BotDefense metastasis_d awkwardtheturtle LeafSamurai Merari01 IranianGenius commonvanilla GallowBoob N8theGr8 love_the_heat ManWithoutModem greatyellowshark justcool393 Lil_SpazJoekp siouxsie_siouxv2 SuzyModQ pHorniCaiTe babar77 PowerModerator maybesaydie davidreiss666 Sunkisty yummytuber SEO_Nuke PhlogistonAster daninger4995 kjoneslol sloth_on_meth ani625 Tornado9797 sidshembekar RalphiesBoogers RepostSleuthBot Noerdy stuffed02 whyhellomichael qgyh2 Llim ModeratelyHelpfulBot EpicEngineer T_Dumbsford Kesha_Paul