2012-07-17 14 views
9

¿Alguien sabe cómo decir el bot 'facebookexternalhit' para difundir su tráfico?tráfico excesivo de facebookexternalhit bot

Nuestro sitio web es martillado cada 45 - 60 minutos con picos de aprox. 400 solicitudes por segundo, de 20 a 30 direcciones IP diferentes desde los netblocks de Facebook. Entre los picos el tráfico no desaparece, pero la carga es aceptable. Por supuesto, no queremos bloquear el bot, pero estos picos son arriesgados. Preferiríamos ver que el bot se propague de la misma manera con el tiempo. Y verlo comportarse como amigos de Googlebot &.

He visto informes de errores relacionados (First Bug, Second Bug y Third Bug (# 385275384858817)), pero no he podido encontrar sugerencias sobre cómo administrar la carga.

+0

En nuestro sitio, el facebook bot ha comenzado a expandir su carga desde el 21 de agosto a las 09:00 CET. ¡No más carga explosiva! –

+0

Bot continuó su mala conducta el 7 de agosto :( –

+0

Relacionados, vea: http://stackoverflow.com/questions/7716531/facebook-and-crawl-delay-in-robots-txt – artlung

Respuesta

9

Según otras respuestas, la palabra semioficial de Facebook es "chúpala". Me sorprende que cannot follow Crawl-delay (sí, sé que no es un "rastreador"), pero OBTENER 100 páginas en unos pocos segundos es un rastreo, como quieras llamarlo).

Dado que no se puede apelar a su arrogancia, y DROP'ing su bloque de IP es bastante draconiano, aquí está mi solución técnica.

En PHP, ejecute el siguiente código lo más rápido posible para cada solicitud.

define('FACEBOOK_REQUEST_THROTTLE', 2.0); // Number of seconds permitted between each hit from facebookexternalhit 

if(!empty($_SERVER['HTTP_USER_AGENT']) && preg_match('/^facebookexternalhit/', $_SERVER['HTTP_USER_AGENT'])) { 
    $fbTmpFile = sys_get_temp_dir().'/facebookexternalhit.txt'; 
    if($fh = fopen($fbTmpFile, 'c+')) { 
     $lastTime = fread($fh, 100); 
     $microTime = microtime(TRUE); 
     // check current microtime with microtime of last access 
     if($microTime - $lastTime < FACEBOOK_REQUEST_THROTTLE) { 
      // bail if requests are coming too quickly with http 503 Service Unavailable 
      header($_SERVER["SERVER_PROTOCOL"].' 503'); 
      die; 
     } else { 
      // write out the microsecond time of last access 
      rewind($fh); 
      fwrite($fh, $microTime); 
     } 
     fclose($fh); 
    } else { 
     header($_SERVER["SERVER_PROTOCOL"].' 503'); 
     die; 
    } 
} 

Puede probar esto desde una línea de comandos con algo como:

$ rm index.html*; wget -U "facebookexternalhit/1.0 (+http://www.facebook.com/externalhit_uatext.php)" http://www.foobar.com/; less index.html 

sugerencias de mejora son bienvenidos ... Conjeturaría sus podrían ser algunos problemas de concurrencia con una gran explosión.

+0

Buen trabajo @Hank. – artlung

+2

Gracias @Joe Me buscaban 2 o 3 veces por noche, durante una semana seguidas. La necesidad es la madre de la invención. ;-) – Stickley

+0

@Stickley incluso 4 años después, nos salvaste la vida. Tuvimos problemas similares con un sitio movido de otro cms e hicimos algunos redireccionamientos de URLs viejas a nuevas causando que Facebook se vuelva loco y golpee nuestro servidor con miles de visitas por segundo. Incluso incluimos su throttler en un generador aleatorio para mantener los golpes al mínimo ... – Shardon

2

Tuvimos los mismos problemas en nuestro sitio web/servidor. El problema fue el og:url metatag. Después de eliminarlo, el problema se resolvió para la mayoría de las llamadas facebookexternalhit.

Otro problema era que algunas imágenes que especificamos en la etiqueta og: image no existían. Por lo tanto, el rascador facebookexternhit llamó a cada imagen en la url para cada llamada de la url.

+0

¡Muchas gracias! Me estaba volviendo loco. – Christina

4

Sé que es una pregunta antigua, pero sin respuesta. Espero que esta respuesta ayude a alguien.

Hay una etiqueta de Open Graph llamado og:ttl que le permite ralentizar las peticiones formuladas por el Facebook rastreador: (reference)

tasa de oruga limitar puede etiquetar páginas y objetos para cambiar el tiempo El rastreador de Facebook esperará a buscar contenido nuevo. Use la propiedad de objeto og:ttl para limitar el acceso del rastreador si nuestro rastreador es demasiado agresivo.

Comprobación object properties para og:ttl establece que el TTL predeterminado es de 30 días por cada URL canónica compartido. Por lo tanto, establecer esta metaetiqueta solo ralentizará las solicitudes si tiene una cantidad muy grande de objetos compartidos a lo largo del tiempo.

Pero, si el rastreador de Facebook se comunica con usted debido al tráfico real en vivo (los usuarios comparten muchas de sus historias al mismo tiempo), esto, por supuesto, no funcionará.

Otra posibilidad para que tenga demasiadas solicitudes de rastreador es que sus historias no se comparten con una etiqueta de url canónica correcta (og:url). Digamos que sus usuarios pueden acceder a determinado artículo en su sitio desde varias fuentes diferentes (realmente pueden ver y compartir el mismo artículo, pero la URL que ven es diferente), si no establece la misma etiqueta og:url para todos de ellos, Facebook pensará que es un artículo diferente, por lo tanto, generará solicitudes de rastreo a lo largo del tiempo para todos ellos en lugar de solo para la única URL canónica. Más información here.

Espero que ayude.