Analyzing Blog hit statistics

It takes a lot of work to create the blog posts and code samples that I put in my blog, and I was curious about getting more detailed statistics about the posts.

I already aggregate some statistics for Microsoft Bloggers (see What is a Microsoft MVP? Calvin's List updated for the new century), but I was curious about which of my posts was the most downloaded, etc

I was watching the statistics accumulate in the log and I noticed that a few were hit much more often than others, especially as a result of a Google search.

The Referrer URL is something like https://www.google.com/search?sourceid=navclient&ie=UTF-8&rls=GGLG,GGLG:2006-25,GGLG:en&q=remote%20desktop%20ctrl%20alt%20del

The after UnEscaping it looks like this:

“https://www.google.com/search?sourceid=navclient&ie=UTF-8&rls=GGLG,GGLG:2006-25,GGLG:en&q=remote desktop ctrl alt del”

(See also Handling arbitrary strings in URLs: Escape, InternetCanonicalizeUrl, WinHttpCrackUrl and URI.EscapeUriString)

So I wrote 4 lines of code to query the hit statistics. They query the statistics for the Google click-throughs: when a user did a Google search for some string and clicked a result that was one of my blog posts. The code parses out the Google query string to make it easier to read.

SELECT *,PADR(SUBSTR(ref,AT("q=",ref)+2),200) as qexp FROM bloglog WHERE "google"$ref INTO CURSOR results readwrite

REPLACE qexp WITH LEFT(qexp,AT("&",qexp)-1) for AT("&",qexp)>0 all

SELECT title,qexp FROM results ORDER BY 1

SELECT title,COUNT(*) FROM results ORDER BY 2 DESC GROUP BY 1

With just a few days of statistics, the number of hits from Google for Reboot from remote desktop was far higher than any other post. Perhaps the remote desktop feature needs to make it more obvious how to reboot the remote machine.

    # hits Title

         595 Reboot from remote desktop

         254 What is a C0000005 crash?

          97 Calvin Hsia's WebLog

          45 Creating a VFP application as a service:

          43 Visual FoxPro

          35 I want my own email! MSN Premium

          34 Print a t-shirt

          32 Cold Solder Joint

          30 Generating VBScript to read a blog

          29 Creating your own web browser for your SmartPhone

          27 How to use DEVMODE

          25 SQL Select data from a text file

          24 Binding to Internet Explorer events: bug in Typelibrary

          22 Start your Screen Saver NOW!

          20 Dr. Watson: Please send in your error report

          19 How to protect your web site pictures from being saved

          19 Write your own Task Manager

          18 Use Windows 2003 Server and remote desktops for debugging

          18 What happens if external code throws an exception?

          17 A Visual Basic COM object is simple to create, call and debug from Excel

          17 Foxpro Performance tip: field name lookup for tables

The search strings that lead to my blogs are interesting too.

For this entry: Generating VBScript to read a blog, these were the search strings that were given to Google, which people then clicked on to get my blog post:

  vb scripting replace

  wsh quotes vbscript

  wscript + read text with delimiter

  WinHttpRequest VB help

  read rss title by vbscript

  vb script read rss title

  MSXML.DOMDocument vbscript

  vbscript InternetExplorer.Application

  html vbscript value read

  winhttp createobject vbscript

  InternetExplorer.Application VBScript get text

  ASP -".net" transformNode CreateTextFile VBScript

  vbscript read html InternetExplorer.Application

  If command for a vb script

  winhttp vbscript

  read html internetexplorer.application

  example xsl-xml-rss

  example xsl-xml-rss

  example xsl-xml-rss

  quotes in vb script

  WinHttp.WinHttpRequest.5.1 hosting script

  CreateObject("WinHttp.WinHttpRequest.5") .Open "Get"

  vbs "internetexplorer.application" createobject

  script vbs CreateObject msxml

  vb script to read text file

  transform xml in html vbscript

  vbscript DOMDocument

  read rss using vbscript

  vb scripting replace

  oHttp.send