Pregunta

Me gustaría detectar (en el lado del servidor) que las solicitudes son de bots.No me importa acerca de los bots maliciosos en este punto, los únicos a los que están jugando bien.Yo he visto un par de enfoques que involucran la mayoría de la coincidencia de la cadena de agente de usuario en contra de palabras clave como "robot".Pero que parece torpe, incompleta, y tanto.Así que ¿alguien tiene alguna más sólidos planteamientos?Si no, ¿tiene los recursos que utiliza para mantenerse al día con todos los amables agentes de usuario?

Si tienes curiosidad:No estoy tratando de hacer algo en contra de cualquier motor de búsqueda de la política.Tenemos una sección de la web donde un usuario al azar presentó con una de las varias versiones ligeramente diferentes de una página.Sin embargo, si un web crawler es detectado, nos gustaría que siempre les dan la misma versión, de forma que el índice es consistente.

También estoy usando Java, pero me imagino que el enfoque sería similar para cualquier tecnología del lado del servidor.

¿Fue útil?

Solución

Usted puede encontrar una base de datos muy completa de datos sobre conocidos "buenas" rastreadores web en el robotstxt.org Robots base de datos. Utilizando estos datos, sería mucho más eficaz que simplemente a juego bot en el agente de usuario.

Otros consejos

Usted dijo que la coincidencia de que el agente de usuario "robot" puede ser difícil, pero hemos encontrado un muy buen partido.Nuestros estudios han demostrado que cubrirá aproximadamente el 98% de los golpes que recibe.Tambien no he encontrado ningún falso positivo partidos todavía.Si desea aumentar este hasta el 99,9%, se pueden incluir algunas otras conocidas partidos como 'rastreador', 'baiduspider', 'ia_archiver', 'curl' etc.Hemos probado en nuestros sistemas de producción a lo largo de millones de visitas.

Aquí hay un par de soluciones de c# para usted:

1) más Simple

Es la forma más rápida cuando el procesamiento de una miss.es decir,el tráfico de un no-bot – un usuario normal.Las capturas más del 99% de los rastreadores.

bool iscrawler = Regex.IsMatch(Request.UserAgent, @"bot|crawler|baiduspider|80legs|ia_archiver|voyager|curl|wget|yahoo! slurp|mediapartners-google", RegexOptions.IgnoreCase);

2) Medio

Es la forma más rápida cuando el procesamiento de un golpe.es decir,el tráfico de un bot.Bastante rápido para que se pierde.Capturas de casi el 100% de los rastreadores.Los partidos de 'bot', 'rastreador', 'la araña' por adelantado.Usted puede agregar a cualquier otro conocido de los rastreadores.

List<string> Crawlers3 = new List<string>()
{
    "bot","crawler","spider","80legs","baidu","yahoo! slurp","ia_archiver","mediapartners-google",
    "lwp-trivial","nederland.zoek","ahoy","anthill","appie","arale","araneo","ariadne",            
    "atn_worldwide","atomz","bjaaland","ukonline","calif","combine","cosmos","cusco",
    "cyberspyder","digger","grabber","downloadexpress","ecollector","ebiness","esculapio",
    "esther","felix ide","hamahakki","kit-fireball","fouineur","freecrawl","desertrealm",
    "gcreep","golem","griffon","gromit","gulliver","gulper","whowhere","havindex","hotwired",
    "htdig","ingrid","informant","inspectorwww","iron33","teoma","ask jeeves","jeeves",
    "image.kapsi.net","kdd-explorer","label-grabber","larbin","linkidator","linkwalker",
    "lockon","marvin","mattie","mediafox","merzscope","nec-meshexplorer","udmsearch","moget",
    "motor","muncher","muninn","muscatferret","mwdsearch","sharp-info-agent","webmechanic",
    "netscoop","newscan-online","objectssearch","orbsearch","packrat","pageboy","parasite",
    "patric","pegasus","phpdig","piltdownman","pimptrain","plumtreewebaccessor","getterrobo-plus",
    "raven","roadrunner","robbie","robocrawl","robofox","webbandit","scooter","search-au",
    "searchprocess","senrigan","shagseeker","site valet","skymob","slurp","snooper","speedy",
    "curl_image_client","suke","www.sygol.com","tach_bw","templeton","titin","topiclink","udmsearch",
    "urlck","valkyrie libwww-perl","verticrawl","victoria","webscout","voyager","crawlpaper",
    "webcatcher","t-h-u-n-d-e-r-s-t-o-n-e","webmoose","pagesinventory","webquest","webreaper",
    "webwalker","winona","occam","robi","fdse","jobo","rhcs","gazz","dwcp","yeti","fido","wlm",
    "wolp","wwwc","xget","legs","curl","webs","wget","sift","cmc"
};
string ua = Request.UserAgent.ToLower();
bool iscrawler = Crawlers3.Exists(x => ua.Contains(x));

3) Paranoico

Es bastante rápido, pero un poco más lento que las opciones 1 y 2.Es la forma más precisa, y le permite mantener las listas, si quieres.Usted puede mantener una lista de nombres con "robot" en ellos si usted tiene miedo de falsos positivos en el futuro.Si obtenemos un corto partido que estamos de registro y comprobar que es un falso positivo.

// crawlers that have 'bot' in their useragent
List<string> Crawlers1 = new List<string>()
{
    "googlebot","bingbot","yandexbot","ahrefsbot","msnbot","linkedinbot","exabot","compspybot",
    "yesupbot","paperlibot","tweetmemebot","semrushbot","gigabot","voilabot","adsbot-google",
    "botlink","alkalinebot","araybot","undrip bot","borg-bot","boxseabot","yodaobot","admedia bot",
    "ezooms.bot","confuzzledbot","coolbot","internet cruiser robot","yolinkbot","diibot","musobot",
    "dragonbot","elfinbot","wikiobot","twitterbot","contextad bot","hambot","iajabot","news bot",
    "irobot","socialradarbot","ko_yappo_robot","skimbot","psbot","rixbot","seznambot","careerbot",
    "simbot","solbot","mail.ru_bot","spiderbot","blekkobot","bitlybot","techbot","void-bot",
    "vwbot_k","diffbot","friendfeedbot","archive.org_bot","woriobot","crystalsemanticsbot","wepbot",
    "spbot","tweetedtimes bot","mj12bot","who.is bot","psbot","robot","jbot","bbot","bot"
};

// crawlers that don't have 'bot' in their useragent
List<string> Crawlers2 = new List<string>()
{
    "baiduspider","80legs","baidu","yahoo! slurp","ia_archiver","mediapartners-google","lwp-trivial",
    "nederland.zoek","ahoy","anthill","appie","arale","araneo","ariadne","atn_worldwide","atomz",
    "bjaaland","ukonline","bspider","calif","christcrawler","combine","cosmos","cusco","cyberspyder",
    "cydralspider","digger","grabber","downloadexpress","ecollector","ebiness","esculapio","esther",
    "fastcrawler","felix ide","hamahakki","kit-fireball","fouineur","freecrawl","desertrealm",
    "gammaspider","gcreep","golem","griffon","gromit","gulliver","gulper","whowhere","portalbspider",
    "havindex","hotwired","htdig","ingrid","informant","infospiders","inspectorwww","iron33",
    "jcrawler","teoma","ask jeeves","jeeves","image.kapsi.net","kdd-explorer","label-grabber",
    "larbin","linkidator","linkwalker","lockon","logo_gif_crawler","marvin","mattie","mediafox",
    "merzscope","nec-meshexplorer","mindcrawler","udmsearch","moget","motor","muncher","muninn",
    "muscatferret","mwdsearch","sharp-info-agent","webmechanic","netscoop","newscan-online",
    "objectssearch","orbsearch","packrat","pageboy","parasite","patric","pegasus","perlcrawler",
    "phpdig","piltdownman","pimptrain","pjspider","plumtreewebaccessor","getterrobo-plus","raven",
    "roadrunner","robbie","robocrawl","robofox","webbandit","scooter","search-au","searchprocess",
    "senrigan","shagseeker","site valet","skymob","slcrawler","slurp","snooper","speedy",
    "spider_monkey","spiderline","curl_image_client","suke","www.sygol.com","tach_bw","templeton",
    "titin","topiclink","udmsearch","urlck","valkyrie libwww-perl","verticrawl","victoria",
    "webscout","voyager","crawlpaper","wapspider","webcatcher","t-h-u-n-d-e-r-s-t-o-n-e",
    "webmoose","pagesinventory","webquest","webreaper","webspider","webwalker","winona","occam",
    "robi","fdse","jobo","rhcs","gazz","dwcp","yeti","crawler","fido","wlm","wolp","wwwc","xget",
    "legs","curl","webs","wget","sift","cmc"
};

string ua = Request.UserAgent.ToLower();
string match = null;

if (ua.Contains("bot")) match = Crawlers1.FirstOrDefault(x => ua.Contains(x));
else match = Crawlers2.FirstOrDefault(x => ua.Contains(x));

if (match != null && match.Length < 5) Log("Possible new crawler found: ", ua);

bool iscrawler = match != null;

Notas:

  • Es tentador seguir añadiendo nombres a la regex la opción 1.Pero si haces esto va a ser más lento.Si desea una lista más completa, a continuación, linq con lambda es más rápido.
  • Asegúrese de que .ToLower() está fuera de su linq método – recuerde que el método es un bucle y que sería la modificación de la cadena durante cada iteración.
  • Siempre poner la mayor bots en el inicio de la lista, de modo que coincidan tarde.
  • Colocar las listas en una clase estática de modo que no se vuelve a generar en cada página vista.

Honeypots

La única alternativa real a este problema es crear un "honeypot" que aparece en su sitio web que sólo un bot va a llegar.Luego del registro de las cadenas de agente de usuario que golpeó el honeypot página a una base de datos.Usted puede utilizar esos registra cadenas para clasificar a los rastreadores.

Postives: Va a coincidir con algunos desconocidos rastreadores que no se declaran.

Negatives: No todos los rastreadores de cava lo suficientemente profundo para golpear cada enlace en su sitio, y por lo que no puede llegar a su honeypot.

Una sugerencia es crear un ancla vacío en su página que seguiría solamente un bot. Los usuarios normales no podrían ver el enlace, dejando a las arañas y los robots de seguir. Por ejemplo, una etiqueta de ancla vacío que apunta a una subcarpeta registraría una petición GET en sus registros ...

<a href="dontfollowme.aspx"></a>

Muchas personas utilizan este método durante la ejecución de un honeypot para atrapar los robots maliciosos que no están siguiendo el archivo robots.txt. Yo uso el método de anclaje de vacío en una solución honeypot ASP.NET escribí para atrapar y bloquear esos rastreadores con orugas ...

Cualquier visitante cuya página de entrada es /robots.txt es probablemente un bot.

Algo rápido y sucio como esto podría ser un buen comienzo:

return if request.user_agent =~ /googlebot|msnbot|baidu|curl|wget|Mediapartners-Google|slurp|ia_archiver|Gigabot|libwww-perl|lwp-trivial/i

Nota:. Código de rieles, pero la expresión regular es de aplicación general

Estoy bastante seguro de que una gran proporción de los robots no utilizan robots.txt, sin embargo, que fue mi primer pensamiento.

Me parece que la mejor manera de detectar un bot es con el tiempo entre peticiones, si el tiempo entre solicitudes es rápido y consistente, entonces es un bot.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top