Как просмотреть URL-адреса, отображаемые Google, в Google Analytics

Опубликовано: 2021-06-11

Прежде всего, отдельное спасибо Кристиану за помощь в переводе!

Прошло несколько лет с тех пор, как Google начал значительно улучшать свою способность сканировать и загружать контент с помощью Javascript так, как его увидит реальный пользователь с мобильным телефоном.

Тем не менее, Google не сможет сканировать все найденные URL-адреса, даже если улучшит свою инфраструктуру, поскольку стоимость сканирования и рендеринга (процесс преобразования HTML-документа в визуальную структуру) намного больше, чем простое сканирование и получение HTML URL-адреса. Сам Google признал это, поэтому важно убедиться, что Google найдет, обработает и проиндексирует наиболее важные URL-адреса нашего сайта, особенно на более крупных сайтах и/или сайтах, которые зависят от JS, выполняемого клиентом (CSR, рендеринг на стороне клиента).

Несколько лет назад, чтобы оценить содержимое URL-адреса и решить, добавлять его в индекс или нет, Google достаточно было получить HTML-код URL-адреса (а также изображения, связанные с ним). Этот HTML-код был контентом, который Google использовал для индексации и ранжирования URL-адреса, не принимая во внимание, был ли этот HTML-код изменен с помощью Javascript после рендеринга или нет.

Теперь, с шумихой вокруг фреймворков Javascript, которые изменяют клиентскую часть HTML, Google необходимо получить HTML, код JS, стили CSS и другие ресурсы (такие как изображения, фасады и т. д.), чтобы отобразить контент и получить окончательный HTML-код, чтобы он мог решить, пойдет ли он в индекс или нет.

Весь этот процесс не выполняется за один раз, как мог бы увидеть обычный пользователь: он выполняется в два этапа. Сначала Google сканирует URL-адрес и получает «неотрендеренный» HTML-код (как это делалось до сих пор), а через некоторое время (без фиксированного заданного периода времени) он получает остальные ресурсы, на которые есть ссылки в этом HTML-коде, и пытается для рендеринга страницы, чтобы получить окончательный визуализированный HTML. Этот второй шаг называется «второй волной индексации».

Нам не нужно иметь много технических знаний, чтобы понять, что для сканирования и индексации ряда URL-адресов стоимость их рендеринга намного больше, чем просто получение неотрендеренного HTML, как по времени, так и по ресурсам. Таким образом, используя тот же объем ограниченных ресурсов, Google сможет сканировать и индексировать меньше URL-адресов, если ему потребуется их отобразить. Вот почему Google необходимо решить/расставить приоритеты, какие URL отображать, а какие нет.

Чтобы решить, какой URL-адрес следует сканировать следующим, Google рассчитывает вероятность того, что этот URL-адрес изменился с момента последнего сканирования, принимая во внимание другие факторы, такие как PageRank каждого URL-адреса или если веб-мастер настроил какие-либо конкретные параметры сканирования. частота. Это имеет смысл, так как бесполезно тратить ограниченные ресурсы на сканирование того, что не изменилось.

Я хотел бы поделиться с вами этой статьей, поскольку я думаю, что она не очень хорошо известна, и она может быть очень показательной, чтобы понять, как Google решает, какой URL сканировать следующим. Он написан инженерами Google и представляет собой математическую абстракцию для решения реальной проблемы. Не пугайтесь математических формул, они прекрасно объясняются для людей, не являющихся специалистами по данным.

Решив, какой URL сканировать следующим, робот Googlebot должен решить для каждого просканированного URL, должен ли он отображать этот URL или нет, и если он решит отображать URL, ему потребуются все ресурсы для этого. Чтобы решить, нужно ли ему запрашивать каждый из необходимых ресурсов, он, вероятно, использует аналогичный математический процесс, но с некоторыми отличиями, такими как время кэширования, стоимость получения ресурса и т. д.

Из-за всего этого очень важно знать, какие URL-адреса с нашего сайта сканируются Google, а какие отображаются. Простой способ получения этой информации, который мы используем в Funnel▼Punk (где мы работаем с крупными веб-сайтами), — это анализ журналов сервера (вот пост об этом в моем блоге на испанском и еще один в блоге Oncrawl). ), получив полное представление о том, что робот Googlebot делает на нашем сайте. Анализ журнала может быть утомительным и дорогостоящим для многих людей, поэтому я хотел бы поделиться с вами способом отслеживания того, какие URL-адреса отображаются роботом Googlebot в Google Analytics.

[Пример успеха] Управление сканированием ботов Google

Имея более 26 000 ссылок на продукты, 1001Pneus нуждался в надежном инструменте для мониторинга их эффективности SEO и уверенности в том, что Google выделяет свой краулинговый бюджет на правильные категории и страницы. Узнайте, как успешно управлять краулинговым бюджетом для веб-сайтов электронной коммерции с помощью OnCrawl.
Читать тематическое исследование

URL-адреса отслеживания, отображаемые Google

Этот метод относительно прост, по крайней мере, для любой команды разработчиков и любого веб-мастера, работавшего с PHP или чем-то подобным. Он состоит из 3 шагов:

  1. Добавить код javascript
    Код обнаружит, когда робот Googlebot выполнил Javascript так же, как это сделал бы обычный пользователь, и загрузит изображение, используя Javascript (прозрачный пиксель).
  2. Конфигурация сервера
    Настройте сервер для выполнения файла PHP (или любого другого языка программирования, используемого в бэкэнде), когда запрашивается URL-адрес прозрачного пикселя.
  3. Отправить данные в Google Analytics
    Наш файл PHP проверит, действительно ли робот Googlebot является роботом Googlebot, и, если это так, отправит данные в Google Analytics.

Добавить код javascript
В различных экспериментах, которые я пробовал, я проверил, что Googlebot будет выполнять Javascript только тогда, когда код Javascript не требует взаимодействия с пользователем. Например, Googlebot выполнит любой код Javascript, который запускается событиями onload или onready. В этом примере мы собираемся создать функцию, которая будет запускаться при событии onLoad, то есть при загрузке всех элементов страницы.

Эта функция проверит, содержит ли пользовательский агент каких-либо известных ботов Googlebot, и если да, то загрузит изображение (прозрачный пиксель), которое мы назовем TransparentPixelGooglebot.gif

 <скрипт>
window.addEventListener ("загрузить", function () {
    var botPattern = "googlebot|Googlebot-Mobile|Googlebot-Image|Favicon Google|Mediapartners-Google";
    var re = новое регулярное выражение (botPattern, 'i');
    var userAgent = navigator.userAgent; 

    если (повторно проверить (пользовательский агент)) {
        var client = новый XMLHttpRequest();
        var trackRenderURL='https://www.mecagoenlos.com/TransparentPixelGooglebot.gif?OriginUrl='+window.location.href;
        
        client.open('GET',trackRenderURL);
        client.setRequestHeader('Content-Type', 'text/plain;charset=UTF-8');
        клиент.отправить(ноль);
    }
});
</скрипт>
В любое время, когда робот Googlebot получает доступ и выполняет Javascript, наша функция будет запущена, загружая изображение «TransparentPixelGooglebot.gif», добавляя к URL-адресу изображения некоторые параметры, где мы укажем конкретный URL-адрес, к которому был осуществлен доступ.

В этой переменной мы составим полный URL-адрес, который будет запрошен для загрузки нашего изображения «TransparentPixelGooglebot.gif», куда мы добавим 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 TransparentPixelGooglebot.gif(.*)$ https://www.mecagoenlos.com.com/GooglebotRenderJS.php$1

Как вы можете догадаться, параметры, включенные в запрос пикселя, распространяются, чтобы файл PHP (GooglebotRenderJS.php) мог их «прочитать».

Данные при сканировании³

Расширьте свой анализ с помощью простого подключения к дополнительным наборам данных. Проанализируйте свою SEO-стратегию на основе данных об обратных ссылках, SEO-трафике, рейтинге и пользовательских наборах данных из вашей CRM, решения для мониторинга или любого другого источника.
Учить больше

Отправить данные в Google Analytics из файла PHP

На последнем шаге мы создаем файл PHP (GooglebotRenderJS.php), который будет выполняться каждый раз, когда запрашивается пиксель (TransparentPixelGooglebot.gif).

Этот файл будет:

  1. Проверьте с помощью обратного DNS, действительно ли запрос был сделан роботом Google или поддельным роботом Google с использованием агента пользователя робота Google.
  2. Определите тип бота (Googlebot Mobile, изображения, реклама и т. д.).
  3. Отправьте данные в Google Analytics (используя протокол измерения Google Analytics) внутри события, где мы назначим следующие переменные:
  • Категория события: «GoogleRenderFromHtaccess».
  • Действие события: отображаемый URL (реферер запроса пикселя)
  • Метка события: строка, объединяющая агента пользователя, IP-адрес и информацию о том, является ли бот настоящим роботом Google («Настоящий») или фальшивым («Фальшивый»). Я отправляю их троих в GA, чтобы проверить, правильно ли работает идентификация Googlebot.
  • *Важно: я сохранил IP только на пару дней, чтобы проверить, все ли работает правильно, после этого я перестал это делать на случай, если возникнут проблемы с законом о защите данных.
 <?php

header("Директива прагмы: без кеша");
header("Директива кеша: без кеша");
header("Управление кешем: без кеша");
header("Прагма: без кеша");
заголовок("Срок действия: 0");
если ($_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);   
        если(preg_match("/googlebot/i",$hostname))
        если ($ip_by_hostname == $IP)
            вернуть истину;
        еще
                вернуть ложь;
        
        еще
                вернуть ложь;
        
        
}
функция GoogleChekerExtend($Ip){

    # чтобы избежать ненужного поиска, проверяйте только, соответствует ли UA одному из
    # боты, которые нам нравятся
    
        $hostname=gethostbyaddr($IP);    
        $ip_by_hostname=gethostbyname($hostname);   
        if(preg_match("/\.google\.com[\.]?$/i",$hostname))
        если ($ip_by_hostname == $IP)
            вернуть истину;
        еще
                вернуть ложь;
        
        еще
                вернуть ложь;
        
        
}
$botname="Инициировать";
$bots = array('Медиапартнеры-Google[ /]([0-9.]{1,10})' => 'Медиапартнеры Google',
    'Медиапартнеры-Google' => 'Медиапартнеры Google',
    'Googl(e|ebot)(-Image)/([0-9.]{1,10})' => 'Изображение Google',
    'Googl(e|ebot)(-Image)/' => 'Изображение Google',
    '^gsa-crawler' => 'Google',
    'Googl(e|ebot)(-Sitemaps)/([0-9.]{1,10})?" => 'Google-Карты сайта',
    «GSiteCrawler[ /v]*([0-9.az]{1,10})?» => 'Google-Карты сайта',
    'Googl(e|ebot)(-Sitemaps)' => 'Google-Sitemaps',
    'Mobile.*Googlebot' => 'Google-Mobile',
    '^AdsBot-Google' => 'Google-AdsBot',
    '^Feedfetcher-Google' => 'Google-Feedfetcher',
    'совместимый; Google Desktop' => 'Google Desktop',
    'Googlebot' => 'Googlebot');

foreach($bots as $pattern => $bot) {
если ( preg_match( '#'.$pattern.'#i' , $UA) == 1 )
{
    $botname = preg_replace ("/\\s{1,}/i", '-', $bot);
    перемена;
}
}

если(GoogleCheker($_SERVER['REMOTE_ADDR']))
    $isGoogle="Настоящий";
elseif(GoogleChekerExtend($_SERVER['REMOTE_ADDR']))
        $isGoogle="Расширить";
    еще
        $isGoogle="Подделка";

класс боттрекер {
    
    статическая функция track($s, $params){
        
        
            
            $бот = "";
            
            $данные = массив( 
                'в' => 1, 
                'tid' => 'UA-XXXXXXX-1',
                'cid' => self::generate_uuid(), 
                'т' => 'событие',
                'dh' => $s['HTTP_HOST'], 
                'dl' => $s['REQUEST_URI'], 
                'доктор' => $s['HTTP_REFERER'],	
                'dp' => $s['REQUEST_URI'], 
                'dt' => $params['page_title'], 
                'ск' => $s['HTTP_USER_AGENT'], 
                'uip' => $s['REMOTE_ADDR'],
                'ни' => 1,
                'ec' => 'GoogleRenderHtaccess',
                'el' => $params['UA']." - ".$params["RenderParameters"]." -" .$params['имя бота']." - ".$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('Content-type: application/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 ($ ч);
        }
        статическая частная функция generate_uuid() {
        
        вернуть 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 и выбрать отчет «События». На другой вкладке мы открываем консоль поиска, переходим к свойствам нашего веб-сайта и используем инспектор URL-адресов, чтобы заставить Google сканировать и отображать любой из наших URL-адресов. Если все работает, вы увидите новые события в отчете Google Analytics о событиях в реальном времени.

Как вы увидите, эти события не будут учитываться как активные пользователи на нашем сайте, потому что событие настроено с параметром «nonInteraction».

Если мы нажмем на категорию события «GoogleRenderFromHtaccess», мы сможем увидеть пользовательский агент, IP-адрес и определить, был ли бот идентифицирован как настоящий или поддельный.

Ошибки отслеживания, созданные Google при попытке отобразить URL-адрес

Мы уже видели, как мы можем отслеживать и проверять, какие URL-адреса отображаются Google. Но мы можем пойти дальше и отследить, какие ошибки Javascript генерируются, когда Google пытается отобразить URL-адреса нашего сайта.

При рендеринге Javascript могут генерироваться ошибки, которые видны только в браузере пользователя (но не на нашем сервере), поэтому отслеживать эти ошибки — непростая задача.

В настоящее время, если мы хотим проверить, какие ошибки Javascript генерируются, когда робот Googlebot отображает наши URL-адреса, мы можем сделать это только с помощью Инспектора URL-адресов в Search Console.

  1. Проверьте URL-адрес:
  2. Нажмите «Проверить активный URL»:
  3. Проверьте, нет ли ошибок:

Делать это вручную для большого количества URL-адресов — большая работа, но мы можем использовать код, который я только что показал вам, чтобы отслеживать, есть ли какие-либо ошибки Javascript, когда Googlebot пытается отобразить наши URL-адреса.

Пример ошибки, сгенерированной специально для проверки работоспособности кода:

Добавить код Javascript
Как и в предыдущем примере, мы перехватим любую ошибку Javascript, используя эту строку кода: "window.addEventListener('error', function(e)" .

Каждый раз, когда возникает ошибка, будет выполняться функция, которая позволит нам сохранить эти ошибки и отправить их в Google Analytics. Это будет очень похоже на то, что мы делали в предыдущем примере, с той оговоркой, что эта функция будет выполняться только при наличии ошибки Javascript.

 window.addEventListener('ошибка', function(e) {
        var botPattern = "googlebot|Googlebot-Mobile|Googlebot-Image|Favicon Google|Mediapartners-Google";
        var re = новое регулярное выражение (botPattern, 'i');
        var userAgent = navigator.userAgent; 
        если (повторно проверить (пользовательский агент)) {
            var client = новый 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('Content-Type', 'text/plain;charset=UTF-8');
            клиент.отправить(е);
        }
    });

Этот код выполнит функцию, которая загрузит другой прозрачный пиксель (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 TransparentPixelGooglebotError.gif(.*)$ https://modelode.com/GooglebotErrorRenderJS.php$1

Таким образом, всякий раз, когда запрашивается «https://www.mecagoenlos.com/TransparentPixelGooglebotError.gif», будет выполняться файл PHP «GooglebotErrorRenderJS.php».
PHP-файл
Этот файл PHP проверит, является ли Googlebot реальным, и отправит данные в Google Analytics, используя событие с категорией «ErrorsGoogleRender», используя отображаемый URL-адрес в качестве действия события и саму ошибку в качестве метки события.

 <?php

header("Директива прагмы: без кеша");
header("Директива кеша: без кеша");
header("Управление кешем: без кеша");
header("Прагма: без кеша");
заголовок("Срок действия: 0");
если ($_GET["OriginUrl"])
    $src=$_GET["OriginUrl"];
еще
    $src = $_SERVER['HTTP_REFERER']; 
$UA=$_SERVER["HTTP_USER_AGENT"]; 
$RenderParameters=$_GET["RenderParameters"];
$textError=$_GET["textError"];
$lineError=$_GET["LineError"];
функция GoogleCheker($Ip){

    # чтобы избежать ненужного поиска, проверяйте только, соответствует ли UA одному из
    # боты, которые нам нравятся
    
        $hostname=gethostbyaddr($IP);    
        $ip_by_hostname=gethostbyname($hostname);   
        если(preg_match("/googlebot/i",$hostname))
        если ($ip_by_hostname == $IP)
            вернуть истину;
        еще
                вернуть ложь;
        
        еще
                вернуть ложь;
        
        
}
функция GoogleChekerExtend($Ip){

    # чтобы избежать ненужного поиска, проверяйте только, соответствует ли UA одному из
    # боты, которые нам нравятся
    
        $hostname=gethostbyaddr($IP);    
        $ip_by_hostname=gethostbyname($hostname);   
        if(preg_match("/\.google\.com[\.]?$/i",$hostname))
        если ($ip_by_hostname == $IP)
            вернуть истину;
        еще
                вернуть ложь;
        
        еще
                вернуть ложь;
        
        
}
$botname="Инициировать";
$bots = array('Медиапартнеры-Google[ /]([0-9.]{1,10})' => 'Медиапартнеры Google',
    'Медиапартнеры-Google' => 'Медиапартнеры Google',
    'Googl(e|ebot)(-Image)/([0-9.]{1,10})' => 'Изображение Google',
    'Googl(e|ebot)(-Image)/' => 'Изображение Google',
    '^gsa-crawler' => 'Google',
    'Googl(e|ebot)(-Sitemaps)/([0-9.]{1,10})?" => 'Google-Карты сайта',
    «GSiteCrawler[ /v]*([0-9.az]{1,10})?» => 'Google-Карты сайта',
    'Googl(e|ebot)(-Sitemaps)' => 'Google-Sitemaps',
    'Mobile.*Googlebot' => 'Google-Mobile',
    '^AdsBot-Google' => 'Google-AdsBot',
    '^Feedfetcher-Google' => 'Google-Feedfetcher',
    'совместимый; Google Desktop' => 'Google Desktop',
    'Googlebot' => 'Googlebot');

foreach($bots as $pattern => $bot) {
если ( preg_match( '#'.$pattern.'#i' , $UA) == 1 )
{
    $botname = preg_replace ("/\\s{1,}/i", '-', $bot);
    перемена;
}
}

если(GoogleCheker($_SERVER['REMOTE_ADDR']))
    $isGoogle="Настоящий";
elseif(GoogleChekerExtend($_SERVER['REMOTE_ADDR']))
        $isGoogle="Расширить";
    еще
        $isGoogle="Подделка";

класс боттрекер {
    
    статическая функция track($s, $params){
        
        
            
            $бот = "";
            
            $данные = массив( 
                'в' => 1, 
                'tid' => 'UA-XXXX-1',
                'cid' => self::generate_uuid(), 
                'т' => 'событие',
                'dh' => $s['HTTP_HOST'], 
                'dl' => $s['REQUEST_URI'], 
                'доктор' => $s['HTTP_REFERER'],	
                'dp' => $s['REQUEST_URI'], 
                'dt' => $params['page_title'], 
                'ск' => $s['HTTP_USER_AGENT'], 
                'uip' => $s['REMOTE_ADDR'],
                'ни' => 1,
                'ec' => 'Ошибки GoogleRender',
                '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('Content-type: application/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 ($ ч);
        }
        статическая частная функция generate_uuid() {
        
        вернуть 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));

?>

Теперь мы уже можем видеть, какие ошибки Javascript возникают, когда Google пытается отобразить наши URL-адреса.

Отправьте данные в Google Analytics из нашего PHP-файла
С помощью этой реализации мы можем увидеть, какие конкретные ошибки Javascript генерируются, когда Google пытается отобразить наши URL-адреса, и в каких конкретных URL-адресах они происходят.

Я имею в виду много другой информации, которую нужно отслеживать в отношении процесса рендеринга Google, например, проверять, пытается ли Googlebot выполнять какие-либо действия (например, прокрутку, щелчок или любое другое событие Javascript), но я оставлю это для другого поста. Надеюсь, вам понравилось!