18

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

我们的网站每 45 至 60 分钟受到一次冲击,峰值约为 每秒 400 个请求,来自 facebook 网络块的 20 到 30 个不同的 IP 地址。在尖峰之间,流量不会消失,但负载是可以接受的。当然,我们不想阻止机器人,但这些尖峰是有风险的。我们希望看到机器人随着时间的推移平均分配它的负载。并看到它的行为就像 Googlebot 和朋友一样。

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

4

3 回答 3

21

根据其他答案,来自 Facebook 的半官方用词是“suck it”。让我感到困惑的是,他们无法遵循 Crawl-delay(是的,我知道它不是“爬虫”,但是在几秒钟内获取 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

欢迎提出改进建议......我猜它们可能是一些并发问题,并且会引起巨大的轰动。

于 2012-11-07T19:25:11.887 回答
11

我知道这是一个古老但没有答案的问题。我希望这个答案对某人有所帮助。

有一个名为 Open Graph 的标签og:ttl,可以让您减慢 Facebook 爬虫发出的请求:(参考

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

检查对象属性是否og:ttl表明每个共享的规范 URL 的默认 ttl 为 30 天。因此,如果您有大量的共享对象,那么设置这个 ttl 元标记只会减慢请求。

但是,如果 Facebook 的爬虫因为实际的实时流量(用户同时分享了很多你的故事)而接触到你,这当然行不通。

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

希望能帮助到你。

于 2015-04-06T13:07:28.533 回答
2

我们在我们的网站/服务器上遇到了同样的问题。问题是og:url metatag. 删除它后,大多数 facebookexternalhit 调用的问题都得到了解决。

另一个问题是,我们在 og:image 标签中指定的一些图片不存在。因此,facebookexternhit scraper 会为每次调用 url 调用 url 上的每个图像。

于 2014-06-08T14:34:24.653 回答