Es gibt keine Regeln für User-Agent-Strings, daher gibt es keine Möglichkeit, einen vollständig korrekten und zukunftssicheren Parser zu erstellen. Es gibt jedoch ein allgemeines Muster:
User-Agent: <engine-string> <engine-string> ...
Wobei engine-string
hat die Form:
<agent-name> (<comment>; <comment>; ...)
Jeder Engine-String (ich habe ihn nach meinem Verständnis nur so genannt, das ist möglicherweise nicht korrekt) kann Kommentare enthalten oder nicht.
Zum Beispiel:
Mozilla/5.0 (iPhone; CPU iPhone OS 6_0 like Mac OS X) ↲
AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A5376e ↲
Safari/8536.25 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)
(Dies ist eine einzelne Zeichenfolge, ich habe sie einfach in Zeilen aufgeteilt.) Es scheint, als ob jemand, wenn er einen Fork einer Browser-Engine erstellt, sein Ding einfach an das Ende anhängt. Wir haben also einen abstrakten „Mozilla“-Browser (ein Erbe des „Ersten Browserkriegs“), der glaubt, er sei auf dem iPhone. Dann sehen wir, dass es ein WebKit gibt (das sich daran erinnert, dass es vor langer Zeit als KHTML geboren wurde). Dann gibt es eine Version/6.0-Modifikation, die dann in Mobile/10A5376e geändert wurde, was zu Safari/8536.25 wurde, was schließlich das Geheimnis enthüllt, dass es sich tatsächlich um einen mobilen Google-Bot handelt.
Ein weiteres Beispiel:
Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; GTB7.4; ↲
InfoPath.1; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30; .NET CLR 3.0.4506.2152; ↲
.NET CLR 3.5.30729; .NET CLR 1.1.4322)
Dies ist eine einzelne Engine, aber sie hat in Klammern viel zu sagen.
Die allgemeine Beobachtung lautet also:
- Die letzten Engine-Strings sind am wichtigsten,
- letzte Kommentare in Klammern sind weniger wichtig.
In Anbetracht dessen wäre meine Idee, die Zeichenfolge in diese Engine- und Kommentar-Tokens zu zerlegen und dann von jedem Engine-Abschnitt Kommentare wegzuwerfen, die beispielsweise ab dem fünften beginnen. Dann, wenn es immer noch nicht reicht, Engine-Abschnitte ab dem zweiten wegwerfen (der erste ist oft ein abstraktes "Mozilla", hat aber oft nützliche Kommentare; manchmal ist es auch etwas Konkretes, besonders für Webcrawler).
Beim Parsen müssen wir berücksichtigen, dass es gelegentlich Zeichenfolgen geben kann, die diesem Format nicht folgen. Sie können zur späteren Überprüfung in einer Protokolldatei gespeichert und dann einfach auf die benötigte Länge zugeschnitten werden, damit sie in die Datenbank passen.