来自facebookexternalhit机器人的过多流量

R. *_*oma 11 facebook robot

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

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

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

Sti*_*ley 13

根据其他答案,来自Facebook的半官方消息是"吮吸它".令我难以理解的是他们无法跟踪爬行延迟(是的,我知道这不是一个"爬虫",但是几秒内GET'ing 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

您可以从命令行对此进行测试,例如:

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

欢迎改进建议......我猜他们可能会遇到一些并发问题.

  • 我建议给他们“429 Too Many Requests”而不是 503。 (3认同)
  • 谢谢@Joe.我每晚都会被打2-3次,连续一周.必要性是发明之母.;-) (2认同)

mag*_*nap 7

我知道这是一个陈旧但没有答案的问题.我希望这个答案有助于某人.

有一个名为Open Graph的标签og:ttl,可以让你减慢Facebook抓取器发出的请求:( 参考)

抓取工具速率限制 您可以标记网页和对象,以更改Facebook抓取工具等待检查新内容的时间.og:ttl如果我们的抓取工具过于激进,请使用object属性限制抓取工具访问.

检查对象属性,og:ttl以确定每个规范URL共享的默认ttl为30天.因此,如果随着时间的推移有大量共享对象,设置此ttl元标记只会降低请求速度.

但是,如果由于实际的实时流量(用户同时分享了很多故事)而被Facebook的抓取工具联系到了,那么这当然行不通.

您有太多爬虫请求的另一种可能性是,您的故事未使用正确的规范url(og:url)标记进行共享.假设您的用户可以从多个不同来源(实际上能够查看和共享相同的文章,但他们看到的网址不同)访问您网站上的某些文章,如果您没有og:url为所有这些文章设置相同的标记,Facebook会认为这是一篇不同的文章,因此会随着时间的推移生成对所有这些文件的爬虫请求,而不仅仅是针对唯一的规范URL.更多信息在这里.

希望能帮助到你.