Los Web Scrappers o ladrones de contenido son un tipo de robot o crawler que indexa contenido recopilando información y artículos de otras webs para -generalmente- duplicarlo, añadiendo bloques de publicidad y lucrarse con el esfuerzo de otros (cosa que vulnera licencias, todo sea dicho).
Este tipo de técnicas habitualmente generan mucha controversia, ya que a algunas personas les parece totalmente lícito, mientras que a otras les parece una estrategia abyecta.
Entrando un poco más en este tema encontramos los llamados planetas, que no son más que (en ámbitos web) un sitio web que recopila a través de feeds RSS los artículos de diferentes blogs o webs (normalmente siguiendo una misma temática o criterio).
Es una idea genial. Hay multitud de planetas muy interesantes que personalmente sigo (aunque siempre suelo leerlos desde la página original). Sin embargo, hay varios puntos que considero importantes como no permitir comentarios en el planeta, dirigir al lector a la web original, no incorporar publicidad, citar la fuente de los artículos u otros detalles que estarían restando mérito al autor del escrito.
Es un tema bastante complicado, pero vamos a intentar simplificarlo. Para «robar» contenido, un scrapper o robot spammer (emails, comentarios, trackbacks, ...) tienen que acceder al feed RSS (usualmente llamado index.xml), así que vamos a aprovechar esa acción para encontrarlos. Necesitaremos acceso a nuestro fichero de logs, generalmente access.log o access_log. Si tenemos acceso SSH a nuestro servidor, mejor que mejor:
egrep "/index.xml" access_log | cut -d" " -f1,12- | sort | uniq -c | sort -n | tail -25
Con este comando conseguiremos separar los accesos al feed RSS, obteniendo la IP y el User Agent, ordenándolo por número de accesos. Finalmente, obtendremos un listado de los 25 accesos más frecuentes.
Hay que hacer notar que del listado resultante, varios accesos serán de usuarios desde navegadores o agregadores como Bloglines o Google reader. Añadiendo el siguiente pipe al comando anterior podríamos filtrar la mayoría de agregadores, quedando:
egrep "/index.xml" access.log | egrep -v "subscribers|Gecko|Liferea|Google Desktop|Akregator|Vienna|Tumblr|Feedshow|Gregarius|Googlebot|Feedreader" | cut -d" " -f1,12- | sort | uniq -c | sort -n | tail -25
Después de esto, obtendríamos -ahora si- un listado más aproximado de usuarios «sin identificar» y posibles scrappers. Hay que ser muy cuidadoso e ir investigando cada entrada. Una serie de consejos:
Si no estás seguro de que el usuario que miras sea un robot, siempre podrías investigar más en tus logs a ver en que otras páginas ha estado, a parte del feed RSS:
grep "IP" access_log | cut -d" " -f7
Finalmente, echa un ojo al artículo bloquear con .htaccess para saber como bloquear a los posibles scrappers que hayas encontrado.
Cada vez que nosotros (o algún sistema) accede a una página web determinada, este acceso es registrado en un log, donde se guardan varios datos, entre ellos el User-agent, que no es más que una identificación del sistema para que los webmasters conozcan de quién se trata.
Pero como siempre, la ley hace la trampa, y muchos robots maliciosos pululando por la red. A continuación voy a crear un pequeño diccionario con los crawlers, robots y spiders más famosos, alguna referencia y una breve descripción.
WordPress/2.0 WordPress 2.1.2 WordPress/1.9
Googlebot/2.1 (+http://www.googlebot.com/bot.html) Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)
msnbot/1.0 (+http://search.msn.com/msnbot.htm) msnbot-media/1.0 (+http://search.msn.com/msnbot.htm)
Mozilla/5.0 (compatible; Yahoo! Slurp; http://help.yahoo.com/help/us/ysearch/slurp) Mozilla/5.0 (compatible; Yahoo! Slurp China; http://misc.yahoo.com.cn/help.html)
noxtrumbot/1.0 (crawler@noxtrum.com)
Mozilla/5.0 (compatible; Google Desktop)
psbot/0.1 (+http://www.picsearch.com/bot.html)
FAST MetaWeb Crawler (helpdesk at fastsearch dot com)
Mozilla/4.5 (compatible; HTTrack 3.0x; Windows 98)
Yeti/0.01 (nhn/1noon, yetibot@naver.com, check robots.txt daily and follow it)
Mozilla/2.0 (compatible; Ask Jeeves/Teoma; +http://about.ask.com/en...
Scooter/3.3
Snapbot/1.0 (Snap Shots, +http://www.snap.com)
W3C_Validator/1.555 Jigsaw/2.2.5 W3C_CSS_Validator_JFouffa/2.0
TestCrawler/Nutch-0.9 (Testing Crawler for Research ; http://chitchit... TestCrawler/Nutch-0.9 (Testing Crawler for Research ; http://balihoo.com... test/Nutch-0.8.1 (Test robot; http://test.com; info at test.com
BlogPulseLive (support@blogpulse.com)
Gigabot/2.0 (http://www.gigablast.com/spider.html)
ConveraCrawler/0.9e (+http://www.authoritativeweb.com/crawl)
MJ12bot/v1.2.0 (http://majestic12.co.uk/bot.php?+)
Microsoft-WebDAV-MiniRedir/5.1.2600 Jakarta Commons-HttpClient Microsoft URL Control - 6.00.8169 Microsoft URL Control - 6.00.8862 Microsoft URL Control - 6.00.8877 Microsoft URL Control - 6.01.9782
Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.8.1) VoilaBot BETA 1.2 ...
Mozilla/5.0 (Twiceler-0.9 http://www.cuill.com/twiceler/robot.html)
Attentio/Nutch-0.9-dev (Attentio's beta blog crawler;...
Moreoverbot/5.00 (+http://www.moreover.com)
Mozilla/5.0 (compatible; woriobot heritrix/1.10.0 +http://worio.com)
EmeraldShield.com Web Spider ...
Sogou Orion spider/3.0(+http://www.sogou.com/docs/help/webmasters.htm#07
Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.2.1; aggregator:Tailrank; ...
webcollage 1.93 webcollage 1.129 webcollage 1.125 webcollage 1.114 webcollage 1.117
Speedy Spider (http://www.entireweb.com/about/search_tech/speedy_spider/)
Technoratibot/0.7
Mozilla/5.0 (compatible; YodaoBot/1.0; http://www.yodao.com/...
Mozilla/5.0 (iphone; u; cpu like mac os x; en) applewebkit/420+ ... Opera/9.10 (nintendo wii; u; ; 1621; es-es) Mozilla/4.0 (psp (playstation portable); 2.00)
Evidentemente faltan muchos, pero me he preocupado de poner los más comunes (al menos desde mi experiencia). Confío en ir ampliando el diccionario según lleguen webmasters interesados en el tema. ¡No duden en comentar para ampliar la lista!
El último día hablaba sobre las recomendaciones para robots y crawlers mediante el robots.txt. Este sistema es un conjunto de indicaciones para que los crawlers no se «pierdan» y sepan en todo momento por donde pueden y deben ir.
¿Qué es lo que ocurre? Que cualquier persona me puede indicar que debo y que no debo tocar en su casa, pero en todo momento yo tengo la opción de hacerlo, aunque no deba. De eso vamos a tratar en este artículo, ¿Que ocurre si llega un crawler «listillo» que pasa olímpicamente de las recomendaciones que le hemos hecho? Pues que lo echamos a patadas de nuestra casa... ;)
Existe un fichero en los servidores web Apache (la mayoría de los servidores), llamado .htaccess, en el que puedes incluir información de control para dictar al servidor que hacer con tus visitantes y otro tipo de acciones.
Lo primero que necesitamos es un sistema de estadísticas o mejor aún, acceso a nuestro fichero access.log, registro donde se guardan todos los accesos a nuestro servidor. En Dreamhost, el servidor donde tengo alojado mi blog (y uno de los más famosos), tiene acceso SSH/FTP y puedes ver sin ningún problema a estos registros.
Bien con un sistema de estadísticas, o con nuestro fichero access.log, nos interesa observar los accesos por petición (request), navegador o agente (user agent) o por ip. Desde una consola SSH podemos conseguir un listado de las IPs que más peticiones realizan:
tail -10000 access.log | awk '{print $1}' | sort | uniq -c |sort -n
Esta secuencia de comandos nos muestra las últimas 10.000 llamadas a nuestro servidor, agrupándolas por IPs y mostrando el número de peticiones realizado.
Esto nos servirá para tener una idea de que crawlers, robots o usuarios pueden estar sobrecargando nuestro servidor con demasiadas peticiones. Existe un programa bastante útil que yo utilizo para analizar los access.log, llamado Apache Log Viewer. La única y «minúscula» pega es que está en japonés.
84 63.161.169.137
85 crawl-66-249-67-236.googlebot.com
91 81.177.8.166
Este no es un ejemplo real, pero imaginemos que esos son los resultados obtenidos. Tendríamos 84 peticiones de la IP que figura a su derecha. Si vamos a Inicio / Ejecutar / cmd y escribir nslookup IP podremos obtener el DNS inverso y saber a que compañía pertenece, o investigar un poco más con un analizador de logs o estadísticas y ver que accesos ha hecho.
¡Ojo! Que haga muchas peticiones no significa que sea un robot malvado. Puede que se trate de nuestro más fiel visitante o nuestro querido buscador de Google. Mucho cuidado con bloquear IPs sin pensarselo.
En mi caso resultó que la IP 81.177.8.166 realizaba bastantes peticiones, e investigando un poco más pude ver que eran a antiguos ficheros de un formulario que ya no existían. Probablemente un robot spam que sigue torpemente intentando enviar comentarios de SPAM, generando peticiones inútiles.
Si tenemos dudas la mejor opción es hacer un Whois y si nos parece que está realizando un ataque, enviar una queja al email de abuse del ISP que muestra en el whois.
Si estamos completamente seguros de que la IP que hemos encontrado en nuestros logs nos está realizando ataques DoS o algún tipo de sobrecarga de peticiones, vamos a bloquearla. Para ello tenemos que editar el fichero .htaccess en la carpeta raíz de nuestro sitio vía SSH o FTP y escribir o modificar su contenido añadiendo:
Order allow, deny
Deny from 81.177.8.166
Allow from all
Y no solo bloquear IPs, sino también rangos de IPs mediante sus clases: Deny from 81.0.0.0/8. Esto también es aplicable a crawlers que hemos añadido en el robots.txt y vemos días o semanas después (ojo, a veces no leen el robots.txt instantáneamente) que no hacen caso. Ahora toca que hagan caso a la fuerza mostrando un código de error 403 (prohibido) en lugar de lo que esperaban.
Se nos plantea otra dificultad. Los robots que acceden ahora nunca tienen la misma IP, siempre son totalmente diferentes y sin relación:
¿Cómo los bloqueamos?
SetEnvIfNoCase User-Agent "Malvadobot/" spambot
SetEnvIfNoCase Request_URI "/sendemail.php$" spambot
SetEnvIfNoCase Referer "^http://www.spammers.com/" spambot
deny from env=spambot
Con este código estamos identificando los criterios de los tres bots anteriores para asignarles una variable llamada spambot si casa con los criterios, y que si es así, bloqueará.
Existe otra alternativa para bloquear, que necesita el módulo mod_rewrite, y aunque se utiliza para reescribir direcciones, nos puede venir bastante bien para bloquear. Lo he dejado para el final, puesto que creo que es la alternativa más costoso en términos de computación, con respecto a los métodos anteriores.
RewriteEngine on
RewriteCond %{HTTP_USER_AGENT} ^Malvadobot/.* [NC]
RewriteCond %{REQUEST_FILENAME} ^/sendemail.php$ [NC]
RewriteCond %{HTTP_REFERER} ^http://www.spammers.com/.* [NC]
RewriteRule .* - [F]
En primer lugar activamos el motor del ModRewrite, y usamos los tres casos anteriores como condiciones con el RewriteCond. En caso de ser afirmativa, reescribimos mostrando un error 403, o también podemos usar un error 410 (Eliminado permanentemente) escribiendo [G] en lugar de [F]. En la página de documentación de ModRewrite hay mucha información para profundizar.
Ahora ya sabemos como bloquear. Hay que usarlo con mucho cuidado para no bloquear a usuarios legítimos y perder visitas.
El fichero robots.txt es un archivo de texto que dicta unas recomendaciones para que todos los crawlers y robots de buscadores cumplan (¡ojo! recomendaciones, no obligaciones). Pero comencemos por el principio.
Un crawler es un robot de una entidad (generalmente buscadores) que acceden a las páginas web de un sitio para buscar información en ella, añadirla en los buscadores, etc. También son llamados spiders, arañas, bots o indexadores.
Por ejemplo, Googlebot es el nombre del crawler del buscador Google. También existen otros como:
Y muchísimos más. Si establecemos un control en nuestro robots.txt, podremos conseguir una serie de beneficios:
¿Y entonces, que hay que hacer? Es muy sencillo.
Sólo tenemos que crear un fichero de texto robots.txt y comenzar a escribir en el. Partiré del siguiente ejemplo donde permitimos la entrada a todos los crawlers (igual que sin ningún robots.txt):
User-agent: *
Disallow:
En User-agent debemos introducir el nombre del robot, y a continuación las rutas donde queremos prohibir que acceda. Algunos ejemplos:
En algunos casos suele utilizarse en lugar de Disallow, la palabra Allow. Aunque por definición es correcta, es conveniente no utilizarla, puesto que las rutas omitidas se asumen que están permitidas por defecto, y algunos crawlers no entienden la palabra Allow.
Es posible acumular varios Disallow bajo un mismo User-agent, pero no podemos utilizar varios User-agent encima de un Disallow. Bien, algún ejemplo:
# Crawler de MSN
User-agent: msnbot
Disallow: /links.html
Disallow: /private/
Disallow: /photos/
Este código impide al crawler del buscador de Live (MSN) acceder a la página links.html, y las carpetas private y photos (y todo su contenido) de nuestro sitio.
Añadiendo el carácter # al principio de una linea podemos escribir comentarios que no interpretará el crawler.
Es posible ir acumulando reglas para distintos crawlers, formando un robots.txt más largo y completo. Cada vez que escribamos un User-agent deberemos dejar una linea en blanco de separación. Además, existe una ligera adaptación que permiten usar comodines ($ y *) en las rutas en algunos crawlers (sólo Googlebot y Slurp):
User-agent: Slurp
Disallow: /*.js$
Disallow: /2006/*
Disallow: /2007/*
Disallow: /articulos/*/pagina/*
Se está indicando al robot de Yahoo, que no indexe los ficheros que terminen en .js (javascript), direcciones que empiecen por 2007 o 2006 (fechas), ni artículos con la palabra pagina (paginado de comentarios). Estos casos pertenecen a la idea de no indexar contenido duplicado.
En la mayoría de los blogs, puedes acceder a un mismo artículo por las direcciones:
Todo esto es contenido duplicado, una de las razones más importantes de penalización para un buscador, a no ser, claro, que te las ingenies para que sólo sea accesible desde una dirección. A la hora de ver los resultados te asombrarás lo bien que estarás quedando ante los ojos de Google, por ejemplo.
Hay que tener mucho cuidado con usar cosas como Disallow: /pagina o Disallow: /*pagina, puesto que en lugar de bloquear lo que queríamos (carpeta pagina o artículos paginados), terminen bloqueando direcciones como /decorar-mi-pagina o /paginas-para-amigos/.
Si revisas estadísticas y demás, también puedes observar que a veces algunos crawlers «se pasan» revisando nuestro sitio, y funden a peticiones a nuestro pobre servidor. Existe una manera de tranquilizar a los robots:
User-agent: noxtrumbot
Crawl-delay: 30
Con esto le decimos al robot de noxtrum que espere 30 segundos entre cada acceso. Cuidado, porque Crawl-delay no lo soportan todos los crawlers (al menos MSNBot y Slurp si lo soportan, y Googlebot desde el panel de webmasters también).
Finalmente, podemos también incluir un mapa del sitio en nuestro robots.txt de la siguiente forma:
Sitemap: http://www.emezeta.com/sitemap.xml
En RobotsTXT.org podrás encontrar documentación oficial si quieres profundizar y en esta búsqueda de Google encontrarás muchos robots.txt de ejemplo, incluso robots.txt optimizados para tu tipo de web. Además, también tienes un validador de robots.txt.
Recordar a todos que con el fichero robots.txt no podemos bloquear los accesos por «fuerza bruta». Robots.txt es una recomendación del webmaster a los buscadores, que como son «robots buenos», las seguirán al pie de la letra.
Existen otros «robots malos» (que buscan direcciones de correos o formularios para hacer SPAM) que no dudarán en acceder a los lugares que hayas prohibido si lo desean. Para bloquear estos, deberemos echar mano al fichero .htaccess, pero como decía Michael Ende, eso ya es otra historia...
6 consultas efectuadas / Página generada en 0.029 segundos
Programado íntegramente por José Román (Manz) en XHTML y CSS estándar.
Sindicado bajo Feed RSS. Contenido bajo licencia Creative Commons
Estadísticas de visitas · Términos y condiciones · Contacto · Publicidad · Preguntas frecuentes (FAQ)