öffnen Tags

öffnen Kategorien

Vom WebReader vorlesen lassen

PHP: Referrer parsen

06. Jan 2010, 01:09

Ich habe heute wieder ein wenig an meiner Plattform herum gebastelt, unter Anderem gibt es jetzt auch eine Mailadresse von mir auf der Kontakt-Seite zu finden. Die anderen Änderungen fanden eher im Admin-Bereich statt, den (hoffentlich) keiner von euch sehen kann.
Eine der Verbesserung ist ein Referrer-Parser, der mir aus den Referrern der Besucher, die von einer Suchmaschine zu mir gelangten, die gesuchten Begriffe ausließt und anzeigt.

Diese Geschichte war nicht so trivial wie anfangs gedacht, jede Suchmaschine benutzt andere Parameter um den Suchstring zu codieren, selbst innerhalb der Suchmaschinen kommt es zu Unterschieden. So lange sich die Betreiber nicht über einen Standard einigen, muss man jeder Engine ihre eigene Wurst gönnen und alle getrennt behandeln. Es hat mich mehrere Stunden gekostet, die wohl üblichsten zu erfassen.

Hier also das Array weswegen die meisten wohl hier gelandet sind:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
$search_engines = array(
'Google Images' => array( 'server' => 'images.google', 'var' => array('q') ),
'Google' => array( 'server' => 'google', 'var' => array('q', 'as_q') ),
'Bing' => array( 'server' => 'bing.com', 'var' => array('q') ),
'Yahoo!' => array( 'server' => 'yahoo', 'var' => array('p') ),
'HotBot' => array( 'server' => 'hotbot.com', 'var' => array('query', 'MT') ),
'Lycos' => array( 'server' => 'lycos', 'var' => array('query') ),
'live.com' => array( 'server' => 'live.com', 'var' => array('q') ),
'AllTheWeb' => array( 'server' => 'alltheweb.com', 'var' => array('q') ),
'Altavista' => array( 'server' => 'altavista', 'var' => array('q', 'r') ),
'Alexa' => array( 'server' => 'alexa', 'var' => array('q') ),
'MSN' => array( 'server' => 'msn', 'var' => array('q', 'MT') ),
'Search.com' => array( 'server' => 'search.com', 'var' => array('q', 'QUERY') ),
'IlTrovatore' => array( 'server' => 'iltrovatore.it', 'var' => array('q') ),
'Web.de' => array( 'server' => 'suche.web.de', 'var' => array('su') ),
'T-Online' => array( 'server' => 't-online.de', 'var' => array('q') ),
'Fireball' => array( 'server' => 'fireball.de', 'var' => array('query') ),
'Overture' => array( 'server' => 'overture.com', 'var' => array('Keywords') ),
'Netscape (DE)' => array( 'server' => 'search.netscape.de', 'var' => array('q') ),
'Netscape' => array( 'server' => 'search.netscape.com', 'var' => array('query') ),
'AOL (DE)' => array( 'server' => 'suche.*.aol', 'var' => array('q') ),
'AOL' => array( 'server' => 'search.aol', 'var' => array('query', 'encquery') ),
'Excite' => array( 'server' => 'excite.com', 'var' => array('search', 'FI_1', 's') ),
'Excite (DE)' => array( 'server' => 'excite.de', 'var' => array('q') ),
'Metacrawler' => array( 'server' => 'metacrawler.com', 'var' => array('general') ),
'Infoseek' => array( 'server' => 'infoseek.com', 'var' => array('qt') ),
'DogPile' => array( 'server' => 'dogpile.com', 'var' => array('q') ),
'Webcrawler' => array( 'server' => 'webcrawler.com', 'var' => array('searchText', 'search') ),
'Inference Find' => array( 'server' => 'inference.com', 'var' => array('query') ),
'Anzwers' => array( 'server' => 'anzwers.ozemail.net', 'var' => array('MT') ),
'GoTo.com' => array( 'server' => 'goto.com', 'var' => array('Keywords') ),
'Highway 61' => array( 'server' => 'highway61.com', 'var' => array('string') ),
'Yellow Pages' => array( 'server' => 'altavista.yellowpages.com.au', 'var' => array('q') ),
'LookSmart' => array( 'server' => 'looksmart.com', 'var' => array('key', 'qt') ),
'Snap' => array( 'server' => 'snap.com', 'var' => array('keyword') ),
'Ask Jeeves' => array( 'server' => 'askjeeves.com', 'var' => array('ask', 'MetaTopic') ),
'Developer.com' => array( 'server' => 'developer.com', 'var' => array('search') ),
'Magellan' => array( 'server' => 'mckinley.com', 'var' => array('search') ),
'1Blink' => array( 'server' => '1blink.com', 'var' => array('q') ),
'Go2Net' => array( 'server' => 'go2net.com', 'var' => array('general') ),
'Go.com' => array( 'server' => 'go.com', 'var' => array('qt') ),
'Excite (UK)' => array( 'server' => 'excite.co.uk', 'var' => array('search') ),
'Voila' => array( 'server' => 'search.ke.voila.fr', 'var' => array('rdata') ),
'Arcor' => array( 'server' => 'arcor.de', 'var' => array('Keywords') ),
'Ask Jeeves (ask.com)' => array( 'server' => 'ask.com', 'var' => array('q') ),
'Teoma' => array( 'server' => 'teoma.com', 'var' => array('q') ),
'WiseNut' => array( 'server' => 'wisenut', 'var' => array('q') ),
'Gigablast' => array( 'server' => 'gigablast.com', 'var' => array('q') ),
'Quepasa' => array( 'server' => 'quepasa.com', 'var' => array('q') ),
'My Web Search' => array( 'server' => 'mywebsearch.com', 'var' => array('searchfor') ),
'Baidu' => array( 'server' => 'baidu.com', 'var' => array('word') ),
'Walhello' => array( 'server' => 'walhello', 'var' => array('key') ),
'Naver' => array( 'server' => 'naver.co.jp', 'var' => array('query') ),
'Exalead' => array( 'server' => 'exalead', 'var' => array('q') ),
'dir.com' => array( 'server' => 'dir.com', 'var' => array('req') ),
'Google Cache' => array( 'server' => '216.239.37.104', 'var' => array('q') ),
'Freenet' => array( 'server' => 'freenet', 'var' => array('query') ),
'Vienna Online: Finder' => array( 'server' => 'finder.vienna.at', 'var' => array('query') ),
'AT:Search' => array( 'server' => 'atsearch.at', 'var' => array('qs') ),
'search.ch' => array( 'server' => 'search.ch', 'var' => array('q') ),
'Bluewin' => array( 'server' => 'search.bluewin.', 'var' => array('qry', 'query') ),
'Seekport' => array( 'server' => 'seekport', 'var' => array('query') ),
'Kvasir' => array( 'server' => 'kvasir.no', 'var' => array('q'))
);

Das assoziative Array besteht aus Keys, den Suchmaschinennamen, die auf ein weiteres Array zeigen, in dem Daten zu der jeweiligen Suchmaschine stehen. Dieses Datenarray ist ebenfalls assoziativ und hat zwei Einträge, zum einen zeigt der Key server auf ein Pattern, das den Hostnamen herausfiltern soll, der Key var ist wiederum ein Array, das die einzelnen Variablen beinhaltet, in denen der Suchstring stehen könnte.

Ziemlich komplex, aber die beste Lösung die mir in den Sinn kam.

Der Rest ist eigentlich Formsache, sei hier trotzdem erläutert. Will man nun für einen Referrer die Suchbegriffe herausfinden, durchläuft man das Array, prüft ob der Hostpattern matched und ob in den Suchvariablen etwas enthalten ist:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
foreach ($referrer as $ref)
{
$parsed = parse_url ($ref);
if (!$parsed["query"]) return false;
parse_str ($parsed["query"], $query);

foreach ($search_engines as $engine => $val)
{
$found = false;
if (preg_match ("/".$val['server']."/i", $parsed["host"]))
{
foreach ($val["var"] as $var)
{
$search_string = urldecode ($query[$var]);
if (empty ($search_string))
continue;
else
{
$erg[$engine][$search_string]++;
$found = true;
break;
}
}
}
if ($found) break;
}
}

Interessant sind hierbei vielleicht die Funktionen parse_url, die eine URL in seine Bestandteile zerlegt, für uns sind hier nur der Host und Query wichtig. In Query stehen die Variablen die per GET mitgeliefert wurden, also auch der Suchstring.
Mit parse_str kann man diesen Query-String so konvertieren, dass man Problemlos auf die einzelnen Variablen zugreifen kann.
Außerdem möcht ich noch auf urldecode hinweisen, damit formatiert man die in der URL codierten Sonderzeichen zurück.

Das ist im Prinzip alles, was man an Handwerkszeug benötigt. Der Code hat ein Array gefüllt, das zum Schluss noch ausgegeben werden muss:

1
2
3
4
5
6
asort ($erg);
foreach ($erg as $engine => $searches)
{
arsort ($searches);
echo "</p><table><tr><th>".$engine." <small>(".count ($searches).")</small></th></tr>"; foreach ($searches as $s => $times) echo "<tr><td>".$s." <small>(".$times.")</small></td></tr>"; echo "</table><p>";
}

Voilà, damit ist der Parser fertig und liefert Ergebnisse, die folgendem ähneln:

Google (3)
Begriff A (3)
Begriff B (2)
Begriff C (1)

Tags: PHP Software Statistik Web

Kategorien: Software Web Webdesign

© 2009-2018 by Martin Scharm