来自facebookexternalhit机器人的过多流量

时间:2012-07-17 11:44:32

标签: facebook robot

有谁知道如何告诉'facebookexternalhit'机器人传播其流量?

我们的网站每隔45-60分钟就会受到重创。每秒400个请求,来自facebook netblocks的20到30个不同的IP地址。在尖峰之间,交通不会消失,但负荷是可以接受的。当然我们不想阻止机器人,但这些高峰是有风险的。我们更愿意看到机器人随着时间的推移平均分配负载。并且看起来它表现得像Googlebot&朋友。

我已经看过相关的错误报告(First BugSecond Bug和第三个错误(#385275384858817)),但找不到任何有关如何管理负载的建议。

3 个答案:

答案 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上的每个图像。