An analysis of 3600 NSFW subreddits for their GIF content.

NSFW

Hey everyone.

I'm a huge fan of NSFW gifs. So, I went on a hunt for every subreddit that is gif heavy, and has a decent amount of subscribers.

So I wrote a couple scripts to accomplish it in the following steps:

  1. take all the unique URLs from this page: http://redditlist.com/nsfw/ (all pages)
  2. Go to each subreddit and count the number of links that point to a .gif directly or a gfycat url, calculating a percentage based on total links. (just the first "what's hot" page)
  3. Grab the count of current subscribers.
  4. Eliminate all subreddits that have less than 70% gifs on their front page
  5. Eliminate all subreddits with less than 2500 subscribers.

Here a link to the raw generated file: https://infotomb.com/tgic8.txt

And this is the final filtered list of gif heavy subs:

Edit: Just incase the above parameters are a bit strict for your preferences, below is the list filtered where the frontpage is above 50% and the subscribers is above 2000

Edit2: For those who do not care about the subscription limit, here is the entire list reverse-sorted by gif/gfycat content percentage: https://infotomb.com/gjvuy.txt (the list is shorter due to some subreddits no longer existing / being banned and whatnot.

For those who don't care about GIF and want only gfycat, I have that running now, and will update in a couple hours when it's done (it takes a while to run through every single subreddit)

For those who want the source, here it is (please keep in mind it was rather quick 'n' dirty code (pun kinda intended)):

This grabs the unique urls from redditlist

// NSFW subreddit collection:

var baseUrl = "http://redditlist.com/nsfw/page-" ;
var allLinks = new Array() ; 

for( var i = 1 ; i <= 30 ; i++ ) { 
  
  console.info( i + "..." ) ; 
  
  jQuery.ajax({
    url: baseUrl + i,
    async: false
  }).success( function( data ) { 
  
    var links = jQuery( "table.items.table.table-striped a", data ) ; 
    console.debug( links ) ; 
    
    for( var j = 0 ; j < links.length ; j++ ) { 
      var href = jQuery( links[j] ).attr( "href" ) ; 
      if( allLinks.indexOf( href ) == -1 ) { 
         allLinks.push( href ) ; 
      }
    }
  
  }) ;          

}

for( var i = 0 ; i < allLinks.length ; i++ ) { 
  console.info( allLinks[i] ) ; 
} 

This visits each supplied url (grabbed from the above script and converted to a javascript url) and grabs the required values:

var subreddits = [ "/r/gonewild/", "/r/nsfw/", etc, etc, etc ]

for( var i = 0 ; i < subreddits.length ; i++ ) { 
 
  console.debug( ((i / subreddits.length)*100) + "% complete..." ) ; 
                  
  jQuery.ajax({
    url: subreddits[i],
    async: false
  }).success( function( data ){
    
    var links = new Array() ; 
    var gifCount = 0 ; 

    jQuery( "div#siteTable p.title a:not(span a)", data ).each( function( index, item ) { 

      var href = jQuery( item ).attr( "href" ) ;
      links.push( href ) ; 

      if( href.indexOf( ".gif" ) != -1 || href.indexOf( "gfycat" ) != -1 ) { 
        gifCount++ ; 
      }

    })  ; 

    var subscribers = jQuery( "span.subscribers span.number", data ).text() ;
    
    //console.info( links ) ; 
    console.info( "[" + (( gifCount / links.length ) * 100 ) + "%] GifCount = " + gifCount + ", TotalLinks = " + links.length + " [" + subreddits[i] + "][" + subscribers + " subscribers]" ) ;
    
  }) ;
  
}

And this is the python script that can go through and parse the output of the above script, which I saved to a text file

import re

# filter variables:
requiredGifPercent = 70
requiredSubscribers = 2500

file = open('R:/Programming/Javascript/analysis.txt', 'r')

for line in file:
	lineSplit = line.split()

	gifPercent = re.sub( '[%\[\]]', '', lineSplit[0] ) 
	subreddit = lineSplit[7].split('][')[0][1:]
	subscriptions = re.sub( '[,]', '', lineSplit[7].split('][')[1] ) 

	if (not gifPercent == "NaN") and (float(gifPercent) >= requiredGifPercent) and (int(subscriptions) >= requiredSubscribers):

		if( "." in gifPercent ):
			gifPercent = gifPercent.split('.')[0].zfill(3) + "." + gifPercent.split('.')[1]

		print gifPercent.zfill(3) + " " + subreddit + " " + subscriptions 

Edit3: The list for HTML5 only, filtered to have at least 1%, reverse sorted: https://infotomb.com/uas8g.txt

Posted Aug 17, 2014, 4:45 PM UTC · edited

2.7K165
Loading comments…