Google 애널리틱스에서 Google이 렌더링한 URL을 보는 방법

게시 됨: 2021-06-11

먼저 번역에 도움을 준 Christian에게 특별한 감사를 드립니다!

Google이 휴대전화를 사용하는 실제 사용자가 볼 수 있는 것과 같은 방식으로 자바스크립트로 콘텐츠를 크롤링하고 로드하는 기능을 크게 개선하기 시작한 지 몇 년이 지났습니다.

그럼에도 불구하고 Google은 인프라를 개선하더라도 찾은 모든 URL을 크롤링할 수 없습니다. 크롤링 및 렌더링(시각적 구조로 HTML 문서를 변환하는 프로세스) 비용이 단순히 크롤링하고 가져오는 것보다 훨씬 크기 때문입니다. URL의 HTML. Google 자체가 이를 인정했으므로 Google이 특히 클라이언트(CSR, Client Side Rendering)에서 실행되는 JS에 의존하는 더 큰 사이트 및/또는 사이트에서 가장 중요한 URL을 찾고 렌더링하고 색인을 생성하도록 하는 것이 중요합니다.

몇 년 전만 해도 URL의 내용을 평가하고 색인에 추가할지 여부를 결정하기 위해 Google은 URL의 HTML(및 여기에 링크된 이미지)을 가져오는 것으로 충분했습니다. 해당 HTML은 렌더링 후 Javascript를 사용하여 HTML을 수정했는지 여부를 고려하지 않고 Google에서 URL을 색인화하고 순위를 지정하는 데 사용한 콘텐츠였습니다.

이제 HTML 클라이언트 측을 수정하는 자바스크립트 프레임워크의 과대 광고와 함께 Google은 콘텐츠를 렌더링하고 최종 HTML이므로 인덱스로 갈지 여부를 결정할 수 있습니다.

이 전체 프로세스는 일반 사용자가 볼 수 있는 것처럼 한 배치로 수행되지 않습니다. 두 단계로 수행됩니다. 먼저 Google은 URL을 크롤링하여 "렌더링되지 않은" HTML을 가져오고(지금까지 그래왔듯이) 잠시 후(고정된 시간 없이) 해당 HTML에서 참조하는 나머지 리소스를 가져와 시도합니다. 렌더링된 최종 HTML을 얻기 위해 페이지를 렌더링합니다. 이 두 번째 단계를 "인덱싱의 두 번째 물결"이라고 합니다.

여러 URL을 크롤링하고 색인을 생성하기 위해 렌더링 비용이 시간과 리소스 모두에서 렌더링되지 않은 HTML을 얻는 것보다 훨씬 더 크다는 것을 이해하기 위해 많은 기술 지식이 필요하지 않습니다. 따라서 동일한 양의 유한 리소스를 사용하여 Google은 렌더링해야 하는 경우 더 적은 URL을 크롤링하고 색인을 생성할 수 있습니다. 그렇기 때문에 Google은 렌더링할 URL과 렌더링하지 않을 URL을 결정/우선순위를 지정해야 합니다.

다음에 크롤링해야 하는 URL을 결정하기 위해 Google은 각 URL의 PageRank와 같은 다른 요인을 고려하거나 웹마스터가 크롤링과 관련된 특정 설정을 구성한 경우 해당 URL이 마지막으로 크롤링된 이후에 변경되었을 가능성을 계산합니다. 빈도. 이것은 변경되지 않은 것을 크롤링하는 데 제한된 리소스를 사용하는 것은 쓸모가 없기 때문에 의미가 있습니다.

Google이 다음에 크롤링할 URL을 결정하는 방법을 이해하기 위해 잘 알려져 있지 않고 매우 공개적일 수 있기 때문에 이 기사를 여러분과 공유하고 싶습니다. Google 엔지니어가 작성했으며 실제 문제를 해결하기 위한 수학적 추상화입니다. 수학 공식을 두려워하지 마십시오. 데이터 과학자가 아닌 사람들을 위해 완벽하게 설명되어 있습니다.

다음에 크롤링할 URL을 결정한 후 Googlebot은 크롤링된 각 URL에 대해 해당 URL을 렌더링할지 여부를 결정해야 하며 URL을 렌더링하기로 결정한 경우 이를 수행하는 데 모든 리소스가 필요합니다. 필요한 각 리소스를 요청할 필요가 있는지 결정하기 위해 비슷한 수학적 프로세스를 사용하지만 캐시 시간, 리소스 확보 비용 등과 같은 몇 가지 차이점이 있습니다.

이 모든 것 때문에 우리 사이트의 어떤 URL이 Google에 의해 크롤링되고 어떤 URL이 렌더링되는지 아는 것이 매우 중요합니다. Funnel▼Punk(우리가 큰 웹사이트를 작업하는 곳)에서 사용하는 해당 정보를 얻는 쉬운 방법은 서버 로그를 분석하는 것입니다(여기 내 블로그에는 스페인어로, 다른 하나는 Oncrawl 블로그에 있습니다. ), Googlebot이 우리 사이트에서 하는 일에 대한 전체 그림을 얻습니다. 많은 사람들에게 로그 분석은 지루하고 비용이 많이 들 수 있습니다. 따라서 Google Analytics에서 Googlebot이 렌더링하는 URL을 추적하는 방법을 공유하고자 합니다.

[사례 연구] Google의 봇 크롤링 관리

26,000개 이상의 제품 참조가 있는 1001Pneus는 SEO 성능을 모니터링하고 Google이 올바른 카테고리와 페이지에 크롤링 예산을 사용하고 있는지 확인하는 안정적인 도구가 필요했습니다. OnCrawl을 사용하여 전자 상거래 웹사이트에 대한 크롤링 예산을 성공적으로 관리하는 방법을 알아보십시오.
사례 연구 읽기

Google에서 렌더링한 추적 URL

이 방법은 적어도 모든 개발 팀과 PHP 또는 이와 유사한 작업에 사용되는 웹마스터에게 비교적 간단합니다. 3단계가 있습니다.

  1. 자바스크립트 코드 추가
    코드는 Googlebot이 일반 사용자와 동일한 방식으로 자바스크립트를 실행한 시점을 감지하고 자바스크립트(투명 픽셀)를 사용하여 이미지를 로드합니다.
  2. 서버 구성
    투명 픽셀의 URL이 요청될 때 PHP 파일(또는 백엔드에서 사용되는 다른 프로그래밍 언어)을 실행하도록 서버를 구성합니다.
  3. Google 애널리틱스로 데이터 보내기
    PHP 파일은 Googlebot이 실제로 Googlebot인지 확인하고, 그렇다면 데이터를 Google Analytics로 보냅니다.

자바스크립트 코드 추가
내가 시도한 다른 실험에서 Googlebot이 자바스크립트 코드에 사용자 상호작용이 필요하지 않을 때만 자바스크립트를 실행한다는 것을 확인했습니다. 예를 들어 Googlebot은 onload 또는 onready 이벤트로 트리거되는 모든 자바스크립트 코드를 실행합니다. 이 예제에서는 onLoad 이벤트, 즉 페이지의 모든 요소가 로드될 때 트리거되는 함수를 만들 것입니다.

이 함수는 사용자 에이전트에 Googlebot의 알려진 봇이 포함되어 있는지 확인하고 포함되어 있으면 이미지(투명 픽셀)를 로드하며 이름은 TransparentPixelGooglebot.gif입니다.

 <스크립트>
window.addEventListener("로드", function(){
    var botPattern = "googlebot|Googlebot-Mobile|Googlebot-Image|Google 파비콘|Mediapartners-Google";
    var re = 새로운 RegExp(botPattern, 'i');
    var userAgent = 내비게이터.userAgent; 

    if (re.test(userAgent)) {
        var 클라이언트 = 새로운 XMLHttpRequest();
        var trackRenderURL='https://www.mecagoenlos.com/TransparentPixelGooglebot.gif?OriginUrl='+window.location.href;
        
        client.open('GET', trackRenderURL);
        client.setRequestHeader('콘텐츠 유형', '텍스트/일반;charset=UTF-8');
        client.send(null);
    }
});
</스크립트>
Googlebot이 Javascript에 액세스하고 실행할 때마다 "TransparentPixelGooglebot.gif" 이미지를 로드하고 액세스한 특정 URL을 지정하는 일부 매개변수를 이미지의 URL에 추가하는 기능이 트리거됩니다.

이 변수에서 우리는 "TransparentPixelGooglebot.gif" 이미지를 로드하기 위해 요청될 전체 URL을 구성할 것입니다. 여기에 액세스한 URL과 이를 요청하는 사용자 에이전트를 추가합니다.

 var trackRenderURL='https://www.mecagoenlos.com/TransparentPixelGooglebot.gif?OriginUrl='+window.location.href;

서버 구성(.htaccess)

다음 단계는 픽셀의 URL(TransparentPixelGooglebot.gif)이 요청될 때마다 PHP 파일(GooglebotRenderJS.php)이 실행되도록 서버를 구성하는 것입니다.

이렇게 하려면 .htaccess 파일을 약간 변경해야 합니다(백엔드 프로그래밍 언어로 Apache 서버와 PHP를 사용하기 때문에).

이 두 가지 특정 행이 이를 가능하게 하는 행입니다.

 RewriteCond %{REQUEST_URI} TransparentPixelGooglebot.gif
RewriteRule 투명픽셀Googlebot.gif(.*)$ https://www.mecagoenlos.com.com/GooglebotRenderJS.php$1

짐작할 수 있듯이 픽셀 요청에 포함된 매개변수는 PHP 파일(GooglebotRenderJS.php)이 "읽을" 수 있도록 전파됩니다.

온크롤 데이터³

추가 데이터 세트에 대한 원활한 연결로 분석을 확장하십시오. CRM, 모니터링 솔루션 또는 기타 소스의 백링크, SEO 트래픽, 순위 및 사용자 지정 데이터 세트에 대한 데이터를 기반으로 SEO 전략을 분석합니다.
더 알아보기

PHP 파일에서 Google Analytics로 데이터 보내기

마지막 단계에서는 픽셀(TransparentPixelGooglebot.gif)이 요청될 때마다 실행될 PHP 파일(GooglebotRenderJS.php)을 만듭니다.

이 파일은 다음을 수행합니다.

  1. 역 DNS를 사용하여 요청이 실제로 Googlebot이 했는지 또는 Googlebot의 User Agent를 사용하여 가짜 Googlebot이 요청했는지 확인
  2. 봇 유형 식별(Googlebot 모바일, 이미지, 광고 등)
  3. 다음 변수를 할당할 이벤트 내에서 Google Analytics(Google Analytics의 측정 프로토콜 사용)로 데이터를 보냅니다.
  • 이벤트 카테고리: "GoogleRenderFromHtaccess"
  • 이벤트 작업: 렌더링된 URL(픽셀 요청의 리퍼러)
  • 이벤트 레이블: 사용자 에이전트, IP 및 봇이 실제 Googlebot인지("실제") 또는 가짜("가짜")인지를 연결하는 문자열입니다. Googlebot의 ID가 올바르게 작동하는지 확인하기 위해 3개를 GA로 보냅니다.
  • *중요: 나는 모든 것이 올바르게 작동하는지 테스트하기 위해 이틀 동안만 IP를 저장했습니다. 나중에 데이터 보호법에 문제가 있을 경우를 대비하여 IP를 저장하지 않았습니다.
 <?php

header("Pragma 지시문: 캐시 없음");
header("캐시 지시어: 캐시 없음");
header("캐시 제어: 캐시 없음");
header("프라그마: 캐시 없음");
header("만료: 0");
if ($_GET["OriginUrl"])
    $src=$_GET["OriginUrl"];
또 다른
    $src = $_SERVER['HTTP_REFERER']; 
$UA=$_SERVER["HTTP_USER_AGENT"]; 
$RenderParameters=$_GET["RenderParameters"];
기능 GoogleCheker($Ip){

    # 불필요한 조회를 피하기 위해 UA가 다음 중 하나와 일치하는지 확인하십시오.
    # 우리가 좋아하는 봇
    
        $hostname=gethostbyaddr($Ip);    
        $ip_by_hostname=gethostbyname($hostname);   
        if(preg_match("/googlebot/i",$hostname))
        if ($ip_by_hostname == $IP)
            true를 반환합니다.
        또 다른
                거짓을 반환합니다.
        
        또 다른
                거짓을 반환합니다.
        
        
}
기능 GoogleChekerExtend($Ip){

    # 불필요한 조회를 피하기 위해 UA가 다음 중 하나와 일치하는지 확인하십시오.
    # 우리가 좋아하는 봇
    
        $hostname=gethostbyaddr($Ip);    
        $ip_by_hostname=gethostbyname($hostname);   
        if(preg_match("/\.google\.com[\.]?$/i",$hostname))
        if ($ip_by_hostname == $IP)
            true를 반환합니다.
        또 다른
                거짓을 반환합니다.
        
        또 다른
                거짓을 반환합니다.
        
        
}
$botname="초기화";
$bots = array('Mediapartners-Google[ /]([0-9.]{1,10})' => 'Google 미디어 파트너',
    'Mediapartners-Google' => 'Google Mediapartners',
    '구글(e|ebot)(-이미지)/([0-9.]{1,10})' => '구글 이미지',
    '구글(e|ebot)(-이미지)/' => '구글 이미지',
    '^gsa-crawler' => '구글',
    '구글(e|ebot)(-사이트맵)/([0-9.]{1,10})?' => 'Google 사이트맵',
    'GSiteCrawler[ /v]*([0-9.az]{1,10})?' => 'Google 사이트맵',
    'Googl(e|ebot)(-Sitemaps)' => 'Google-Sitemaps',
    '모바일.*Googlebot' => 'Google-모바일',
    '^AdsBot-Google' => 'Google-AdsBot',
    '^Feedfetcher-Google' => 'Google-Feedfetcher',
    '호환; Google 데스크톱' => 'Google 데스크톱',
    '구글봇' => '구글봇');

foreach( $bots as $pattern => $bot ) {
if ( preg_match( '#'.$pattern.'#i' , $UA) == 1 )
{
    $botname = preg_replace ( "/\\s{1,}/i" , '-' , $bot );
    부서지다;
}
}

if(GoogleCheker($_SERVER['REMOTE_ADDR']))
    $isGoogle="진짜";
elseif(GoogleChekerExtend($_SERVER['REMOTE_ADDR']))
        $isGoogle="확장";
    또 다른
        $isGoogle="가짜";

클래스 BotTracker {
    
    정적 함수 트랙($s, $params){
        
        
            
            $봇 = "";
            
            $data = 배열( 
                'v' => 1, 
                'tid' => 'UA-XXXXXXX-1',
                'cid' => self::generate_uuid(), 
                't' => '이벤트',
                'dh' => $s['HTTP_HOST'], 
                'dl' => $s['REQUEST_URI'], 
                'dr' => $s['HTTP_REFERER'],	
                'dp' => $s['REQUEST_URI'], 
                'dt' => $params['page_title'], 
                'ck' => $s['HTTP_USER_AGENT'], 
                'uip' => $s['REMOTE_ADDR'],
                '니' => 1,
                'ec' => 'GoogleRenderHtaccess',
                'el' => $params['UA']." - ".$params["RenderParameters"]." -" .$params['botname']." - ".$params['isGoogle']." - ip: ".$s['REMOTE_ADDR'], // 테스트 후 삭제
                //'el' => $params['UA']." - ".$params["RenderParameters"]." -" .$params['botname']." - ".$params['isGoogle'] ,
                'ea' => $params['RenderedURL']
            );
            
            $url = 'http://www.google-analytics.com/collect';
            $content = http_build_query($data); 
    
            $ch = curl_init();
            curl_setopt($ch, CURLOPT_USERAGENT, $s['HTTP_USER_AGENT']);
            curl_setopt($ch, CURLOPT_URL, $url);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
            curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 0);
            curl_setopt($ch, CURLOPT_CONNECTTIMEOUT_MS, 0);
            curl_setopt($ch, CURLOPT_TIMEOUT_MS, 0);
            curl_setopt($ch, CURLOPT_HTTPHEADER, array('콘텐츠 유형: 응용 프로그램/x-www-form-urlencoded'));
            curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
            curl_setopt($ch, CURLOPT_POST, 1);
            curl_setopt($ch,CURLOPT_ENCODING, "gzip");
            curl_setopt($ch, CURLOPT_POSTFIELDS, $content);
            $결과 = curl_exec($ch);
            $info= curl_getinfo($ch);
            curl_close($ch);
        }
        정적 개인 함수 생성_uuid() {
        
        return sprintf( '%04x%04x-%04x-%04x-%04x-%04x%04x%04x',
            mt_rand( 0, 0xffff ), mt_rand( 0, 0xffff ),
            mt_rand(0, 0xffff),
            mt_rand( 0, 0x0fff ) | 0x4000,
            mt_rand( 0, 0x3fff ) | 0x8000,
            mt_rand( 0, 0xffff ), mt_rand( 0, 0xffff ), mt_rand( 0, 0xffff )
        );
    }
    
    
    
    
    
}
 BotTracker::track($_SERVER, array("page_title"=>"VirtualRenderTitle","RenderedURL"=>$src,"isGoogle"=>$isGoogle,"botname"=>$botname,"UA"=>$UA ,"RenderParameters"=>$RenderParameters));

?>

설정이 Google Analytics에서 작동하는지 확인

모든 것이 설정되었습니다! 이제 모든 것이 예상대로 작동하는지 확인할 수 있습니다. 이를 위해 Google Analytics의 실시간 보고서를 사용하고 "이벤트" 보고서를 선택할 수 있습니다. 다른 탭에서 Search Console을 열고 웹사이트의 속성으로 이동한 다음 URL Inspector를 사용하여 Google이 URL을 크롤링하고 렌더링하도록 합니다. 모든 것이 제대로 작동하면 Google Analytics 실시간 이벤트 보고서에 새 이벤트가 표시됩니다.

보시다시피 이벤트가 "nonInteraction" 매개변수로 구성되어 있기 때문에 이러한 이벤트는 당사 사이트의 활성 사용자로 계산되지 않습니다.

이벤트 카테고리 "GoogleRenderFromHtaccess"를 클릭하면 사용자 에이전트, IP 및 봇이 실제 또는 가짜로 식별되었는지 확인할 수 있습니다.

URL을 렌더링하려고 시도하는 Google에서 생성한 추적 오류

우리는 이미 Google에서 렌더링되는 URL을 추적하고 확인하는 방법을 살펴보았습니다. 그러나 더 나아가 Google이 사이트의 URL을 렌더링하려고 할 때 생성되는 Javascript 오류를 추적할 수 있습니다.

Javascript가 렌더링될 때 사용자의 브라우저에서만 볼 수 있는 오류가 생성될 수 있으며(저희 서버에는 없음) 이러한 오류를 추적하는 것은 쉬운 일이 아닙니다.

요즘 Googlebot이 URL을 렌더링할 때 생성되는 Javascript 오류를 확인하려면 Search Console의 URL Inspector를 통해서만 확인할 수 있습니다.

  1. URL 검사:
  2. "실시간 URL 테스트"를 클릭하십시오.
  3. 오류가 있는지 확인하십시오.

많은 URL에 대해 수동으로 이 작업을 수행하는 것은 많은 작업이지만 Googlebot이 URL을 렌더링하려고 할 때 자바스크립트 오류가 있는지 추적하기 위해 방금 보여드린 코드를 사용할 수 있습니다.

코드가 작동하는지 확인하기 위해 의도적으로 생성된 오류의 예:

자바스크립트 코드 추가
이전 예제에서 했던 것과 같은 방식으로 "window.addEventListener('error', function(e)" 코드 줄을 사용하여 Javascript 오류를 캡처합니다.

오류가 발생할 때마다 해당 오류를 저장하고 Google Analytics로 보낼 수 있는 기능이 실행됩니다. 이것은 자바스크립트 오류가 있을 때만 이 함수가 실행된다는 경고와 함께 이전 예제에서 했던 것과 매우 유사합니다.

 window.addEventListener('오류', function(e) {
        var botPattern = "googlebot|Googlebot-Mobile|Googlebot-Image|Google 파비콘|Mediapartners-Google";
        var re = 새로운 RegExp(botPattern, 'i');
        var userAgent = 내비게이터.userAgent; 
        if (re.test(userAgent)) {
            var 클라이언트 = 새로운 XMLHttpRequest();
            var ErrorsURLPixel='https://www.mecagoenlos.com/TransparentPixelGooglebotError.gif?OriginUrl='+window.location.href+'&textError='+unescape(encodeURIComponent(e.message))+'&LineError='+unescape(encodeURIComponent (e.lineno.toString()))+'&UA='+unescape(encodeURIComponent(userAgent));
        
            client.open('GET',ErrorsURLPixel);
            client.setRequestHeader('콘텐츠 유형', '텍스트/일반;charset=UTF-8');
            client.send(e);
        }
    });

이 코드는 다른 투명 픽셀(TransparentPixelGooglebotError.gif)을 로드하는 함수를 실행하고, 렌더링되는 URL, 오류 및 사용자 에이전트를 매개변수로 추가하여 다음과 같은 URL에 대한 요청을 생성합니다.

 var ErrorsURLPixel='https://www.mecagoenlos.com/TransparentPixelGooglebotError.gif?OriginUrl='+window.location.href+'&textError='+unescape(encodeURIComponent(e.message))+'&LineError='+unescape(encodeURIComponent (e.lineno.toString()))+'&UA='+unescape(encodeURIComponent(userAgent));

서버 구성(.htaccess)
이전 예제와 같은 방식으로 .htaccess에 몇 가지 규칙을 추가하여 픽셀이 로드되고 PHP 파일을 실행할 때를 감지합니다.

 RewriteCond %{REQUEST_URI} TransparentPixelGooglebotError.gif
RewriteRule 투명픽셀GooglebotError.gif(.*)$ https://modelode.com/GooglebotErrorRenderJS.php$1

이렇게 하면 "https://www.mecagoenlos.com/TransparentPixelGooglebotError.gif"가 요청될 때마다 "GooglebotErrorRenderJS.php" PHP 파일이 실행됩니다.
PHP 파일
이 PHP 파일은 Googlebot이 실제인지 확인하고 "ErrorsGoogleRender" 카테고리의 이벤트를 사용하여 데이터를 Google Analytics로 전송하고 렌더링된 URL을 이벤트 작업으로 사용하고 오류 자체를 이벤트 레이블로 사용합니다.

 <?php

header("Pragma 지시문: 캐시 없음");
header("캐시 지시어: 캐시 없음");
header("캐시 제어: 캐시 없음");
header("프라그마: 캐시 없음");
header("만료: 0");
if ($_GET["OriginUrl"])
    $src=$_GET["OriginUrl"];
또 다른
    $src = $_SERVER['HTTP_REFERER']; 
$UA=$_SERVER["HTTP_USER_AGENT"]; 
$RenderParameters=$_GET["RenderParameters"];
$textError=$_GET["텍스트 오류"];
$lineError=$_GET["라인 오류"];
기능 GoogleCheker($Ip){

    # 불필요한 조회를 피하기 위해 UA가 다음 중 하나와 일치하는지 확인하십시오.
    # 우리가 좋아하는 봇
    
        $hostname=gethostbyaddr($Ip);    
        $ip_by_hostname=gethostbyname($hostname);   
        if(preg_match("/googlebot/i",$hostname))
        if ($ip_by_hostname == $IP)
            true를 반환합니다.
        또 다른
                거짓을 반환합니다.
        
        또 다른
                거짓을 반환합니다.
        
        
}
기능 GoogleChekerExtend($Ip){

    # 불필요한 조회를 피하기 위해 UA가 다음 중 하나와 일치하는지 확인하십시오.
    # 우리가 좋아하는 봇
    
        $hostname=gethostbyaddr($Ip);    
        $ip_by_hostname=gethostbyname($hostname);   
        if(preg_match("/\.google\.com[\.]?$/i",$hostname))
        if ($ip_by_hostname == $IP)
            true를 반환합니다.
        또 다른
                거짓을 반환합니다.
        
        또 다른
                거짓을 반환합니다.
        
        
}
$botname="초기화";
$bots = array('Mediapartners-Google[ /]([0-9.]{1,10})' => 'Google 미디어 파트너',
    'Mediapartners-Google' => 'Google Mediapartners',
    '구글(e|ebot)(-이미지)/([0-9.]{1,10})' => '구글 이미지',
    '구글(e|ebot)(-이미지)/' => '구글 이미지',
    '^gsa-crawler' => '구글',
    '구글(e|ebot)(-사이트맵)/([0-9.]{1,10})?' => 'Google 사이트맵',
    'GSiteCrawler[ /v]*([0-9.az]{1,10})?' => 'Google 사이트맵',
    'Googl(e|ebot)(-Sitemaps)' => 'Google-Sitemaps',
    '모바일.*Googlebot' => 'Google-모바일',
    '^AdsBot-Google' => 'Google-AdsBot',
    '^Feedfetcher-Google' => 'Google-Feedfetcher',
    '호환; Google 데스크톱' => 'Google 데스크톱',
    '구글봇' => '구글봇');

foreach( $bots as $pattern => $bot ) {
if ( preg_match( '#'.$pattern.'#i' , $UA) == 1 )
{
    $botname = preg_replace ( "/\\s{1,}/i" , '-' , $bot );
    부서지다;
}
}

if(GoogleCheker($_SERVER['REMOTE_ADDR']))
    $isGoogle="진짜";
elseif(GoogleChekerExtend($_SERVER['REMOTE_ADDR']))
        $isGoogle="확장";
    또 다른
        $isGoogle="가짜";

클래스 BotTracker {
    
    정적 함수 트랙($s, $params){
        
        
            
            $봇 = "";
            
            $data = 배열( 
                'v' => 1, 
                'tid' => 'UA-XXXX-1',
                'cid' => self::generate_uuid(), 
                't' => '이벤트',
                'dh' => $s['HTTP_HOST'], 
                'dl' => $s['REQUEST_URI'], 
                'dr' => $s['HTTP_REFERER'],	
                'dp' => $s['REQUEST_URI'], 
                'dt' => $params['page_title'], 
                'ck' => $s['HTTP_USER_AGENT'], 
                'uip' => $s['REMOTE_ADDR'],
                '니' => 1,
                'ec' => 'ErrorsGoogleRender',
                'el' => $params['textError']." (줄:".$params['lineError'].") - ".$params['UA']." - " .$params['botname' ]." - ".$params['isGoogle']."- ip: ".$s['REMOTE_ADDR'], //테스트 후 삭제
                //'el' => $params['UA']." - ".$params["RenderParameters"]." -" .$params['botname']." - ".$params['isGoogle'] ,
                'ea' => $params['RenderedURL']
            );
            
            $url = 'http://www.google-analytics.com/collect';
            $content = http_build_query($data); 
    
            $ch = curl_init();
            curl_setopt($ch, CURLOPT_USERAGENT, $s['HTTP_USER_AGENT']);
            curl_setopt($ch, CURLOPT_URL, $url);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
            curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 0);
            curl_setopt($ch, CURLOPT_CONNECTTIMEOUT_MS, 0);
            curl_setopt($ch, CURLOPT_TIMEOUT_MS, 0);
            curl_setopt($ch, CURLOPT_HTTPHEADER, array('콘텐츠 유형: 응용 프로그램/x-www-form-urlencoded'));
            curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
            curl_setopt($ch, CURLOPT_POST, 1);
            curl_setopt($ch,CURLOPT_ENCODING, "gzip");
            curl_setopt($ch, CURLOPT_POSTFIELDS, $content);
            $결과 = curl_exec($ch);
            $info= curl_getinfo($ch);
            curl_close($ch);
        }
        정적 개인 함수 생성_uuid() {
        
        return sprintf( '%04x%04x-%04x-%04x-%04x-%04x%04x%04x',
            mt_rand( 0, 0xffff ), mt_rand( 0, 0xffff ),
            mt_rand(0, 0xffff),
            mt_rand( 0, 0x0fff ) | 0x4000,
            mt_rand( 0, 0x3fff ) | 0x8000,
            mt_rand( 0, 0xffff ), mt_rand( 0, 0xffff ), mt_rand( 0, 0xffff )
        );
    }
    
    
    
    
    
}
 BotTracker::track($_SERVER, array("page_title"=>"VirtualRenderTitle","RenderedURL"=>$src,"isGoogle"=>$isGoogle,"botname"=>$botname,"UA"=>$UA ,"RenderParameters"=>$RenderParameters,"textError"=>$textError,"lineError"=>$lineError));

?>

이제 Google이 URL을 렌더링하려고 할 때 어떤 자바스크립트 오류가 발생하는지 이미 알 수 있습니다.

PHP 파일에서 Google Analytics로 데이터 보내기
이 구현을 통해 Google이 URL을 렌더링하려고 할 때 어떤 특정 자바스크립트 오류가 생성되고 어떤 특정 URL에서 오류가 발생하는지 확인할 수 있습니다.

Googlebot이 일부 상호 작용(예: 스크롤, 클릭 또는 기타 Javascript 이벤트)을 시도하는지 확인하는 것과 같이 Google의 렌더링 프로세스와 관련하여 추적할 다른 정보가 많이 있지만 다른 게시물에 보관하겠습니다. 당신이 그것을 좋아했기를 바랍니다!