조회수에서 봇을 제외하는 가장 좋은 방법은 무엇입니까?


11

내 웹 사이트가 특정 페이지의 방문자 조회수를 계산합니다. Google과 다른 봇이 미친 것처럼 내 사이트를 '클릭'하는 것으로 나타 났으며 일부 페이지는 비현실적인 조회수를 얻었습니다 (인간이 생성 한 것과 비교).

뷰 카운트에서 해당 봇을 제외하는 모범 사례를 요청하고 있습니다. 분명히 "사용자 에이전트"에는 "봇"이 포함되어 있지 않습니다.

글 머리 기호 증명 솔루션이 없다고 생각하지도 않습니다.

참고 : PHP + MySQL을 사용하고 있습니다.


질문에 대한 정답은 통계를 추적하는 데 사용하는 소프트웨어의 종류에 따라 다릅니다.
Goboozo

@ Goboozo 저는 PHP + MySQL을 사용하고 있습니다. 내 통계를 추적하기위한 것이 아닙니다. "관련", "핫"및 "관심있는"항목에 대한 쿼리입니다.
eisberg

답변:


19

이를 달성하기위한 방탄 방법이 없다는 것을 알게되어 기쁩니다. 그것은 당신의 전망이 적어도 현실적이라는 것을 의미합니다.

JavaScript는 옵션이 아니므로 다음과 같이 남아 있다고 말할 수 있습니다.

  • 사용자 에이전트에 "bot"이라는 단어가 있는지 확인하십시오. 그것은 그들 대부분을 잡을 것입니다.

  • 알려진 봇 목록을 컴파일 하고 일종의 고유 식별자 (아마도 사용자 에이전트)를 기준으로 필터링합니다.

  • 사용자 에이전트 및 / 또는 IP 주소를 수집하는 페이지로 연결되는 웹 사이트 바닥 글에 숨겨진 링크를 넣으십시오. 사용자는 이것을 볼 수 없지만 봇은 볼 수 있습니다. 따라서 해당 페이지를 방문하는 사람은 누구나 봇이됩니다. 기록한 다음 통계에서 차단하십시오.


이것은 유망 해 보인다. 나는 함정이라는 아이디어를 좋아한다. 나는 보이지 않는 입력 필드 (못생긴 보안 문자 대신)를 사용하여 내 사이트의 사용자 의견에 대해 비슷한 것을합니다. :-)
eisberg

2
@eisberg, 허니팟이라고합니다. 나는 그들 자신의 큰 팬입니다.
John Conde

아마 최고의 솔루션 ...
vkGunasekaran

7

세 가지 간단한 방법이 있습니다.

  1. Google 웹 로그 분석을 사용하면 모든 데이터를 처리하고 처리하며 방문자에 대한 자세한 통계와 방문자의 사이트 방문 방법을 알려줍니다. 이것은 지금까지 가장 쉬운 솔루션입니다.
  2. Javascript를 사용하여 계산을 수행하십시오. 페이지가로드되면 카운팅 스크립트에 AJAX 요청을 생성하십시오. 로봇과 스파이더는 자바 스크립트를 실행하지 않습니다.
  3. 사용자 에이전트 문자열에서 "bot"을 탐지하는 것은 실제로 상당히 안정적입니다. 또는 Googlebot, Yahoo, MSNbot 등과 같은 알려진 봇에만 고정 할 수 있습니다.이 3 가지를 확인하면 봇 트래픽의 99 %를 차지해야합니다. 이 페이지 에는 다른 페이지 가 있지만 상당히 오래된 것 같습니다.

업데이트 : Googlebot 및 일부 주요 봇 요즘 JavaScript를 실행합니다. 따라서 옵션 # 2 만 사용하는 것은 더 이상 유효하지 않습니다. 그러나 이는 # 3과 함께 사용하면 JS를 사용하여 대부분의 봇을 쉽게 제외 할 수 있고 서버 측에서 JS를 실행하는 Googlebot과 같은 주요 봇을 제외 할 수 있으므로 매우 안정적이어야합니다.

또한 의견에서 언급했듯이 Google 웹 로그 분석 API를 사용하여 각 페이지에 대한보기를 표시 할 수 있습니다.


1과 2는 내 질문과 관련이 없습니다. "bot을 무시하는 stackechange와 같은 뷰 카운터를 어떻게 얻습니까?" 그래서 내 거짓 :-) 그럼에도 불구하고 3의 아주 좋은 목록입니다. 감사합니다. 이것을 확인하겠습니다.
eisberg

페이지에 조회수를 표시하고 있다는 사실을 몰랐습니다. 이 경우 2와 3 모두 실행 가능합니다.
DisgruntledGoat

노력해 주셔서 감사합니다. 적어도 나를 위해 자바 스크립트는 답이 아니므로 3으로 붙어 있지만 너무 많은 지표가 있습니다 :-(
eisberg

실제로 일부 봇은 일부 JavaScript를 실행합니다. 화면 크기와 관련하여 뷰포트 크기를 추적하도록 Ajax 요청을 설정했습니다. Googlebot은 두 가지 화면 크기를보고합니다.
toxalot

질문이 오래되었고 이미 해결책이 있지만 사람 뷰 카운터 만 표시하는 경우 Google Analitycs API를 사용하지 않는 이유는 무엇입니까? stackoverflow.com/questions/19484009/…
KeizerBridge

3

자바 스크립트를 사용하여 조회수를 계산하는 경우 대부분의 봇은이를 실행하지 않으므로 조회수에 포함되지 않습니다. 이 답변은 당신이 원하는 것에 가깝습니다 https : //.com/questions/1973448/how-can-i-count-a-page-views


아니요, 자바 스크립트를 사용하지 않습니다. 일반적인 PHP + MySQL 웹 사이트입니다. 그러나 어쨌든 회신 주셔서 감사합니다 :-)
eisberg

이 답변을 너무 빨리 할인하지 마십시오. PHP + MySQL을 사용하는 사이트의 경우에도 뷰 카운터를 생성하기 위해 약간의 JavaScript가 생성되는 것을 막을 수있는 것은 없습니다. 카운터를 직접 출력하는 대신 '<script> document.write (<counter-code>) </ script>'와 같이 출력하십시오. 여기서 <counter-code>는 카운터를 만드는 데 필요한 것입니다.
Itai

@Itai 죄송하지만 방문자 수를 계산하는 데 자바 스크립트를 사용하지 않습니다. 어쨌든 고맙습니다.
eisberg

JavaScript를 사용하지 않으려면 질문에 명확하게 입력하십시오. Itai가 말했듯이, PHP 사이트를위한 JavaScript 솔루션에 대해서는 생각할 수 없습니다.
Tien Do

실제로 일부 봇은 일부 JavaScript를 실행합니다. 화면 크기와 관련하여 뷰포트 크기를 추적하도록 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
내가 행동으로 식별 할 수있는 거의 모든 봇 (너무 빠른 탐색, 모든 링크의 시간 순 탐색) ...은 유효한 User-Agent를 사용하기 때문에 (적어도 내 경우에는) 도움이되지 않습니다. 그러나 다른 프로젝트에는 좋습니다.
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.