Archive for Mai 27th, 2009

27
Mai

Google Suggest Logfile Analyse

   Posted by: SEO-Xplorer    in Werkzeuge

Jan Kutschera hat auf seinem SEO Punk Blog eine sehr leicht nachvollziehbare Anleitung veröffentlicht, wie man mit Google Analytics „sehen“ kann, was die Suchenden bei Google tatsächlich eingegeben haben und zu was sie sich dann von Google Suggest haben überreden lassen tatsächlich zu suchen…

Da dies aber über Google-Analytics Filter läuft, und also nur ab dem Moment der Erstellung dieser Filterfunktion erfasst wird, dauert es – je nach Suchvolumen das eine Site abbekommt – u.U. relativ lange, bis man ein statistisch relevantes Datenvolumen gesammelt hat.

Das, und dass, wahrscheinlich ja nicht jeder überhaupt Google Analytics einsetzt, hat mich dazu bewegt, doch mal zu sehen, ob man nicht doch noch eine ex-post Auswertung über die Server-Logfiles hinbekommt, und bin zu folgendem Ergebnis gelangt:

Annahmen:
das Webserver Logfile heisst: access_log (default bei apache)
und hat das LogFormat combined: („%h %l %u %t „%r“ %>s %b „%{Referer}i“ „%{User-Agent}i““ – ist i.d.R. auch so defaultmäßig eingestellt)

Als erstes extrahieren wir mit egrep alle Logeinträge, die als Referrer eine Google Suche haben:

egrep ‚“http://([^./]+.)*google.‘ access_log > google-search

im nächsten Schritt dampfen wir die Informationen so ein, dass wir nur noch die Landingpage und den Referrer (ohne das http://) getrennt durch ein Leerzeichen in jeder Zeile stehen haben.

sed ’s/^[^“]*“GET ([^ ]*) [^“]*“[^“]“http://([^“]*)“.*$/1 2′ <google-search >google-search-stripped

so, und hierüber lassen wir nun ein kleines php-script laufen, das uns die Informationen in zwei MySQL-Tabellen einträgt :

<?php
$conf[‚dbserver‘] = ‚localhost‘;
$conf[‚database‘] = ; // Datenbank-Name
$conf[‚dbuser‘] = ; // Datenbank-UserID
$conf[‚password‘] = ; // Datenbank-Passwort
$conf[‚tableprefix‘] = ‚gsx_‘;
$conf[‚filename‘] = ‚google-search-stripped‘;
 
$IN = fopen($conf[‚filename‘],‚r‘);
 
$dbconn = mysql_connect($conf[‚dbserver‘], $conf[‚dbuser‘], $conf[‚password‘]) OR die(mysql_error());
 
mysql_select_db($conf[‚database‘]) OR die(mysql_error());
 
$sql = sprintf(‚DROP TABLE IF EXISTS %squeries, %sparms‘,$conf[‚tableprefix‘],$conf[‚tableprefix‘]);
mysql_query($sql) OR die(mysql_error());
$sql = sprintf(‚CREATE TABLE %squeries (id bigint AUTO_INCREMENT PRIMARY KEY, landingpage text, googledomain varchar(25), querystring text, q text, hl varchar(3) DEFAULT NULL, aq varchar(3) DEFAULT NULL, oq text DEFAULT NULL, cd varchar(3) DEFAULT NULL, start varchar(4) DEFAULT NULL, aqi varchar(3) DEFAULT NULL)‘,$conf[‚tableprefix‘]);
mysql_query($sql) OR die(mysql_error());
$sql = sprintf(‚CREATE TABLE %sparms (id bigint, parm varchar(15) NOT NULL, val varchar(255))‘,$conf[‚tableprefix‘]);
mysql_query($sql) OR die(mysql_error());
 
while (!feof($IN)) {
   $line = fgets($IN, 4096);
   list($landingpage, $referrer) = split(‚ ‚,$line);
   list($googledom, $querystring) = split(?,$referrer);
 
   $sql = sprintf(‚INSERT INTO %squeries (landingpage, googledomain, querystring) VALUES ("%s", "%s", "%s")‘,$conf[‚tableprefix‘],$landingpage,$googledom,$querystring);
   mysql_query($sql) OR die(mysql_error());
   $id = mysql_insert_id();
 
   $parmpairs = split(‚&‘,$querystring);
   foreach ($parmpairs as $parmpair) {
      list($parm,$value) = split(‚=‘,$parmpair);
      $parms[$parm] = $value;
 
      $sql = sprintf(‚INSERT INTO %sparms (id, parm, val) VALUES (%d, "%s", "%s")‘,$conf[‚tableprefix‘],$id, $parm,$value);
      mysql_query($sql) OR die(mysql_error());
      switch($parm) {
         case ‚q‘:
         case ‚hl‘:
         case ‚aq‘:
         case ‚oq‘:
         case ‚cd‘:
         case ’start‘:
         case ‚aqi‘:
            $sql = sprintf(‚UPDATE %squeries SET %s = "%s" WHERE id=%d‘,$conf[‚tableprefix‘],$parm,$value,$id);
            mysql_query($sql) OR die(mysql_error());
            break;
         default:
            break;
      }
 
      $parmcount[$parm]++;
   }
}
fclose($IN);
mysql_close($dbconn);
asort($parmcount);
var_dump(array_reverse($parmcount));
?>

Jetzt haben wir alle Daten in den Tabellen. Die für die Google-Suggest Betrachtung interessantesten Google-Parameter
(q = (Query) der Suchstring nachdem tatsächlich gesucht wurde,
hl = Sprache in der gesucht wurde,
oq = (Original Query) das was der User eingegeben hat, bevor er einen Suchvorschlag ausgewählt hat,
aq = (Assited Query) Position des Suchvorschlags in der Suchvorschlagsliste – beginnend mit 0 – und ggf. mit zusätzlichen Infos erweitert,
cd = Ranking Position der eigenen Landingpage in den Suchergebnissen,
start = „Ergebnis-Seiteninformation“,
aqi = ? (vielleicht Assisted Query Index?) – hier stehen so werte wie ‚g2‘, ‚g10‘ drin – meine sehr unsichere Vermutung: Anzahl der Suchvorschläge in der Suchvorschlagsliste)
haben wir auch direkt in der Haupt-Tabelle, so dass die ersten einfachen SQL-Queries sich nur auf diese Tabelle beschränken können:

Bspl: Liste der Landingpages, Queries, Position des Suchvorschlags in der Suchvorschlagsliste, die Original Suche, und die Häufigkeit für alle Assisted Queries, d.h. die Suchen bei denen Google Suggest verwendet wurde:

SELECT landingpage, q, aq, oq, count(*) as anzahl FROM gsx_queries WHERE aq IS NOT NULL AND aq != ‚f‘ AND aq != ‚t‘ GROUP BY landingpage, q, aq, oq ORDER BY anzahl DESC, aq ASC, oq ASC

Natürlich gibts das Ganze auch zum Download.

(Für Linux-Kisten dürften alle Tools (grep, sed, php, mysql) bereits vorhanden sein. Für die Auswertung empfiehlt es sich z.B. phpMyAdmin installiert zu haben 🙂 .

Wenns denn mit Windows sein muss (Scripte nicht getestet!): hier findet man die entsprechenden Tools: grep, sed, php, MySQL)

Noch ein Wort zum Abschluß: Im Vergleich zur Analyse mit einem Web-Analyse-Tool ist dies in vielen Aspekten unterlegen, aber für eine erste Analyse was man eigentlich wirklich messen kann und möchte ist mir eine solche Script-Lösung immer recht hilfreich, da man mit so etwas sehr flexibel – wenn auch nicht besonders komfortabel – in den Daten stöbern kann…

…und wie immer: Kommentare und Verbesserungsvorschläge jederzeit willkommen 🙂

Weitere Artikel zum Thema Google Suggest: FridayNite, Sistrix, Jojo, Bastian, …

Tags: , , ,