Was ist der beste Weg, um Bots von der Anzahl der Aufrufe auszuschließen?

11

Meine Website zählt die Besucheraufrufe auf bestimmten Seiten. Ich habe festgestellt, dass Google und andere Bots wie verrückt auf meine Website "klicken" und einige der Seiten unrealistische Aufrufe erhalten (im Vergleich zu denen, die von Menschen erstellt wurden).

Ich bitte um bewährte Methoden, um diese Bots aus meiner Sicht auszuschließen. Offensichtlich wird ein einfacher "Benutzeragent", der "Bot" enthält, dies nicht tun.

Ich glaube nicht, dass es eine kugelsichere Lösung gibt, noch brauche ich eine.

Hinweis: Ich verwende PHP + MySQL.

Eisberg
quelle
Die richtige Antwort auf Ihre Frage hängt von der Art der Software ab, mit der Sie Ihre Statistiken verfolgen.
Goboozo
@Goboozo Ich benutze PHP + MySQL. Dies ist nicht zum Verfolgen meiner Statistiken. Hier geht es um Abfragen nach "verwandten", "heißen" und "interessanten" Einträgen.
Eisberg

Antworten:

19

Ich bin froh, dass Sie wissen, dass es keinen kugelsicheren Weg gibt, dies zu erreichen. Das heißt, Ihr Ausblick ist zumindest realistisch.

Da JavaScript keine Option ist, würde ich sagen, dass Sie Folgendes haben:

  • Überprüfen Sie den Benutzeragenten auf das Wort "Bot". Das wird die meisten von ihnen fangen.

  • Stellen Sie eine Liste bekannter Bots zusammen und filtern Sie sie basierend auf einer eindeutigen Kennung, wahrscheinlich ihrem Benutzeragenten.

  • Fügen Sie in der Fußzeile Ihrer Website einen versteckten Link ein, der auf eine Seite verweist, auf der Benutzeragenten und / oder IP-Adressen erfasst werden. Benutzer werden dies nicht sehen, Bots jedoch. Jeder, der diese Seite besucht, wird ein Bot sein. Nimm sie auf und blockiere sie dann aus deinen Statistiken.

John Conde
quelle
Das sieht vielversprechend aus. Ich mag die Idee einer Falle. Ich mache etwas Ähnliches für die Benutzerkommentare auf meiner Site mit einem unsichtbaren Eingabefeld (anstelle eines hässlichen Captcha). :-)
Eisberg
2
@ Eisberg, es heißt Honeypot. Ich bin selbst ein großer Fan von ihnen.
John Conde
wahrscheinlich beste Lösung ...
vkGunasekaran
7

Es gibt drei ziemlich einfache Möglichkeiten:

  1. Verwenden Sie Google Analytics, das alle Daten für Sie verarbeitet und verarbeitet und Ihnen detaillierte Statistiken für Besucher und deren Zugriff auf Ihre Website präsentiert. Dies ist bei weitem die einfachste Lösung.
  2. Verwenden Sie Javascript, um zu zählen. Wenn die Seite geladen wurde, generieren Sie eine AJAX-Anforderung an Ihr Zählskript. Roboter und Spinnen führen kein Javascript aus.
  3. Das Erkennen von "Bot" in der Zeichenfolge des Benutzeragenten ist tatsächlich ziemlich zuverlässig. Alternativ können Sie sich nur an bekannte Bots wie Googlebot, Yahoo, MSNbot usw. halten. Wenn Sie diese drei Bots überprüfen, sollten 99% Ihres Bot-Verkehrs abgedeckt sein. Diese Seite hat einige andere, aber sie sieht ziemlich veraltet aus.

UPDATE: Googlebot und einige große Bots führen heutzutage JavaScript aus. Die alleinige Verwendung von Option 2 ist also nicht mehr möglich. Dies bedeutet jedoch, dass die Verwendung in Verbindung mit # 3 sehr zuverlässig sein sollte, da Sie die meisten Bots mithilfe von JS leicht ausschließen und dann auf der Serverseite wichtige Bots wie Googlebot ausschließen können, auf denen JS ausgeführt wird.

Wie in den Kommentaren erwähnt, können Sie auch versuchen, mithilfe der Google Analytics-API Ansichten für jede Seite anzuzeigen.

DisgruntledGoat
quelle
1 und 2 haben nichts mit meiner Frage zu tun. Vielleicht hätte ich fragen sollen: "Wie bekomme ich einen Ansichtszähler wie Stackechange, der Bots ignoriert?" also meine falsche :-) Trotzdem sehr schöne Liste in 3. Danke ich werde das überprüfen.
Eisberg
Entschuldigung, ich habe nicht bemerkt, dass Sie die Anzahl der Aufrufe auf der Seite anzeigen. In diesem Fall sind 2 und 3 beide lebensfähig.
DisgruntledGoat
Vielen Dank für die Mühe. Zumindest für mich ist Javascript nie die Antwort, also bin ich mit 3 festgefahren, aber es gibt so viele Indikatoren :-(
Eisberg
Tatsächlich führen einige Bots JavaScript aus. Ich habe eine Ajax-Anfrage eingerichtet, um die Größe des Ansichtsfensters im Verhältnis zur Bildschirmgröße zu verfolgen. Googlebot meldet zwei verschiedene Bildschirmgrößen.
Toxalot
Ich weiß, dass die Frage alt ist und bereits eine Lösung hat, aber warum nicht die Google Analitycs-API verwenden, wenn nur ein Zähler für menschliche Ansichten angezeigt werden soll? stackoverflow.com/questions/19484009/…
KeiserBridge
3

Wenn Sie Javascript verwenden, um Ansichten zu zählen, werden die meisten Bots es nicht ausführen und daher nicht in Ihre Ansichtszählungen einbezogen. Diese Antwort entspricht möglicherweise genau dem, was Sie möchten: /programming/1973448/how-can-i-count-a-page-views

Paulmorriss
quelle
Nein, ich verwende kein Javascript. Es ist eine normale PHP + MySQL-Website. Aber trotzdem danke für die Antwort :-)
Eisberg
Diskontieren Sie diese Antwort nicht so schnell. Selbst bei einer Site, die PHP + MySQL verwendet, hindert Sie nichts daran, ein bisschen JavaScript auszugeben, um Ihren Ansichtszähler zu generieren. Anstatt den Zähler direkt auszugeben, geben Sie etwas wie '<script> document.write (<counter-code>) </ script>' aus, wobei <counter-code> alles ist, was Sie zum Erstellen Ihres Zählers benötigen.
Itai
@Itai Sorry, aber ich werde kein Javascript verwenden, um meine Besucher zu zählen. Aber danke trotzdem.
Eisberg
Wenn Sie kein JavaScript verwenden möchten, geben Sie es einfach klar in Ihre Frage ein. Wie Itai sagte, hindert uns nichts daran, über eine JavaScript-Lösung für eine PHP-Site nachzudenken.
Tien Do
Tatsächlich führen einige Bots JavaScript aus. Ich habe eine Ajax-Anfrage eingerichtet, um die Größe des Ansichtsfensters im Verhältnis zur Bildschirmgröße zu verfolgen. Googlebot meldet zwei verschiedene Bildschirmgrößen.
Toxalot
3

Mein Ansatz umfasst zwei Durchgänge:

  1. Filtern Sie nur Webbrowser und Konsolen, indem Sie den Anfang der Benutzeragentenzeichenfolge mit abgleichen Mozilla|Opera|PSP|Bunjalloo|wii. Dank des Spoofing des Benutzeragenten erkennt diese Überprüfung fast alle Browser
  2. Bots durch gemeinsame Stoppzeichenfolgen ausschließen bot|crawl|slurp|spider

Wenn also der erste Schritt bestanden ist, gehen wir davon aus, dass es sich um einen Browser handelt und sich ein echter Besucher dahinter befindet. Wie ich jedoch herausgefunden habe, geben einige Bots vor, Mozillakompatibel zu sein , und starten ihre Benutzeragentenzeichenfolge damit. Deshalb könnte der zweite Durchgang nützlich sein und sie beseitigen.

function isBrowser () {

    return preg_match( '/^(Mozilla|Opera|PSP|Bunjalloo|wii)/i', $_SERVER['HTTP_USER_AGENT'] ) && !preg_match( '/bot|crawl|slurp|spider/i', $_SERVER['HTTP_USER_AGENT'] );
}
Anton Gudov
quelle
2

Ich verwende nur den einfachen Parsing-Ausschluss für Benutzeragenten. 99% der Bots, die auf meine Seiten gelangen, werden entfernt.

SELECT * FROM `live_visitors` where (
lower(agent) != '%bot%' and
lower(agent) != '%slurp%' and
lower(agent) != '%spider%' and
lower(agent) != '%crawl%' and
lower(agent) != '%archiver%' and
lower(agent) != '%facebook%')
Jagarock
quelle
1
Dies würde (zumindest in meinem Fall) nicht helfen, da fast jeder Bot, den ich anhand seines Verhaltens identifizieren kann (zu schnelles Durchsuchen, chronologisches Durchsuchen aller Links, ...), einen gültigen User-Agent verwendet. Aber gute Idee für andere Projekte.
Eisberg
2

Sie können ein Bild als Zähler verwenden. In diesem Fall werden keine Bots gezählt und der Seitenname wird als Abfrage mit dem Bildnamen übergeben

Ich benutze dies bei img.php, um die Seitenansicht in der Datenbank zu aktualisieren:

<?php
$xnt = $_GET["ID"]; if (isset($xnt) && is_numeric($xnt)) {
$DBServer = "localhost"; $DBUser = "xxx"; $DBPass = "xxx"; $DBaze = "xxx";
$conn = mysqli_connect($DBServer, $DBUser, $DBPass, $DBaze); 
mysqli_query($conn, "UPDATE stats SET stats_vz=stats_vz+1 WHERE stats_id=".$xnt);
mysqli_close($conn);}
$im = @imagecreatetruecolor(1, 1); imagesavealpha($im, true); imagealphablending($im, false); $white = imagecolorallocatealpha($im, 255, 255, 255, 127); imagefill($im, 0, 0, $white);
header("Content-type: image/png"); imagepng($im); imagedestroy($im);
Ashraf
quelle