PHP: Detectar los spiders de los buscadores

Un poquito de programación rápida para comenzar la semana. El otro día me di cuenta que estaba creando sesiones a lo pavote para TODOS los que entraban al blog, algo normal para contabilizar de donde, cuantos activos y esas cosas que sirven a modo estadístico.

Con usuarios normales no es un problema, salvo ataques DDOS donde ese sería el último de mis problemas, jeje, pero con los bots de los buscadores... ah, eso sí que es un drama.

Cuando tu site recibe mucho tráfico o se actualiza seguido los spiders de los buscadores pasan también más seguido, así que te revisan cada rincón, aumenta el tráfico y las sesiones, lo que hice fue buscar una función (aquí en PHacks) para detectarlos y evitar tanto peso en el servidor, en PHP, es sencillo:



Tan sólo cuando entra pregunto si es un bot, ¿Por qué no guardar la lista en una DB? justamente porque lo que quiero eliminar son requests a la base de datos, con un hermoso y cochino if enorme podemos contener la mayoría de los bots que andan dando vueltas.

Contra toda la teoría de sistemas que te enseñan en la facultad, el "hardcodeo" es necesario cuando buscás performance, no está mal, es que hay que saber usarlo, en este caso es algo que se modifica rara vez y para aquellos que modificamos nuestro propio código, es más eficiente. En términos de eficiencia pura esto apenas consume un poquito más de memoria (unos bytes) en el script pero te quita una conexión TCP al servidor MySQL y la posible congestión de este, si la lista fuese más grande, bueno, sería otra historia.

Con esta pequeña función me ahorré un 90% de requests inútiles a la base de datos por parte de los buscadores cuando pasan a explorar el blog, a continuación les dejo una lista de muchos nombres posibles, yo sólo le cargué al mío los más comunes, Google y Bing, más otros tantos.



  • Baiduspider+(+http://www.baidu.com/search/spider.htm)
  • Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)
  • Moreoverbot/5.1 (+http://w.moreover.com; webmaster@moreover.com) Mozilla/5.0
  • UnwindFetchor/1.0 (+http://www.gnip.com/)
  • Voyager/1.0
  • PostRank/2.0 (postrank.com)
  • R6_FeedFetcher(www.radian6.com/crawler)
  • R6_CommentReader(www.radian6.com/crawler)
  • radian6_default_(www.radian6.com/crawler)
  • Mozilla/5.0 (compatible; Ezooms/1.0; ezooms.bot@gmail.com)
  • ia_archiver (+http://www.alexa.com/site/help/webmasters; crawler@alexa.com)
  • Mozilla/5.0 (compatible; Yahoo! Slurp; http://help.yahoo.com/help/us/ysearch/slurp)
  • Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)
  • Mozilla/5.0 (en-us) AppleWebKit/525.13 (KHTML, like Gecko; Google Web Preview) Version/3.1 Safari/525.13
  • Mozilla/5.0 (compatible; YandexBot/3.0; +http://yandex.com/bots)
  • Mozilla/5.0 (compatible; bingbot/2.0; +http://www.bing.com/bingbot.htm)
  • Twitterbot/0.1
  • LinkedInBot/1.0 (compatible; Mozilla/5.0; Jakarta Commons-HttpClient/3.1 +http://www.linkedin.com)
  • bitlybot
  • MetaURI API/2.0 +metauri.com
  • Mozilla/5.0 (compatible; Birubot/1.0) Gecko/2009032608 Firefox/3.0.8
  • Mozilla/5.0 (compatible; PrintfulBot/1.0; +http://printful.com/bot.html)
  • Mozilla/5.0 (compatible; PaperLiBot/2.1)
  • Summify (Summify/1.0.1; +http://summify.com)
  • Mozilla/5.0 (compatible; TweetedTimes Bot/1.0; +http://tweetedtimes.com)
  • PycURL/7.18.2
  • facebookexternalhit/1.1 (+http://www.facebook.com/externalhit_uatext.php)
  • Python-urllib/2.6
  • Python-httplib2/$Rev$
  • AppEngine-Google; (+http://code.google.com/appengine; appid: lookingglass-server)
  • Wget/1.9+cvs-stable (Red Hat modified)
  • Mozilla/5.0 (compatible; redditbot/1.0; +http://www.reddit.com/feedback)
  • Mozilla/5.0 (compatible; MSIE 6.0b; Windows NT 5.0) Gecko/2009011913 Firefox/3.0.6 TweetmemeBot
  • Mozilla/5.0 (compatible; discobot/1.1; +http://discoveryengine.com/discobot.html)
  • Mozilla/5.0 (compatible; Exabot/3.0; +http://www.exabot.com/go/robot)
  • Mozilla/5.0 (compatible; SiteBot/0.1; +http://www.sitebot.org/robot/)
  • Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1 + FairShare-http://fairshare.cc)
  • HTTP_Request2/2.0.0beta3 (http://pear.php.net/package/http_request2) PHP/5.3.2
  • Mozilla/5.0 (compatible; Embedly/0.2; +http://support.embed.ly/)
  • magpie-crawler/1.1 (U; Linux amd64; en-GB; +http://www.brandwatch.net)
  • (TalkTalk Virus Alerts Scanning Engine)
  • Sogou web spider/4.0(+http://www.sogou.com/docs/help/webmasters.htm#07)
  • Googlebot/2.1 (http://www.googlebot.com/bot.html)
  • msnbot-NewsBlogs/2.0b (+http://search.msn.com/msnbot.htm)
  • msnbot/2.0b (+http://search.msn.com/msnbot.htm)
  • msnbot-media/1.1 (+http://search.msn.com/msnbot.htm)
  • Mozilla/5.0 (compatible; oBot/2.3.1; +http://www-935.ibm.com/services/us/index.wss/detail/iss/a1029077?cntxt=a1027244)
  • Sosospider+(+http://help.soso.com/webspider.htm)
  • COMODOspider/Nutch-1.0
  • trunk.ly spider contact@trunk.ly
  • Mozilla/5.0 (compatible; Purebot/1.1; +http://www.puritysearch.net/)
  • Mozilla/5.0 (compatible; MJ12bot/v1.4.0; http://www.majestic12.co.uk/bot.php?+)
  • knowaboutBot 0.01
  • Showyoubot (http://showyou.com/support)
  • Flamingo_SearchEngine (+http://www.flamingosearch.com/bot)
  • MLBot (www.metadatalabs.com/mlbot)
  • my-robot/0.1
  • Mozilla/5.0 (compatible; woriobot support [at] worio [dot] com +http://worio.com)
  • Mozilla/5.0 (compatible; YoudaoBot/1.0; http://www.youdao.com/help/webmaster/spider/; )
  • chilitweets.com
  • Mozilla/5.0 (TweetBeagle; http://app.tweetbeagle.com/)
  • OctoBot/2.1 (OctoBot/2.1.0; +http://www.octofinder.com/octobot.html?2.1)
  • Mozilla/5.0 (compatible; FriendFeedBot/0.1; +Http://friendfeed.com/about/bot)
  • Mozilla/5.0 (compatible; WASALive Bot ; http://blog.wasalive.com/wasalive-bots/)
  • Mozilla/5.0 (compatible; Apercite; +http://www.apercite.fr/robot/index.html)
  • urlfan-bot/1.0; +http://www.urlfan.com/site/bot/350.html
  • SeznamBot/3.0 (+http://fulltext.sblog.cz/)
  • Yeti/1.0 (NHN Corp.; http://help.naver.com/robots/)
  • Mozilla/5.0 (Windows; U; Windows NT 6.0; en-GB; rv:1.0; trendictionbot0.4.2; trendiction media ssppiiddeerr; http://www.trendiction.com/bot/; please let us know of any problems; ssppiiddeerr at trendiction.com) Gecko/20071127 Firefox/2.0.0.11
  • yacybot (freeworld/global; amd64 Linux 2.6.35-24-generic; java 1.6.0_20; Asia/en) http://yacy.net/bot.html
  • Mozilla/5.0 (compatible; suggybot v0.01a, http://blog.suggy.com/was-ist-suggy/suggy-webcrawler/)
  • ssearch_bot (sSearch Crawler; http://www.semantissimo.de)
  • Mozilla/5.0 (compatible; Linux; Socialradarbot/2.0; en-US; crawler@infegy.com)
  • wikiwix-bot-3.0
  • Mozilla/5.0 (compatible; AhrefsBot/1.0; +http://ahrefs.com/robot/)
  • Mozilla/5.0 (compatible; DotBot/1.1; http://www.dotnetdotcom.org/, crawler@dotnetdotcom.org)
  • GarlikCrawler/1.1 (http://garlik.com/, crawler@garik.com)
  • Mozilla/5.0 (compatible; SISTRIX Crawler; http://crawler.sistrix.net/)
  • Mozilla/5.0 (compatible; 008/0.83; http://www.80legs.com/webcrawler.html) Gecko/2008032620
  • PostPost/1.0 (+http://postpo.st/crawlers)
  • Aghaven/Nutch-1.2 (www.aghaven.com)
  • SBIder/Nutch-1.0-dev (http://www.sitesell.com/sbider.html)
  • Mozilla/5.0 (compatible; ScoutJet; +http://www.scoutjet.com/)
  • Soup/2011-05-11Z11-51-38–soup–production-2-g251c1f9d/251c1f9d6cdff8491e0b49f4ba3288ec7f3de903 (http://soup.io/)
  • Trapit/1.1
  • Jakarta Commons-HttpClient/3.1
  • Readability/0.1
  • kame-rt (support@backtype.com)
  • Mozilla/5.0 (compatible; Topix.net; http://www.topix.net/topix/newsfeeds)
  • Megite2.0 (http://www.megite.com)
  • SkyGrid/1.0 (+http://skygrid.com/partners)
  • Netvibes (http://www.netvibes.com)
  • Zemanta Aggregator/0.7 +http://www.zemanta.com
  • Owlin.com/1.3 (http://owlin.com/)
  • Mozilla/5.0 (compatible; Twitturls; +http://twitturls.com)
  • Tumblr/1.0 RSS syndication (+http://www.tumblr.com/) (support@tumblr.com)
  • Mozilla/4.0 (compatible; www.euro-directory.com; urlchecker1.0)
  • Covario-IDS/1.0 (Covario; http://www.covario.com/ids; support at covario dot com)

Otros posts que podrían llegar a gustarte...

Comentarios

  • tapichi    

    podrias utilizar sqlite para guardar los datos...

    • Responder
    • Citar
    • Comentado:
  • Fabio dijo:

    con un hermoso y cochino if enorme


    jajajajaja. me sacaste una risa con una nerdada. :D

    • Responder
    • Citar
    • Comentado:
  • tapichi dijo:

    podrias utilizar sqlite para guardar los datos...


    y cuanto procesador requerís de SQLlite contra un if?

    un buscador te puede mandar en cinco minutos un 300% más requests que cualquier otra andanada de tráfico, si encima necesitás tanto overhead para cargar SQLite y luego ejecutar la consulta ahí adentro, estas en la misma, para eso usás mysql y listo.

    • Responder
    • Citar
    • Comentado:
  • Pero así estarías evitando que aparezcan tus posts cuando alguien busque en google, por ejemplo, un tema relacionado, no?

    • Responder
    • Citar
    • Comentado:
  • GoFa    

    Fabio Baccaglioni dijo:

    tapichi dijo:
    podrias utilizar sqlite para guardar los datos...


    y cuanto procesador requerís de SQLlite contra un if?

    un buscador te puede mandar en cinco minutos un 300% más requests que cualquier otra andanada de tráfico, si encima necesitás tanto overhead para cargar SQLite y luego ejecutar la consulta ahí adentro, estas en la misma, para eso usás mysql y listo.


    ¿Y si accedés una sola vez y guardás en caché? Nomás para no hardcodear y sentirte menos villero.

    • Responder
    • Citar
    • Comentado:
  • flacoargento dijo:

    Pero así estarías evitando que aparezcan tus posts cuando alguien busque en google, por ejemplo, un tema relacionado, no?


    ¿que tiene que ver? , no dejo de mostrarle nada al buscador, sólo dejo de crear sesiones en mi propio servidor y de consultar datos irrelevantes cuando el que viene no es un humano sino un buscador


    GoFa dijo:
    Fabio Baccaglioni dijo:
    tapichi dijo:
    podrias utilizar sqlite para guardar los datos...


    y cuanto procesador requerís de SQLlite contra un if?

    un buscador te puede mandar en cinco minutos un 300% más requests que cualquier otra andanada de tráfico, si encima necesitás tanto overhead para cargar SQLite y luego ejecutar la consulta ahí adentro, estas en la misma, para eso usás mysql y listo.


    ¿Y si accedés una sola vez y guardás en caché? Nomás para no hardcodear y sentirte menos villero.


    y donde está la diferencia en villereada de tirar en un archivo de caché una consulta? :D eso si que es villero!!

    más lógico, en tal caso, es armar un archivo de configuración fácilmente editable, un XML donde uno guarde los registros de qué quiere banear y lo tomás.

    Pero ahí estás accediendo al filesystem una ves más, el sistema "negro vishero programador" te permite evitar ese pasito extra, pero desde el punto de vista de la prolijidad, un XML, un TXT o algo así fácilmente parseable sería lo más razonable en vez de montar todo un SQL para algo tan básico.

    • Responder
    • Citar
    • Comentado:
  • Gustavo V    

    Lo lindo es que todo eso que te enseñaban de normalizar todo, dejarlo pipi-cucu y todo eso, a la hora de querer obtener performance se va bien al carajo.

    incluso usando bases de datos, lo que suelo hacer es obtener todos los datos ordenaditos y lindos, y bajarlos a un archivo, para despues levantarlo a memoria y laburar desde memoria... unos 18GB de datos...

    y como en mi laburo que machacamos datos a lo loco, estas cosas son necesarias...

    • Responder
    • Citar
    • Comentado:
  • dani    

    muy lindo el codigo pero en donde se coloca eso para que funcione? en my_sitio/bots.php ? index.html ? donde va eso?

    • Responder
    • Citar
    • Comentado:
  • dani dijo:

    muy lindo el codigo pero en donde se coloca eso para que funcione? en my_sitio/bots.php ? index.html ? donde va eso?


    nah, para hacerlo funcionar tenés que entender todo el código de tu propio sitio, si no sabés de programación olvidalo, no te va a ayudar en nada.


    Gustavo V dijo:
    Lo lindo es que todo eso que te enseñaban de normalizar todo, dejarlo pipi-cucu y todo eso, a la hora de querer obtener performance se va bien al carajo.

    incluso usando bases de datos, lo que suelo hacer es obtener todos los datos ordenaditos y lindos, y bajarlos a un archivo, para despues levantarlo a memoria y laburar desde memoria... unos 18GB de datos...

    y como en mi laburo que machacamos datos a lo loco, estas cosas son necesarias...


    la normalización es la mentira de toda la carrera de sistemas, los profesores mienten porque nunca trabajaron realmente en un sistema que deba ser óptimo.

    es más, te enseñan SQL casi como si fuese el único método eficiente para guardar datos, hoy por hoy andá a pedirle a google que use SQL para su buscador...

    • Responder
    • Citar
    • Comentado:
  • Fabio Baccaglioni dijo:

    la normalización es la mentira de toda la carrera de sistemas


    Eso generalmente ocurre con lenguajes mal diseñados como PHP. Andá a pedirle a google que use PHP

    • Responder
    • Citar
    • Comentado:
  • Grandioso lo que has compartido, aunque sinceramente se puede mejorar, voy a ver si puedo cambiarlo para sacarle más partido y cualquier cosa aviso.
    Saludos fabio.!

    • Responder
    • Citar
    • Comentado:
  • Hanna Montaner dijo:

    Fabio Baccaglioni dijo:
    la normalización es la mentira de toda la carrera de sistemas


    Eso generalmente ocurre con lenguajes mal diseñados como PHP. Andá a pedirle a google que use PHP


    normalización = SQL, estamos hablando de SQL, no de PHP, vos podés escribir el código de PHP como si fuese C, ignorante

    Google ha usado PHP, pero actualmente no le sirve a sus propósitos, Wikipedia usa PHP, Facebook usa PHP, PHP no tiene un cuerno que ver, podrías programarlo todo en Assembler y aun así hacerlo mal

    • Responder
    • Citar
    • Comentado:
  • Joefay    

    Usando apc para que sea php desde la memoria? que tal si fueran mas datos, que tal una tabla de las tipo memory? haria una cosulta pero ya no seria al disco si no a la memoria, solo digo

    • Responder
    • Citar
    • Comentado:
  • A Targeted Individual is someone that has been selected by the Deep State (usually FBI or CIA) to unwillingly participate in a government experimental torture program. This program is designed to break down the individual and "neutralize the person," using psychological, physical, and emotional stress. The ultimate goal of this program is to control the entire global population. Political activists and whistleblowers are two of the main targets. Family and spousal relationships are usually destroyed, as part of this torture.

    • Responder
    • Citar
    • Comentado:

Deje su comentario:

Tranquilo, su email nunca será revelado.
La gente de bien tiene URL, no se olvide del http/https
Para evitar bots, si se tardó mucho en leer la nota seguramente no sirva y tenga que intentar dos veces

Negrita Cursiva Imagen Enlace


comentarios ofensivos o que no hagan al enriquecimiento del post serán borrados/editados por el administrador