2012-07-17 33 views
9

「facebookexternalhit」ボットにトラフィックを広げる方法を知っている人はいますか?facebookexternalhitボットからのトラフィックが多い

私たちのウェブサイトは約45分〜60分間隔で叩かれます。毎秒400件のリクエスト、フェイスブックネットブロックからの20〜30件の異なるIPアドレス。スパイクの間でトラフィックは消えませんが、負荷は許容されます。 Offcourse私たちはボットをブロックしたくありませんが、これらのスパイクは危険です。ボットが時間の経過と共に均等に負荷を分散するのが望ましいと思う。 Googlebot &のように動作します。

関連するバグレポート(First BugSecond Bug、第3のバグ(#385275384858817))を見たことがありますが、どのように負荷を管理するかの提案はありませんでした。

+0

私たちのサイトでは、facebookボットが8月21日09:00 CETから負荷を分散し始めました。これ以上のバースト負荷はありません! –

+0

ボットは8月7日に悪行を続けた:( –

+0

関連、参照:http://stackoverflow.com/questions/7716531/facebook-and-crawl-delay-in-robots-txt – artlung

答えて

9

他の回答につきましては、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 

改善提案は歓迎されている...私は巨大な爆発で彼らのかもしれないいくつかの同時実行の問題を推測します。

+0

素敵な仕事@ハンク。 – artlung

+2

ありがとう@ジョー私は毎週2〜3回ページャーされていましたが、必要なのは発明の母です。 – Stickley

+0

@Stickleyでも4年後に人生を救いました。私たちは、別のCMSから移動したサイトで同様の問題を抱えていました。古いURLから新しいURLへのリダイレクトをいくつか行って、facebookを凶暴にして、毎秒何千ものヒットでサーバを叩きました。ヒット数を最小限に保つために、あなたのスロットルをランダマイザーに入れました... – Shardon

2

ウェブサイト/サーバーでも同じ問題がありました。問題はog:url metatagでした。それを削除した後、ほとんどのfacebookexternalhit呼び出しで問題は解決されました。

もう1つの問題は、og:imageタグで指定した一部の画像が存在しないことでした。だからfacebookexternhitスクレーパーは、URLの各呼び出しのためのURL上のすべての画像を呼び出しました。

+0

ありがとうございました!私は嫌がらせをしていた。 – Christina

4

私はそれが古くて、答えられていない質問です。私はこの答えが誰かを助けることを望む。

あなたはFacebookのクローラーによって行われた要求を遅くすることができますog:ttlという名前のオープングラフタグがあります: を制限する(reference

クローラ率は、あなたがどのくらい変更するページとオブジェクトにラベルを付けることができますFacebookのクローラは新しいコンテンツを確認するのを待つ。クローラがあまりにも攻撃的である場合は、og:ttlオブジェクトプロパティを使用してクローラアクセスを制限してください。 og:ttlためobject propertiesをチェック

は、デフォルトのTTLを共有各正規のURLのために30日であると述べています。したがって、このttlメタタグを設定すると、時間の経過とともに非常に大量の共有オブジェクトがある場合にのみリクエストが遅くなります。

しかし実際のライブトラフィック(同時に多くのあなたのストーリーを共有しているユーザー)のためにFacebookのクローラがアクセスしている場合は、もちろん動作しません。

クローラリクエストが多すぎる可能性があります。正しい正規のURL(og:url)タグを使用してストーリーを共有していない可能性があります。 あなたのユーザーは、同じog:urlタグをすべてに設定しないと、複数の異なるソースからサイトの特定の記事にアクセスできます(実際には同じ記事を表示して共有できますが、表示されるURLは異なります) Facebookはそれが別の記事だと思うでしょう。そのため、1つの唯一の正規URLではなく、すべてのユーザーに時間の経過とともにクローラリクエストが生成されます。詳細情報here

希望します。

関連する問題