tool crawler buscador c# web-crawler bots

c# - buscador - web crawler python



Detectando rastreadores web honestos (6)

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

Me gustaría detectar (en el lado del servidor) qué solicitudes son de bots. No me importan los bots maliciosos en este punto, solo los que están jugando bien. He visto algunos enfoques que implican principalmente la coincidencia de la cadena de agente de usuario con palabras clave como ''bot''. Pero eso parece incómodo, incompleto e inmanejable. Entonces, ¿alguien tiene enfoques más sólidos? De lo contrario, ¿tiene algún recurso que utilice para mantenerse actualizado con todos los agentes de usuario amigables?

Si tiene curiosidad: no estoy tratando de hacer nada en contra de ninguna política de motor de búsqueda. Tenemos una sección del sitio donde a un usuario se le presenta al azar una de las varias versiones ligeramente diferentes de una página. Sin embargo, si se detecta un rastreador web, siempre les daríamos la misma versión para que el índice sea coherente.

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


Puede encontrar una base de datos muy completa sobre los rastreadores web conocidos como "buenos" en la base de datos Robots de robotstxt.org. Utilizar estos datos sería mucho más efectivo que simplemente asociar bot en el agente de usuario.


Una sugerencia es crear un anclaje vacío en tu página que solo un robot pueda seguir. Los usuarios normales no verían el enlace, dejando arañas y bots para seguir. Por ejemplo, una etiqueta de anclaje vacía que apunta a una subcarpeta registraría una solicitud get en sus registros ...

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

Muchas personas usan este método al ejecutar HoneyPot para detectar bots maliciosos que no siguen el archivo robots.txt. Utilizo el método de anclaje vacío en una solución de honeypot de ASP.NET que escribí para atrapar y bloquear esos rastreadores espeluznantes ...


Algo tan rápido y sucio como este 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: el código de los rieles, pero la expresión regular es generalmente aplicable.


Estoy bastante seguro de que una gran proporción de robots no usan robots.txt, sin embargo, eso fue lo primero que pensé.

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


Dijiste que hacer coincidir el agente de usuario en ''bot'' puede ser incómodo, pero hemos encontrado que es una buena combinación. Nuestros estudios han demostrado que cubrirá aproximadamente el 98% de los resultados que reciba. Tampoco hemos encontrado coincidencias falsas positivas tampoco. Si quieres subir esto hasta un 99.9%, puedes incluir algunas otras coincidencias bien conocidas como ''rastreador'', ''baiduspider'', ''ia_archiver'', ''curl'', etc. Hemos probado esto en nuestros sistemas de producción a lo largo de millones de éxitos.

Aquí hay algunas soluciones de c # para usted:

1) Simplest

Es el más rápido al procesar una falla. es decir, tráfico de un no-bot - un usuario normal. Captura 99 +% de 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 el más rápido al procesar un golpe. es decir, el tráfico de un bot. Bastante rápido para fallas también. Captura cerca del 100% de los rastreadores. Coincide con ''bot'', ''crawler'', ''spider'' por adelantado. Puede agregarle otros rastreadores conocidos.

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 el más preciso y le permite mantener las listas si lo desea. Puede mantener una lista separada de nombres con ''bot'' en ellos si tiene miedo de falsos positivos en el futuro. Si obtenemos una coincidencia corta, la registramos y la comprobamos en busca de 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 agregando nombres a la opción de expresiones regulares 1. Pero si haces esto, se volverá más lento. Si quieres una lista más completa, linq con lambda es más rápido.
  • Asegúrese de que .ToLower () esté fuera de su método linq: recuerde que el método es un bucle y que estaría modificando la cadena durante cada iteración.
  • Siempre coloque los bots más pesados ​​al comienzo de la lista, para que coincidan más rápido.
  • Coloque las listas en una clase estática para que no se reconstruyan en cada página vista.

Honeypots

La única alternativa real a esto es crear un enlace ''honeypot'' en su sitio que solo alcanzará un bot. A continuación, registra las cadenas de agente de usuario que llegan a la página de honeypot en una base de datos. A continuación, puede usar esas cadenas registradas para clasificar los rastreadores.

Postives: coincidirá con algunos rastreadores desconocidos que no se declaran a sí mismos.

Negatives: no todos los rastreadores cavan lo suficientemente profundo como para golpear cada enlace en su sitio, por lo que es posible que no lleguen a su honeypot.