不,它不尊重 robots.txt
与这里的其他答案相反,facebookexternalhit 的行为就像最卑鄙的爬虫。 当它以疯狂的速度遍历每一个时,无论它是通过爬行还是从类似的按钮获得请求的网址,都不再那么重要了。
我们有时每秒会获得数百次点击,因为它几乎遍历我们网站上的每个网址。 它每次都会杀死我们的服务器。 有趣的是,当这种情况发生时,我们可以看到 Googlebot 会放慢速度并等待事情稳定下来,然后再慢慢恢复。 另一方面,facebookexternalhit 继续攻击我们的服务器,通常比最初杀死我们的那场比赛更严重。
仅仅因为 facebookexternalhit,我们就必须运行比我们实际流量所需的更强大的服务器。 我们进行了大量的搜索,但找不到减慢速度的方法。
Facebook,这是一个很好的用户体验吗?
对于类似的问题,我提供了一种技术解决方案,可以根据用户代理简单地限制负载速率。
为方便起见,此处重复代码:
既然人们无法迎合他们的狂妄自大,并且放弃他们的 IP 封锁是相当严厉的,所以这是我的技术解决方案。
在 PHP 中,对每个请求尽快执行以下代码。
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;
}
}
Facebook 实际上使用了这个算法,你可以在这里亲自检查:
http://developers.facebook.com/tools/debug
此数据的 Facebook 缓存寿命是可变的,但根据我的经验,它在 24-48 小时之间。
但是,如果您向网址添加一部分以便用户共享新的网址,您可以使缓存“无效”,或者您可以提供具有相同效果的 bit.ly(等)链接。
由于它实际上并不是在爬行,所以您不能强迫它延迟抓取(而且您不应该这样做,因为这会造成糟糕的用户体验 - 他们会等待一段时间才能抓取完成,并且会向他们提供可共享的内容)链接不太漂亮)。但是,您可以按照设定的时间间隔手动触发抓取,以确保更好的用户体验(他们不会等待数据被缓存)和服务器负载平衡。
如果您在 ubuntu 服务器上运行并且正在使用 ufw 防火墙,您可能想尝试一下
ufw 限制原始 tcp 从 31.13.24.0/21 端口 80 到任何
对于所有这些 IP 地址: 31.13.24.0/21 31.13.64.0/18 66.220.144.0/20 69.63.176.0/20 69.171.224.0/19 74.119.76.0/22 103.4.96.0/22 173.252.64.0/18 204.15.20.0/22
哇这么多年过去了,这一切仍然有意义。 Facebookexternalhit 仍然是一个坏演员。 他们肯定是根据我们的日志进行爬行的。如果他们使用不同的 UA 来处理事务元数据而不是爬行,这一切都会容易得多!
我们正在与 googlebot、现在的 googleother 和 facebookexternalhit 打交道,它们都在争夺我们服务器资源的主导权。 到目前为止,所有通过联系公司解决问题的尝试都已进入 /dev/null - 让我们唯一的选择是阻止他们的整个 ASN - 一点也不酷!
我们没有爬行器。我们有一个抓取工具,可以抓取具有类似按钮/在 FB 上共享的页面上的元数据。