有谁知道如何告诉'facebookexternalhit'机器人传播其流量?
我们的网站每隔45-60分钟就会受到重创。每秒400个请求,来自facebook netblocks的20到30个不同的IP地址。在尖峰之间,交通不会消失,但负荷是可以接受的。当然我们不想阻止机器人,但这些高峰是有风险的。我们更愿意看到机器人随着时间的推移平均分配负载。并且看起来它表现得像Googlebot&朋友。
我已经看过相关的错误报告(First Bug,Second Bug和第三个错误(#385275384858817)),但找不到任何有关如何管理负载的建议。
答案 0 :(得分:13)
根据其他答案,来自Facebook的半官方消息是“吮吸它”。我很惊讶他们cannot follow Crawl-delay(是的,我知道它不是一个“爬行者”,但是几秒钟内写下100页是一个爬行,无论你想叫什么)。
由于一个人无法吸引他们的狂妄自大,而且他们的IP块的DROP非常严苛,这是我的技术解决方案。
在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;
}
}
您可以使用以下命令从命令行对此进行测试:
$ rm index.html*; wget -U "facebookexternalhit/1.0 (+http://www.facebook.com/externalhit_uatext.php)" http://www.foobar.com/; less index.html
欢迎提出改进建议......我猜他们可能会遇到一些并发问题,而且爆炸性很大。
答案 1 :(得分:6)
我知道这是一个陈旧但没有答案的问题。我希望这个答案有助于某人。
有一个名为og:ttl
的Open Graph标记,可让您减慢Facebook抓取工具发出的请求:(reference)
抓取速度限制 您可以标记页面和对象,以更改Facebook的抓取工具等待检查新内容的时间。如果我们的抓取工具过于激进,请使用
og:ttl
对象属性来限制抓取工具访问。
检查object properties og:ttl
是否表示每个规范网址共享的默认ttl为30天。因此,如果随着时间的推移有大量共享对象,设置此ttl元标记只会降低请求速度。
但是,如果您因为实际的实时流量(用户同时分享您的大量故事)而被Facebook的抓取工具联系到了,那么这当然行不通。
您有太多抓取器请求的另一种可能性是,您的故事未使用正确的规范网址(og:url
)标记进行共享。
我们可以说,您的用户可以从多个不同来源(实际上能够查看和分享同一篇文章,但他们看到的网址不同)访问您网站上的某些文章,如果您没有设置所有这些标签都相同og:url
,Facebook会认为它是一篇不同的文章,因此会随着时间的推移生成对所有这些文件的爬虫请求,而不仅仅是针对唯一的规范网址。更多信息here。
希望它有所帮助。
答案 2 :(得分:2)
我们的网站/服务器遇到同样的问题。问题是og:url metatag
。删除后,大多数facebookexternalhit调用解决了问题。
另一个问题是,我们在og:image标签中指定的一些图片不存在。因此,facebookexternhit scraper会在每次调用url时调用url上的每个图像。