Publicado por Lino uruñuela el 9 de febrero del 2021
Hoy voy a dar un pequeño repaso a algunos experimentos que hemos realizado para intentar comprender cómo trata Google el contenido y código JavaScript, hay que tener en cuenta que algunos de los experimentos más antiguos ya no son válidos, ya sea porque los dominios dónde se realizaron ya no existen o porque en algún momento de la vida de este blog cambié algo que afectó a los experimentos.
El otro día vimos cómo podíamos hacer seguimiento de qué URLs renderiza Google. Desde hace mucho tiempo (2009), hemos ido probando qué hace y qué no hace Google con el código JavaScript, tanto en cosas simples como podría ser un evento onclick (2009) hasta cómo ofuscar enlaces a Google (2015) para evitar accesos a URLs que no queremos indexar y/o traspaso de PageRank.
En los últimos años hemos visto cómo Google ejecuta e interpreta JavaScript nos hemos centrado en saber hasta dónde es capaz Google de rastrear e interpretar JavaScript y probamos si Google ejecuta cualquier código que se ejecute en el onReady, que nos dio como resultado que, efectivamente, Google interpreta y procesa el código JavaScript que se ejecuta automáticamente, sin necesidad de un evento de usuario, además, solo indexa aquel contenido que "permanece" y no el que se elimina con JavaScript. Todos estos experimentos SEO y nos ayudaron para comprender mejor lo que Google denominó como segunda ola de indexación.
El otro día pudimos ver cómo saber qué URLs están siendo renderizadas por Google en esta segunda ola de indexación, y también cómo saber si Google obtuvo errores JavaScript en el renderizado de una URL. A raíz de este último experimento, pregunté en Twitter que podríamos comprobar a continuación, y aunque salió comprobar si Google hace click me tomé la libertad de ampliar el test par comprobar no solo si hacía clicks sino también si hace scroll y si hace "resize", (módica el tamaño de la ventana).
Aunque ya sabíamos que Google modifica el tamaño de la ventana (o del viewport), podemos ver que John Mueller, a la pregunta de si Googlebot hace scroll en sites que tienen "scroll infinito", explica que probaron a realizarlo, pero que es extremadamente costoso y puede no ser un buen método.
Es lógico que Google no quiera realizar scroll en aquellas páginas que tienen "scroll infinito", ya que como su nombre indica, puede ser infinito. Hay sites en los que no se usa el scroll para cargar el contenido de una url concreta, sino que van cargando más y más contenido a medida que haces scroll, al estilo Google Discover, y podría no terminar nunca.
Pero sí explica cómo Google expande el marco (o "frame expansion"), es decir, se adapta al tamaño del contenido.
Esto es justo lo que hemos podido comprobar al capturar el evento resize que se dispara cada vez que el navegador cambia el tamaño de la ventana. Como era de esperar, Google NO hace scroll, pero si hace hace disparar el evento resize (al cambiar el tamaño de la ventana). Así que hemos intentado analizar cuál es su modus operandis.
De momento podemos postular algunas cosas sobre su comportamiento:
Mobile:
Tal como vimos en el anterior post sobre cómo podemos capturar y almacenar los errores JavaScript producidos por Google al renderizar el contenido de una URL haremos lo mismo:
window.addEventListener("resize", function(event){ var botPattern = "googlebot|Googlebot-Mobile|Googlebot-Image|Google favicon|Mediapartners-Google"; var re = new RegExp(botPattern, 'i'); var userAgent = navigator.userAgent; var Wscreen=screen.width; var Hscreen=screen.height; var screenColorDepth=screen.colorDepth; var screenPixelDepth=screen.pixelDepth; var winW = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth; var winH = window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight; var valoresResize=" screenWith:"+Wscreen+" Hscreen:"+Hscreen+" screenColorDepth:"+screenColorDepth+" screenPixelDepth:"+screenPixelDepth+" winW:"+winW+" winH:"+winH; if (re.test(userAgent)) { var target = event.target; var tagHTML = target.nodeName; var screenX=event.screenX; var screenY=event.screenY; var clientX=event.clientX; var clientY=event.clientY; var tipoEvento = event.type; var resultHTML="tipoEvento:"+tipoEvento+" tagHTML:"+tagHTML+" screenX:"+screenX+" screenY:"+screenY+" clientX:"+clientX+" clientY"+clientY; var client = new XMLHttpRequest(); var ErroresURL='https://www.mecagoenlos.com/ImagenResizeGoogle.gif?UrlOrigen='+window.location.href+'&UA='+unescape(encodeURIComponent(userAgent))+'¶metrosResize='+valoresResize; client.open('GET',ErroresURL); client.setRequestHeader('Content-Type', 'text/plain;charset=UTF-8'); client.send(null); } });
RewriteCond %{REQUEST_URI} ImagenResizeGoogle.gif [NC] RewriteRule ImagenResizeGoogle.gif(.*)$ https://modelode.com/ResizeRenderizadoJS.php$1
<?php
header("Pragma-directive: no-cache");
header("Cache-directive: no-cache");
header("Cache-control: no-cache");
header("Pragma: no-cache");
header("Expires: 0");
$src = $_SERVER['HTTP_REFERER'];
$UA=$_GET["UA"];
$parametrosResize=$_GET["parametrosResize"];
function comprobarGoogle($Ip){
# to avoid unecessary lookup, only check if the UA matches one of
# the bots we like
$hostname=gethostbyaddr($Ip);
$ip_by_hostname=gethostbyname($hostname);
if(preg_match("/googlebot/i",$hostname))
if ($ip_by_hostname == $Ip)
return true;
else
return false;
else
return false;
}
$botname="inicial";
$bots = array('Mediapartners-Google[ /]([0-9.]{1,10})' => 'Google Mediapartners',
'Mediapartners-Google' => 'Google Mediapartners',
'Googl(e|ebot)(-Image)/([0-9.]{1,10})' => 'Google Image',
'Googl(e|ebot)(-Image)/' => 'Google Image',
'^gsa-crawler' => 'Google',
'Googl(e|ebot)(-Sitemaps)/([0-9.]{1,10})?' => 'Google-Sitemaps',
'GSiteCrawler[ /v]*([0-9.a-z]{1,10})?' => 'Google-Sitemaps',
'Googl(e|ebot)(-Sitemaps)' => 'Google-Sitemaps',
'Mobile.*Googlebot' => 'Google-Mobile',
'^AdsBot-Google' => 'Google-AdsBot',
'^Feedfetcher-Google' => 'Google-Feedfetcher',
'compatible; Google Desktop' => 'Google Desktop',
'Googlebot' => 'Googlebot');
foreach( $bots as $pattern => $bot ) {
if ( preg_match( '#'.$pattern.'#i' , $UA) == 1 )
{
$botname = preg_replace ( "/\\s{1,}/i" , '-' , $bot );
break;
}
}
if(comprobarGoogle($_SERVER['REMOTE_ADDR']))
$esGoogle="Real";
else
$esGoogle="Fake";
class BotTracker {
static function track($s, $params){
$bot = "";
$data = array(
'v' => 1,
'tid' => 'UA-XXXXXX-4',
'cid' => self::generate_uuid(),
't' => 'event',
'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'],
'ni' => 1,
'ec' => 'Resize-Googlebot',
'el' => $params["parametrosResize"]." (" .$params['botname']." - ".$params['esGoogle'].")",
'ea' => $params['URLrenderizada']
);
$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);
$result = curl_exec($ch);
$info= curl_getinfo($ch);
curl_close($ch);
}
static private function generate_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"=>"Click JS Google","URLrenderizada"=>$src,"esGoogle"=>$esGoogle,"parametrosResize"=>$parametrosResize,"botname"=>$botname,"UA"=>$UA));
?>
Al pasar unos días desde la implementación de la prueba para ver qué URLs renderiza Google, hemos podido observar la gran cantidad de URLs que renderiza, parece ser que ahora sí ha cogido ritmo, y renderiza muchas URLs diarias. Para más sorpresa, lo hace tanto en sites con versiones "adaptables" a dispositivos móviles como en páginas que no se adaptan, ya sean sites pequeños o enormes.... en todas ellas renderiza muchas URLs diariamente.
Aquí muestro una imagen de Google Analytics en tiempo real, y podemos ver cómo en la última media hora ha renderizado 10 URLs, mejor dicho, ha renderizado 5 URLs usando dos configuraciones de navegador como hemos comentado anteriormente. Para que quede más claro al difuminar las URLs he unido con flechas de colores las URLs que son la misma.
Una de las sorpresas para mi ha sido que para cada URL Google recuerda el tamaño de la ventana, al menos el ancho. Como podemos ver aquí, el proceso es el siguiente:
.
Como he comentado antes, esto nos hace preguntarnos más cosas, y es que cuándo se descubre o se investiga algo, normalmente, aparecen más preguntas y más dudas que antes, pero con más conocimiento y más profundidad.