Pergunta

Gostaria de detectar (no lado do servidor) que os pedidos são de bots. Eu não me importo sobre bots maliciosos neste momento, apenas os que estão jogando agradável. Eu vi algumas abordagens que envolvem principalmente encontrando a string user agent contra palavras-chave como 'bot'. Mas isso parece estranho, incompletos e insustentável. Então, alguém tem alguma abordagens mais sólidas? Se não, você tem todos os recursos que você usa para manter-se atualizado com todos os agentes de usuário amigável?

Se você está curioso: Eu não estou tentando fazer nada contra qualquer política de mecanismo de busca. Nós temos uma seção do site onde um usuário é apresentado aleatoriamente com uma das várias versões ligeiramente diferentes de uma página. No entanto, se um web crawler é detectado, nós sempre dar-lhes a mesma versão para que o índice é consistente.

Também estou usando Java, mas eu imagino a abordagem seria semelhante para qualquer tecnologia do lado do servidor.

Foi útil?

Solução

Você pode encontrar um banco de dados muito completo de dados sobre conhecidos "boas" crawlers no robotstxt.org Robots banco de dados. Utilizando esses dados seria muito mais eficaz do que apenas harmonização bot na user-agent.

Outras dicas

Você disse que combinando o agente do usuário em ‘bot’ pode ser estranho, mas nós achamos que ele seja um bom jogo. Nossos estudos mostraram que ele vai cobrir cerca de 98% dos hits que você recebe. Nós também não encontrei nenhuma partida falsos positivos ainda. Se você quiser levantar esta até 99,9% você pode incluir alguns outros jogos conhecidos poços como 'rastreador', 'baiduspider', 'ia_archiver', 'onda' etc. Nós testamos isso em nossos sistemas de produção ao longo de milhões de visitas.

Aqui estão algumas c # soluções para você:

1) mais simples

é o mais rápido no processamento de uma miss. tráfego ou seja, a partir de um não-bot - um usuário normal. As capturas 99 +% dos rastreadores.

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

2) Média

é o mais rápido ao processar um sucesso. tráfego isto é a partir de um bot. rápido bonito por acidentes também. As capturas perto de 100% de esteiras rolantes. Partidas ‘bot’, ‘rastreador’, ‘aranha’ adiantado. Você pode adicionar-lhe quaisquer outros indexadores conhecidos.

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) Paranoid

É muito rápido, mas um pouco mais lento do que as opções 1 e 2. É o mais preciso, e permite-lhe manter as listas se quiser. Você pode manter uma lista separada de nomes com ‘bot’ neles se você tem medo de falsos positivos no futuro. Se conseguirmos um jogo curto que registrá-lo e verificar se há um 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:

  • É tentador apenas continuar a acrescentar nomes à opção regex 1. Mas se você fizer isso, ele vai se tornar mais lento. Se você quiser uma lista mais completa, em seguida, linq com lambda é mais rápido.
  • Certifique-se de .ToLower () está fora do seu método linq -. Lembre-se o método é um loop e você seria modificar a string durante cada iteração
  • Sempre coloque os bots mais pesadas no início da lista, para que correspondam mais cedo.
  • Coloque as listas em uma classe estática para que eles não são reconstruídas em cada exibição de página.

Honeypots

A única alternativa real para isso é criar um link ‘honeypot’ em seu site que apenas um bot vai chegar. Você, então, registrar as cadeias de agente de utilizador que atingiram a página honeypot para um banco de dados. Você pode então usar aqueles registrados cordas para crawlers se classificar.

Postives: Ele irá corresponder a alguns rastreadores desconhecidos que não estão se declarando.

Negatives: Nem todos os rastreadores cavar fundo o suficiente para bater cada link em seu site, e assim eles não podem chegar ao seu honeypot.

Uma sugestão é criar uma âncora vazia na sua página que apenas um bot iria seguir. Os usuários normais não iria ver o link, deixando as aranhas e os bots a seguir. Por exemplo, uma marca de âncora vazia que aponta para uma subpasta iria gravar uma solicitação get em seus registros ...

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

Muitas pessoas usam este método durante a execução de um honeypot para pegar bots maliciosos que não estão seguindo o arquivo robots.txt. Eu uso o método âncora vazia em uma solução ASP.NET honeypot eu escrevi para interceptar e bloquear os rastreadores assustador ...

Qualquer visitante cuja entrada página é /robots.txt é provavelmente um bot.

rápida Algo e sujo como esse pode ser um bom começo:

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

Nota: Trilhos do código, mas regex é geralmente aplicável

.

Eu tenho certeza que uma grande proporção dos bots não usam robots.txt, no entanto, que foi o meu primeiro pensamento.

Parece-me que a melhor maneira de detectar um bot é com o tempo entre os pedidos, se o tempo entre solicitações é consistentemente rápido, então é um bot.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top