วิธีที่ดีที่สุดในการยกเว้นบอทจากการดูคืออะไร


11

เว็บไซต์ของฉันนับจำนวนการดูของผู้เยี่ยมชมในบางหน้า ฉันสังเกตเห็นว่า Google และบอทอื่น ๆ "คลิก" ไปที่เว็บไซต์ของฉันอย่างบ้าคลั่งและหน้าเว็บบางหน้ามีจำนวนการดูที่ไม่สมจริง (เทียบกับที่ผลิตโดยมนุษย์)

ฉันขอวิธีปฏิบัติที่ดีที่สุดเพื่อแยกบอทเหล่านั้นออกจากจำนวนการดูของฉัน เห็นได้ชัดว่า "ตัวแทนผู้ใช้" อย่างง่าย ๆ ประกอบด้วย "bot" จะไม่ทำเช่นนั้น

ฉันไม่คิดว่าจะมีกระสุนพิสูจน์วิธีแก้ปัญหาและฉันไม่ต้องการ

หมายเหตุ:ฉันใช้ PHP + MySQL


คำตอบที่ถูกต้องสำหรับคำถามของคุณขึ้นอยู่กับประเภทของซอฟต์แวร์ที่คุณใช้ในการติดตามสถิติของคุณ
Goboozo

@Goboozo ฉันใช้ PHP + MySQL นี่ไม่ใช่สำหรับการติดตามสถิติของฉัน นี่เป็นเรื่องเกี่ยวกับแบบสอบถามสำหรับรายการ "ที่เกี่ยวข้อง", "ร้อน" และ "น่าสนใจ"
eisberg

คำตอบ:


19

ฉันดีใจที่คุณรู้ว่าจะไม่มีทางกันกระสุนในการทำสิ่งนี้ให้สำเร็จ นั่นหมายความว่าทัศนะของคุณเป็นจริงอย่างน้อย

เนื่องจาก JavaScript ไม่ใช่ตัวเลือกฉันจะบอกว่าคุณเหลือ:

  • ตรวจสอบผู้ใช้ตัวแทนสำหรับคำว่า "บอท" ในนั้น ที่จะจับพวกเขาส่วนใหญ่

  • รวบรวมรายการบ็อตที่รู้จักและกรองตามตัวระบุเฉพาะบางประเภทซึ่งอาจเป็นตัวแทนผู้ใช้

  • ใส่ลิงค์ที่ซ่อนอยู่ในส่วนท้ายของเว็บไซต์ของคุณที่เชื่อมโยงไปยังหน้าเว็บที่รวบรวมตัวแทนผู้ใช้และ / หรือที่อยู่ IP ผู้ใช้จะไม่เห็นสิ่งนี้ แต่บอทจะ ดังนั้นทุกคนที่เข้าชมหน้านั้นจะเป็นบอต บันทึกพวกเขาแล้วบล็อกพวกเขาจากสถิติของคุณ


สิ่งนี้ดูมีแนวโน้ม ฉันชอบความคิดของกับดัก ฉันทำสิ่งเดียวกันสำหรับความคิดเห็นของผู้ใช้ในเว็บไซต์ของฉันด้วยช่องใส่ที่มองไม่เห็น (แทนที่จะเป็น Captcha ที่น่าเกลียด) :-)
eisberg

2
@ eisberg เรียกว่า honeypot ฉันเป็นแฟนตัวยงของพวกเขาเอง
John Conde

อาจเป็นทางออกที่ดีที่สุด ...
vkGunasekaran

7

มีสามวิธีที่ค่อนข้างง่าย:

  1. ใช้ Google Analytics ซึ่งจะประมวลผลและจัดการข้อมูลทั้งหมดให้คุณและนำเสนอสถิติโดยละเอียดสำหรับผู้เข้าชมและวิธีที่พวกเขามาถึงไซต์ของคุณ นี่คือทางออกที่ง่ายที่สุด
  2. ใช้ Javascript เพื่อนับ เมื่อโหลดหน้าเว็บแล้วให้สร้างคำขอ AJAX ให้กับสคริปต์นับของคุณ หุ่นยนต์และแมงมุมไม่ได้เรียกใช้ Javascript
  3. การตรวจจับ "บอท" ในสตริงตัวแทนของผู้ใช้นั้นน่าเชื่อถือพอสมควร หรือคุณอาจติดกับบอทที่รู้จักเช่น Googlebot, Yahoo, MSNbot เป็นต้นการตรวจสอบทั้งสามนั้นควรครอบคลุม 99% ของปริมาณบอทของคุณ หน้านี้มีบางคนอื่น แต่มันค่อนข้างล้าสมัย

อัปเดต: Googlebot และบ็อตหลักบางตัวจะเรียกใช้ JavaScript ในวันนี้ ดังนั้นการใช้ตัวเลือก # 2 เพียงอย่างเดียวจึงไม่มีประสิทธิภาพ อย่างไรก็ตามนี่หมายความว่าการใช้ร่วมกับ # 3 น่าเชื่อถือมากเนื่องจากคุณสามารถยกเว้นบอตส่วนใหญ่ได้อย่างง่ายดายโดยใช้ JS จากนั้นในฝั่งเซิร์ฟเวอร์จะยกเว้นบอตหลัก ๆ เช่น Googlebot ที่รัน JS

นอกจากนี้ยังกล่าวถึงในความคิดเห็นที่คุณสามารถลองใช้ Google Analytics API เพื่อแสดงมุมมองสำหรับแต่ละหน้า


1 และ 2 ไม่เกี่ยวข้องกับคำถามของฉัน บางทีฉันควรถามว่า "ฉันจะรับมุมมองเคาน์เตอร์เช่น stackechange ซึ่งไม่สนใจบอทได้อย่างไร" ดังนั้นเท็จของฉัน :-) อย่างไรก็ตามรายการที่ดีมากใน 3 ขอบคุณฉันจะตรวจสอบนี้
eisberg

ขออภัยไม่ทราบว่าคุณกำลังแสดงจำนวนการดูบนหน้าเว็บ ในกรณีที่ 2 และ 3 มีทั้งที่ทำงานได้
DisgruntledGoat

ขอบคุณสำหรับความพยายาม อย่างน้อยสำหรับฉัน javascript ไม่เคยมีคำตอบดังนั้นฉันจึงติดกับ 3 แต่มีตัวบ่งชี้มากมาย :-(
eisberg

จริงๆแล้วบอตบางตัวจะเรียกใช้จาวาสคริปต์บางตัว ฉันตั้งค่าคำขอ Ajax เพื่อติดตามขนาดวิวพอร์ตที่สัมพันธ์กับขนาดหน้าจอ Googlebot กำลังรายงานขนาดหน้าจอที่แตกต่างกันสองขนาด
toxalot

ฉันรู้ว่าคำถามนั้นเก่าแล้วและมีวิธีแก้ปัญหาอยู่แล้ว แต่ทำไมไม่ใช้ Google Analitycs API หากเป็นเพียงการแสดงตัวนับจำนวนผู้ดู stackoverflow.com/questions/19484009/…
KeizerBridge

3

หากคุณใช้ Javascript เพื่อนับจำนวนการดูบอทส่วนใหญ่จะไม่เรียกใช้และจะไม่รวมอยู่ในจำนวนการดู คำตอบนี้อาจใกล้เคียงกับสิ่งที่คุณต้องการ/programming/1973448/how-can-i-count-a-page-views


ไม่ฉันไม่ได้ใช้ Javascript เป็นเว็บไซต์ PHP + MySQL ปกติ แต่ขอขอบคุณสำหรับการตอบกลับ :-)
eisberg

อย่าลดคำตอบนี้อย่างรวดเร็ว แม้จะมีเว็บไซต์ที่ใช้ PHP + MySQL ก็ไม่มีอะไรหยุดคุณจากการปล่อยจาวาสคริปต์เล็กน้อยเพื่อสร้างมุมมองเคาน์เตอร์ของคุณ แทนที่จะส่งเอาต์พุตตัวนับโดยตรงให้ส่งออกบางอย่างเช่น '<script> document.write (<counter-code>) </script>' โดยที่ <counter-code> เป็นสิ่งที่คุณต้องการสร้างตัวนับ
Itai

@Itai ขออภัย แต่ฉันจะไม่ใช้จาวาสคริปต์เพื่อนับจำนวนผู้เยี่ยมชมของฉัน แต่ขอบคุณนะ
eisberg

หากคุณไม่ต้องการใช้ JavaScript เพียงแค่ใส่ไว้ในคำถามของคุณอย่างชัดเจน ดังที่ Itai กล่าวว่าไม่มีอะไรขัดขวางเราจากการคิดเกี่ยวกับโซลูชัน JavaScript สำหรับไซต์ PHP
Tien Do

จริงๆแล้วบอตบางตัวจะเรียกใช้จาวาสคริปต์บางตัว ฉันตั้งค่าคำขอ Ajax เพื่อติดตามขนาดวิวพอร์ตที่สัมพันธ์กับขนาดหน้าจอ Googlebot กำลังรายงานขนาดหน้าจอที่แตกต่างกันสองขนาด
toxalot

3

แนวทางของฉันเกี่ยวข้องกับการผ่านสองครั้ง:

  1. Mozilla|Opera|PSP|Bunjalloo|wiiกรองเพียงเว็บเบราเซอร์และเครื่องเล่นโดยการจับคู่เริ่มต้นของสตริงตัวแทนของผู้ใช้ด้วย ขอบคุณตัวแทนผู้ใช้ที่ปลอมแปลงการตรวจสอบนี้จะตรวจสอบเบราว์เซอร์เกือบทั้งหมด
  2. ยกเว้นบ็อตด้วยสตริงหยุดทั่วไป bot|crawl|slurp|spider

ดังนั้นหากขั้นตอนแรกผ่านไปเราจะถือว่าเป็นเบราว์เซอร์และมีผู้เข้าชมจริงที่อยู่เบื้องหลัง อย่างที่ฉันทราบแม้ว่าบอตบางคนแกล้งทำเป็นMozillaเข้ากันได้และเริ่มสตริงตัวแทนผู้ใช้ด้วย นั่นเป็นเหตุผลว่าทำไมบัตรที่สองอาจมีประโยชน์และกำจัดบัตรนั้น

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'] );
}

2

ฉันใช้การแยกวิเคราะห์ตัวแทนผู้ใช้แบบง่าย ๆ กำจัดบ็อต 99% ที่เข้าไปในหน้าของฉัน

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%')

1
สิ่งนี้จะไม่ช่วย (อย่างน้อยในกรณีของฉัน) เพราะบอทเกือบทุกตัวที่ฉันสามารถระบุได้จากพฤติกรรมของมัน (การท่องเว็บเร็วเกินไปการค้นหาตามลำดับของลิงก์ทั้งหมด ... ) ใช้ตัวแทนผู้ใช้ที่ถูกต้อง แต่ความคิดที่ดีสำหรับโครงการอื่น ๆ
eisberg

2

คุณสามารถใช้รูปภาพเป็นตัวนับในกรณีนี้มันจะไม่นับบอทและชื่อเพจจะถูกส่งเป็นเคียวรีที่มีชื่อรูปภาพ

ฉันใช้สิ่งนี้ใน img.php ซึ่งอัปเดตการดูหน้าเว็บในฐานข้อมูล:

<?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);
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.