Wrote a quick HTML-scraper program to run some basic statistics on the GD Showcase entries. Here are the results:
Username : Downloads (Games)
Battagline : 45276 (12)
chapmast : 14148 (1)
HopeDagger : 10817 (5)
H_o_p_s : 8377 (4)
Patbert : 7761 (6)
TANSTAAFL : 4319 (9)
Sir Sapo : 4127 (1)
Laz : 3889 (1)
Ravuya : 3732 (11)
MDickie : 3551 (3)
Evil Steve : 2855 (4)
urs : 2539 (1)
FenrirWolf : 2354 (2)
capn_midnight : 2290 (8)
Degra : 2247 (2)
EnemyBoss : 2201 (5)
Stompy9999 : 2192 (6)
Mark Currie : 1998 (1)
noaktree : 1928 (2)
Prog101 : 1867 (3)
vetroXL : 1601 (1)
LamerGamer : 1371 (1)
Stephen R : 1215 (3)
EDI : 1077 (1)
Tera_Dragon : 1038 (2)
Lab-Rat : 1005 (2)
Samith : 994 (2)
ildave1 : 952 (2)
falkone : 931 (1)
Rixter : 928 (2)
Downer : 920 (2)
Dave : 845 (2)
PennstateLion : 831 (3)
ManaStone : 811 (2)
superlubo : 769 (1)
johnhattan : 756 (1)
syn9 : 746 (1)
EvDaedalus : 734 (2)
Rob Loach : 731 (2)
SiCrane : 731 (1)
Programmer16 : 730 (2)
Eddie Hicks : 708 (2)
Scet : 699 (2)
Jesse_P : 681 (3)
markr : 678 (2)
HandCraftedRadio : 671 (3)
denthorq : 651 (1)
Mithrandir : 638 (1)
ols : 573 (1)
meix : 572 (2)
Emmanuel Deloget : 558 (1)
Pouya : 544 (1)
boto : 525 (1)
Jason Z : 518 (2)
Extrarius : 483 (1)
rpg_code_master : 482 (1)
xaver : 458 (2)
rick_appleton : 454 (1)
Kuro : 451 (1)
TyroWorks : 445 (2)
jarthur : 413 (1)
Herb3 : 393 (1)
Eleventy : 382 (1)
Asheh : 381 (1)
jochenstier : 366 (1)
Aardvajk : 365 (1)
RingTek : 352 (1)
JTippetts : 350 (1)
Trapper Zoid : 348 (1)
kentcb : 343 (1)
Brandon N : 338 (1)
Ceoddyn : 331 (1)
Colin Jeanne : 329 (1)
lethalhamster : 328 (1)
coldacid : 327 (2)
DavidNeal : 306 (1)
chadmeyers : 287 (1)
modemancer : 287 (1)
deurrific : 285 (1)
SDyer : 282 (1)
cm2 : 279 (1)
a_insomniac : 275 (1)
DecipherOne : 275 (1)
The Forgotten Mindset : 269 (1)
3dmodelerguy : 263 (1)
Etherstar : 263 (1)
robpers2003 : 262 (1)
AntiGuy : 244 (1)
SteelGolem : 243 (1)
Crypter : 235 (1)
kylecrass : 234 (1)
deerslyr1 : 234 (1)
Xloner12 : 228 (1)
Mushu : 213 (1)
snard6 : 212 (1)
Namatsu : 210 (1)
syn_9 : 209 (1)
jazzuo : 201 (1)
DukeAtreides076 : 190 (1)
chronicle17 : 184 (1)
Sep : 182 (1)
Verg : 173 (1)
Stagz : 161 (1)
trailervoice : 149 (1)
fortia : 146 (1)
sprite_hound : 142 (1)
jasong : 139 (1)
Drilian : 138 (1)
jman2050 : 138 (1)
superpig : 135 (1)
eppo : 132 (1)
valles : 132 (1)
graveyard filla : 129 (1)
PerO : 128 (1)
PumpkinPieman : 121 (1)
Black Knight : 120 (1)
xtBones : 113 (1)
diablo_tk : 111 (1)
HeftiSchlumpf : 96 (1)
DrSizzla : 89 (1)
Mak : 81 (1)
staaf : 41 (1)
dwarfsoft : 31 (1)
volking : 22 (1)
if you would like to play around with my scraper, here's the C# code. Sorry for the sloppy processing, it's not meant to be a long-term project:
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using System.Text.RegularExpressions;
namespace GDS_Showcase_Stats
{
class Program
{
static void Main(string[] args)
{
var data = "";
//cache the page locally so that we don't keep pinging the server every time we want to
//run a test on the data
if (!File.Exists("data.txt"))
{
var req = HttpWebRequest.Create("http://www.gamedev.net/community/gds/");
var rep = req.GetResponse();
using (var reader = new StreamReader(rep.GetResponseStream()))
{
data = reader.ReadToEnd();
File.WriteAllText("data.txt", data);
}
}
else
data = File.ReadAllText("data.txt");
var tablePat = new Regex("Newest Updates.*?</table>", RegexOptions.Singleline);
var table = tablePat.Match(data).Value;
var rowPat = new Regex("<tr>.*?</tr>", RegexOptions.Singleline);
var cellPat = new Regex("<td.*?</td>", RegexOptions.Singleline);
var titlePat = new Regex("<b>.*?</b>", RegexOptions.Singleline);
var authorPath = new Regex("by .*?<", RegexOptions.Singleline);
var numPat = new Regex(" \\d+? ");
var skip = true;
var numGames = new Dictionary<string, int[]>();
foreach (var match in rowPat.Matches(table))
{
if (skip)
skip = false;
else
{
//strip out a bunch of HTML that I didn't want to figure out a more complex regex for.
var matches = cellPat.Matches(match.ToString());
var title = titlePat.Match(matches[0].Value).Value;
title = title.Substring(title.IndexOf('>', 5) + 1);
title = title.Substring(0, title.IndexOf('<'));
var author = authorPath.Match(matches[0].Value).Value;
author = author.Substring(3, author.Length - 4);
var dateStr = matches[1].Value;
dateStr = dateStr.Substring(dateStr.IndexOf(';') + 1);
dateStr = dateStr.Substring(0, dateStr.IndexOf('&'));
var date = DateTime.Parse(dateStr);
var numStr = numPat.Match(matches[2].Value).Value;
numStr = numStr.Substring(numStr.IndexOf(';') + 1);
numStr = numStr.Substring(0, numStr.IndexOf('&'));
int num = int.Parse(numStr);
///Do your calculations per record here
if (!numGames.ContainsKey(author))
numGames.Add(author, new int[2]);
numGames[author][0]++;
numGames[author][1] += num;
}
}
//a little sorting
var orderedPairs = (from x in numGames
select new
{ Author = x.Key, Games=x.Value[0], Downloads = x.Value[1] }
).OrderByDescending(y => y.Downloads);
//and some output
var sb = new StringBuilder();
foreach (var pair in orderedPairs)
sb.AppendFormat("{0} : {2} ({1})\r\n", pair.Author, pair.Games, pair.Downloads);
File.WriteAllText("res.txt", sb.ToString());
}
}
}