どうすればウェブクローラーなどからのヒットを除外できますか?人間でないヒットを..
Maxmind.comを使用してIPから都市をリクエストします。Webクローラー、ロボットなどを含むすべてのヒットに対して支払う必要がある場合、それはかなり安くはありません。
ロボットを検出する一般的な方法は2つあり、私はそれらを "Polite/Passive"および "Aggressive"と呼びます。基本的に、あなたはあなたのウェブサイトに心理的障害を与えなければなりません。
これらは、サイトをクロールしてはならないことをクローラーに丁寧に伝え、クロールされる頻度を制限する方法です。ポライトネスは robots.txt ファイルによって保証されます。このファイルでは、Webサイトのクロールを許可するボット(ある場合)と、Webサイトをクロールできる頻度を指定します。これは、あなたが扱っているロボットが礼儀正しいと仮定しています。
ボットをサイトに近づけない別の方法は、攻撃的になることです。
ユーザーエージェント
一部の攻撃的な動作には、(他のユーザーが以前に述べたように)ユーザーエージェント文字列のフィルタリングが含まれます。これはおそらく最も簡単ですが、それがユーザーであるかどうかを検出する最も信頼性の低い方法でもあります。多くのボットはユーザーエージェントを偽装する傾向があり、正当な理由でモバイルボットを実行するボットもあります(モバイルコンテンツのみをクロールしたいなど)。ボットとして識別されたくないボットもあります。さらに悪いことに、一部のボットは、合法的であると一般に見なされているグーグル、マイクロソフト、ライコス、その他のクローラーのユーザーエージェントなど、合法的なボットエージェントを偽装しています。ユーザーエージェントに依存することは役立ちますが、それだけでは役に立ちません。
ユーザーエージェントを偽装し、robots.txtファイルを遵守しないロボットに対処するためのより積極的な方法があります。
Botトラップ
私はこれを「ビーナスフライトラップ」と考えるのが好きで、基本的にはあなたと一緒にトリックをプレイしたいボットを罰します。
ボットトラップは、ウェブサイトの使いやすさを実際に損なうことなくrobots.txtファイルに準拠していないボットを見つける最も効果的な方法です。ボットトラップを作成すると、ボットのみがキャプチャされ、実際のユーザーはキャプチャされません。これを行う基本的な方法は、robots.txtファイルで特に立入禁止としてマークしたディレクトリを設定することです。これにより、丁寧なロボットがトラップに陥ることはありません。 2番目に行うことは、Webサイトからボットトラップディレクトリに「非表示」リンクを配置することです(これにより、実際のユーザーは目に見えないリンクをクリックすることがないため、実際のユーザーがそこに行くことはありません)。最後に、ボットトラップディレクトリに移動するIPアドレスをすべて禁止します。
これを実現する方法のいくつかの手順を次に示します。 ボットトラップを作成する (またはあなたの場合: PHPボットトラップ )。
注:もちろん、一部のボットはrobots.txtファイルを読み取るのに十分スマートで、「立入禁止」としてマークしたすべてのディレクトリを表示し、ポライトネス設定(クロール速度や許可されたボットなど)を無視します。これらのボットは、礼儀正しくないという事実にもかかわらず、おそらくボットトラップに分類されません。
暴力的
これは実際には一般の視聴者(および一般的な用途)には攻撃的すぎると思うので、18歳未満の子供がいる場合は、別の部屋に連れて行ってください!
Robots.txtファイルを指定しないだけで、ボットトラップを「violent」にすることができます。この状況では、非表示のリンクをクロールするANY BOTはおそらくボットトラップになり、すべてのボットを禁止できます(期間)。
これが推奨されない理由は、一部のボットにWebサイトをクロールさせたい場合があるためです(Google、Microsoft、またはサイトのインデックス作成用の他のボットなど)。 Google、Microsoft、Lycosなどのボットがウェブサイトを丁寧にクロールできるようにすると、サイトがインデックスに登録され、お気に入りの検索エンジンで検索したときに表示されます。
自己破壊的
ボットがWebサイトでクロールできるものを制限するさらに別の方法は、ボットが解決できないCAPTCHAまたはその他の課題に対応することです。これはユーザーの負担になりますが、私はあなたのウェブサイトを使いにくくするもの(CAPTCHAなど)はすべて「自己破壊的」だと思います。もちろん、これはボットがあなたのウェブサイトを繰り返しクロールしようとするのを実際にブロックするのではなく、単にあなたのウェブサイトを非常に興味のないものにするだけです。 CAPTCHAを「回避する」方法はいくつかありますが、それらを実装するのは難しいため、これについてはあまり深く掘り下げません。
あなたの目的のために、ボットに対処する最良の方法は、上記の戦略の組み合わせを採用することです:
暴力的なボットトラップに入るすべてのボットをキャッチし、それらのIPをブラックリストに登録します(ただし、ブロックしないでください)。この方法でも、ボットによるクロールの「メリット」は得られますが、ボットトラップにアクセスするためにブラックリストに登録されているIPアドレスを確認するために支払う必要はありません。
次のようなUSER_AGENTを確認できます。
function crawlerDetect($USER_AGENT)
{
$crawlers = array(
array('Google', 'Google'),
array('msnbot', 'MSN'),
array('Rambler', 'Rambler'),
array('Yahoo', 'Yahoo'),
array('AbachoBOT', 'AbachoBOT'),
array('accoona', 'Accoona'),
array('AcoiRobot', 'AcoiRobot'),
array('ASPSeek', 'ASPSeek'),
array('CrocCrawler', 'CrocCrawler'),
array('Dumbot', 'Dumbot'),
array('FAST-WebCrawler', 'FAST-WebCrawler'),
array('GeonaBot', 'GeonaBot'),
array('Gigabot', 'Gigabot'),
array('Lycos', 'Lycos spider'),
array('MSRBOT', 'MSRBOT'),
array('Scooter', 'Altavista robot'),
array('AltaVista', 'Altavista robot'),
array('IDBot', 'ID-Search Bot'),
array('eStyle', 'eStyle Bot'),
array('Scrubby', 'Scrubby robot')
);
foreach ($crawlers as $c)
{
if (stristr($USER_AGENT, $c[0]))
{
return($c[1]);
}
}
return false;
}
// example
$crawler = crawlerDetect($_SERVER['HTTP_USER_AGENT']);
ユーザーエージェント( $_SERVER['HTTP_USER_AGENT']
)は、接続しているエージェントがブラウザかロボットかを識別することがよくあります。サイトにアクセスするクローラーのユーザーエージェントのログ/分析を確認します。それに応じてフィルタリングします。
ユーザーエージェントは、クライアントアプリケーションによって提供されるヘッダーであることに注意してください。そのため、ほとんど何でも可能であり、100%信頼されるべきではありません。それに応じて計画します。
User-Agentをチェックすると、GoogleやYahooなどの正当なボットから保護されます。
ただし、スパムボットにも遭遇している場合は、ユーザーエージェントの比較では保護されない可能性があります。これらのボットは通常、いずれにせよ一般的なユーザーエージェント文字列を偽造するためです。その場合、より高度な手段を採用する必要があります。ユーザー入力が必要な場合は、ReCaptchaやphpMeowなどの単純な画像検証スキームが機能します。
ボットからのすべてのページヒットをフィルターで除外する場合、残念ながら、ボットがその資格情報を偽造している場合、これを行うための100%信頼できる方法はありません。これは、Web管理者が我慢しなければならない、インターネット上の厄介な事実です。
私はこのパッケージを見つけました、それは積極的に開発されており、今のところかなり気に入っています:
https://github.com/JayBizzle/Crawler-Detect
これは次のように簡単です:
use Jaybizzle\CrawlerDetect\CrawlerDetect;
$CrawlerDetect = new CrawlerDetect;
// Check the user agent of the current 'visitor'
if($CrawlerDetect->isCrawler()) {
// true if crawler user agent detected
}
// Pass a user agent as a string
if($CrawlerDetect->isCrawler('Mozilla/5.0 (compatible; Sosospider/2.0; +http://help.soso.com/webspider.htm)')) {
// true if crawler user agent detected
}
// Output the name of the bot that matched (if any)
echo $CrawlerDetect->getMatches();
seragentstring.com は、ユーザー文字列の分析に使用できるリストを提供しています。
$api_request="http://www.useragentstring.com/?uas=".urlencode($_SERVER['HTTP_USER_AGENT'])."&getJSON=all";
$ua=json_decode(file_get_contents($api_request));
if($ua["agent_type"]=="Crawler") die();