来自 facebookexternalhit bot 的流量过多

问题描述 投票:0回答:4

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

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

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

facebook bots
4个回答
25
投票

根据其他答案,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

欢迎提出改进建议...我猜它们可能是一些并发问题,并且带来了巨大的影响。


11
投票

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

有一个名为

og:ttl
的 Open Graph 标签,可让您减慢 Facebook 爬虫发出的请求:(reference)

爬虫速率限制 您可以标记页面和对象,以更改 Facebook 爬虫检查它们是否有新内容的等待时间。如果我们的爬虫过于激进,请使用

og:ttl
对象属性来限制爬虫访问。

检查 对象属性 中的

og:ttl
表明每个共享的规范 URL 的默认 ttl 为 30 天。因此,如果随着时间的推移有大量共享对象,设置此 ttl 元标记只会减慢请求速度。

但是,如果您是因为实际的实时流量(用户同时分享大量您的故事)而被 Facebook 的爬虫联系到的,那么这当然行不通。

您有太多爬虫请求的另一种可能性是,您的故事没有使用正确的规范网址 (

og:url
) 标签进行共享。 比方说,如果您没有为以下内容设置相同的
og:url
标签,您的用户可以从多个不同来源访问您网站上的某些文章(实际上能够查看并共享同一篇文章,但他们看到的 URL 不同)对于所有这些内容,Facebook 会认为这是一篇不同的文章,因此随着时间的推移,会对所有内容生成爬虫请求,而不仅仅是针对唯一的规范 URL。更多信息这里

希望有帮助。


2
投票

我们的网站/服务器上也遇到了同样的问题。问题是

og:url metatag
。删除后,大多数 facebookexternalhit 调用的问题都得到解决。

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


0
投票

在我花了一个下午的时间解决这个问题后,我觉得如果你使用 haproxy 那么:

  1. 制作一个粘表,计算用户代理在 30 秒窗口内的 http 请求率
  2. 对于 facebook-externalhit 机器人,如果计数器大于 10,则发送 429 响应(这似乎是 google 机器人在没有过多指导的情况下管理的内容)
© www.soinside.com 2019 - 2024. All rights reserved.