2010-03-24 6 views
11

Estoy tratando de construir una expresión regular que se evalúe como true para User-Agent: s de "navegadores navegados por humanos", pero falso para bots. Huelga decir que la coincidencia no será exacta, pero si hace las cosas bien, digamos que el 90% de los casos es más que suficiente.Regexp que coincide con user-agents de navegadores de usuario final pero NO con 90% de precisión

Mi enfoque hasta ahora es apuntar a la cadena User-Agent de los cinco principales navegadores de escritorio (MSIE, Firefox, Chrome, Safari, Opera). Específicamente, quiero que la expresión regular NO coincida si el usuario-agente es un robot (Googlebot, msnbot, etc.).

Actualmente estoy usando la siguiente expresión regular que aparece para lograr la precisión deseada:

^(Mozilla.*(Gecko|KHTML|MSIE|Presto|Trident)|Opera).*$ 

que he observado pequeño número de falsos negativos que son sobre todo los navegadores móviles. Las excepciones todos los partidos:

(BlackBerry|HTC|LG|MOT|Nokia|NOKIAN|PLAYSTATION|PSP|SAMSUNG|SonyEricsson) 

Mi pregunta es: Teniendo en cuenta el nivel de precisión deseado, ¿cómo mejorar la expresión regular? ¿Puedes pensar en falsos positivos o falsos negativos importantes para la expresión regular dada?

Tenga en cuenta que la pregunta es específicamente sobre la coincidencia con expresiones regulares User-Agent. Hay muchos otros enfoques para resolver este problema, pero están fuera del alcance de esta pregunta.

+1

¿Cuál de los robots que se identifican como los navegadores? – Macha

+0

Macha: Obviamente se clasificarán como navegadores. Pero mientras estos sean raros, no serán un problema dado el objetivo de precisión establecido. – knorv

+0

Sí, errybody ejecutando un robot a través de su sitio web es honesto. La mejor solución es reconsiderar lo que está haciendo aquí y cómo lo está haciendo. La mayoría de las personas prefiere detectar bots por comportamiento (muchas páginas diferentes en un período de tiempo muy corto) en lugar de agente de usuario. – Will

Respuesta

7

Muchos rastreadores no envían un encabezado Aceptar idioma, mientras que AFAIK lo hacen todos los navegadores. Puede combinar esta información con su expresión regular para obtener resultados más precisos.

+0

El único que he visto que desobedece es sorber: [Mozilla/5.0 (compatible; Yahoo! Slurp; http://help.yahoo.com/help/us/ysearch/slurp)] [en-us, en ; q = 0.5] y también si usted está publicando medios entonces creo que a veces los complementos del navegador hacen una solicitud sin Accept-Language si está en IE (entonces eso es un no-bot, pero no envía Accept-Language). Además, Google translate no envía un Accept-Language, pero en general este método parece funcionar bien. – rogerdpack

+0

Entonces, en cuanto a la lógica: ¿estás pensando 'if (regex_matches || has_header) {is_human}' o estás pensando 'if (regex_matches && has_header) {is_human}' será mejor –

+0

@ NathanJ.Brauer 'AND' , no 'OR '. Todavía no es absolutamente confiable, pero eso no es posible de todos modos. – fuxia

22

Puede construir una lista negra comprobando qué agentes de usuario acceden a robots.txt.

+0

¡Concepto interesante! Manera de pensar fuera de la caja. –

+0

¡Increíble idea! Quería darte props y votar por eso también :). –

4

Prefiero usar el contrario, tiene un patrón de los robots es mucho más simple

personalmente utilizo la siguiente expresión regular

/bot\b|index|spider|crawl|wget|slurp|Mediapartners-Google/i 
+1

Eso es peligroso. He filtrado esto 'Mozilla/5.0 (Linux; U; Android 3.0.1; en-us; Botella de humo compilada/HRI66) AppleWebKit/534.13 (KHTML, como Gecko) Versión/4.0 Safari/534.13 ', y solo ejecuté esto en un subconjunto de agentes de usuario que jamás hayamos visto. –

+0

'/ bot \ b | ...' :-) Sin embargo, no estoy seguro acerca del 'índice', ya que algunos complementos hacen algunas cosas raras a las cadenas del agente de usuario (especialmente en IE, empujando la longitud) – Tracker1

Cuestiones relacionadas