有人知道如何告诉“facebookexternalhit”机器人传播其流量吗?
我们的网站每 45 - 60 分钟就会受到一次冲击,峰值约为 100 次。每秒 400 个请求,来自 facebook 网络块的 20 到 30 个不同的 IP 地址。在峰值之间,流量不会消失,但负载是可以接受的。当然,我们不想阻止机器人,但这些峰值是有风险的。我们希望看到机器人随着时间的推移平均分配其负载。看看它的行为就像 Googlebot 和朋友一样。
我看过相关的错误报告(第一个错误、第二个错误和第三个错误(#385275384858817)),但找不到任何如何管理负载的建议。
根据其他答案,Facebook 的半官方用语是“suck it”。让我感到困惑的是,他们无法遵循爬行延迟(是的,我知道这不是“爬行程序”,但是在几秒钟内获取 100 个页面就是爬行,无论你想怎么称呼它)。
既然人们无法迎合他们的狂妄自大,并且放弃他们的 IP 封锁是相当严厉的,所以这是我的技术解决方案。
在 PHP 中,对每个请求尽快执行以下代码。
define( 'FACEBOOK_REQUEST_THROTTLE', 2.0 ); // Number of seconds permitted between each hit from facebookexternalhit
if( !empty( $_SERVER['HTTP_USER_AGENT'] ) && strpos( $_SERVER['HTTP_USER_AGENT'], 'facebookexternalhit' ) === 0 ) {
$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"].' 429' );
die;
}
}
您可以使用以下命令从命令行进行测试:
$ rm index.html*; wget -U "facebookexternalhit/1.0 (+http://www.facebook.com/externalhit_uatext.php)" http://www.foobar.com/; less index.html
欢迎提出改进建议...我猜它们可能是一些并发问题,并且带来了巨大的影响。
我知道这是一个古老但尚未解答的问题。我希望这个答案对某人有所帮助。
有一个名为
og:ttl
的 Open Graph 标签,可让您减慢 Facebook 爬虫发出的请求:(reference)
爬虫速率限制 您可以标记页面和对象,以更改 Facebook 爬虫检查它们是否有新内容的等待时间。如果我们的爬虫过于激进,请使用
对象属性来限制爬虫访问。og:ttl
检查 对象属性 中的
og:ttl
表明每个共享的规范 URL 的默认 ttl 为 30 天。因此,如果随着时间的推移有大量共享对象,设置此 ttl 元标记只会减慢请求速度。
但是,如果您是因为实际的实时流量(用户同时分享大量您的故事)而被 Facebook 的爬虫联系到的,那么这当然行不通。
您有太多爬虫请求的另一种可能性是,您的故事没有使用正确的规范网址 (
og:url
) 标签进行共享。
比方说,如果您没有为以下内容设置相同的 og:url
标签,您的用户可以从多个不同来源访问您网站上的某些文章(实际上能够查看并共享同一篇文章,但他们看到的 URL 不同)对于所有这些内容,Facebook 会认为这是一篇不同的文章,因此随着时间的推移,会对所有内容生成爬虫请求,而不仅仅是针对唯一的规范 URL。更多信息这里。
希望有帮助。
我们的网站/服务器上也遇到了同样的问题。问题是
og:url metatag
。删除后,大多数 facebookexternalhit 调用的问题都得到解决。
另一个问题是,我们在 og:image 标签中指定的一些图片不存在。因此 facebookexternhit scraper 会在每次调用 url 时调用该 url 上的每个图像。
在我花了一个下午的时间解决这个问题后,我觉得如果你使用 haproxy 那么: