根据其他答案,来自 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
欢迎提出改进建议......我猜它们可能是一些并发问题,并且会引起巨大的轰动。