Anche io ho avuto i tuoi problemi in passato. Ci sarebbe una classe in ASP (Client Capabilities), ma lasciala perdere...

Io ho parzialmente risolto creandomi una tabella di database che associa dei browser (o spider) a dei pattern: se un pattern è presente in HTTP_USER_AGENT, allora il browser è identificato (più o meno quello che fai tu, ma li pesco da una tabella e non sono "hardcoded"). Poi, per ogni browser, ho associato le "capabilities" (supporto frame, supporto javascript, ecc. - credo a te non interessino). Tu potresti fare una cosa simile indicando se quello riconosciuto è un browser o un crawler.

Quando scopro nuovi pattern, aggiungo nuovi record alla tabella.

Il problema è la performance. Per ottimizzare il tutto tengo un log delle connessioni con già precalcolato il browser identificato al momento del primo accesso. Eseguire la scansione in fase di computazione delle statistiche rappresenta un suicidio (la tabella conta un migliaio di record, e non è possibile usare join).

D'altro canto, se aggiorno la tabella, devo parsare nuovamente tutto il log degli accessi, ma questo non avviene cosi' frequentemente.