Rubriky
Blog o webové analytice

Měření robotů v Google analytics 4: Zjistěte, jak vyhledávače procházejí váš web

O co se jedná?

Následující PHP skript měří roboty / crawlery vašeho webu do Google analytics 4.

Proč to chcete?

  • Zjištění, jak funguje indexace Seznamu, Google etc.
  • Analytika, jak rychle a nebo jestli se vůbec indexuje nový obsah.
  • Zjištění, co crawlují AI boti.
  • Jestli na webu nemáte pasti na crawlery > relativní URL, které se zacyklí.
  • Odhalíte některé malé pokusy o utoky botů na váš web.
  • Ověření že fungují pravidla z robots_txt.
  • Třeba zjistíte, že hosting vám blokuje některé roboty, což mi několikrát stalo u zahraničního hostingu a robotech od Seznamu.
  • Pokročilé. Můžete si tyto data exportovat do Google big query a pak si počítat, jak rychle se vám indexují různé části stránky a jak často se děje jejich aktualizace ze strany vyhledávačů.

Pro koho je tento skript?

Aktuálně to je pro lidí alespoň trochu znalé PHP a mají web postavený na PHP.

Co když nespadám do této skupiny?

Můžete si podobnou věc naprogramovat ve svém jazyce, opravdu to není těžké. ChatGPT a další AI vám s tím jistě pomohou.

Jak to vlastně funguje?

V principu se kód skládá pouze ze pár částí:

  • Tabulka možných user-agentů roborů.
  • Podmínka, jestli se jedná o bota.
  • Sestavení anonymizovaného hitu pro GA4.
  • Odeslání hitu do GA4

Více v tom opravdu hledejte.

Jak vypadá výstup?

Bude vypada jak si ho uděláte. 🙂

Pro inspiraci jsem tam udělal takové menu. Vše si musíte nastavit samy, takže se zde kreativitě meze nekladou.

Pro stavbu můžete použít následující bonusové dimenze:

Seznam dimenzí k registraci:

  1. bot_name
  2. http_code
  3. referrer
  4. traffic_type
  5. user_agent
  6. user_agent2

Pro vysvětlení je zde user_agent2 a ten tam je protože někteří user-agenti jsou delší než 100 znaků (limit free ga4), tak je posílám ve více proměnných.

Ukázková instalace na wordpressu

Je to na vlastní nebezpečí!!!!!

Kód vložit do functions.php

Ve wordpressu > Admin > vzhled > editor šablon > functions.php a tam vložit na konec souboru obsah z  mého githubu.

Čistý kód na kopírování z githubu.

function is_bot($sistema){
    $bots = array(
'Googlebot','Baiduspider','ia_archiver','R6_FeedFetcher','NetcraftSurveyAgent','Sogou web spider','bingbot','Yahoo! Slurp','facebookexternalhit','PrintfulBot','msnbot','Twitterbot','UnwindFetchor','urlresolver','Butterfly','TweetmemeBot','PaperLiBot',
'MJ12bot','AhrefsBot','Exabot','Ezooms','YandexBot','SearchmetricsBot','picsearch','TweetedTimes Bot','QuerySeekerSpider','ShowyouBot','woriobot','merlinkbot','BazQuxBot','Kraken','SISTRIX Crawler','R6_CommentReader','magpie-crawler','GrapeshotCrawler',
'PercolateCrawler','MaxPointCrawler','NetSeer crawler','grokkit-crawler','SMXCrawler','PulseCrawler','Y!J-BRW','80legs','Mediapartners-Google','InAGist','Python-urllib','NING','TencentTraveler','Feedfetcher-Google','mon.itor.us','spbot','Feedly','bitlybot',
'ADmantX','Niki-Bot','Pinterest','python-requests','DotBot','HTTP_Request2','linkdexbot','A6-Indexer','TwitterFeed','Microsoft Office','Pingdom','BTWebClient','KatBot','SiteCheck','proximic','Sleuth','Abonti','(BOT for JCE)','Baidu','Tiny Tiny RSS',
'newsblur','updown_tester','linkdex','baidu','searchmetrics','genieo','majestic12','spinn3r','profound','domainappender','VegeBot','terrykyleseoagency.com','CommonCrawler Node','AdlesseBot','metauri.com','libwww-perl','rogerbot-crawler','ltx71','Qwantify',
'Traackr.com','Re-Animator Bot','Pcore-HTTP','BoardReader','omgili','okhttp','CCBot','Java/1.8','semrush.com','feedbot','CommonCrawler','MetaURI','ibwww-perl','rogerbot','MegaIndex','BLEXBot','FlipboardProxy','techinfo@ubermetrics-technologies.com',
'trendictionbot','Mediatoolkitbot','trendiction','ubermetrics','ScooperBot','TrendsmapResolver','Nuzzel','Go-http-client','Applebot','LivelapBot','GroupHigh','SemrushBot','commoncrawl','istellabot','DomainCrawler','cs.daum.net','StormCrawler','GarlikCrawler',
'The Knowledge AI','getstream.io/winds','YisouSpider','archive.org_bot','semantic-visions.com','FemtosearchBot','360Spider','linkfluence.com','glutenfreepleasure.com','Gluten Free Crawler','YaK/1.0','Cliqzbot','app.hypefactors.com','axios','webdatastats.com',
'schmorp.de','SEOkicks','DuckDuckBot','Barkrowler','ZoominfoBot','Linguee Bot','Mail.RU_Bot','OnalyticaBot','admantx-adform','Zombiebot','Nutch','SemanticScholarBot','Jetslide','scalaj-http','XoviBot','sysomos.com','PocketParser','newspaper','serpstatbot',
'MetaJobBot','SeznamBot/3.2','VelenPublicWebCrawler/1.0','WordPress.com mShots','adscanner','BacklinkCrawler','netEstate NE Crawler','Astute SRM','GigablastOpenSource/1.0','DomainStatsBot','Winds: Open Source RSS & Podcast','dlvr.it','BehloolBot','7Siters',
'AwarioSmartBot','Apache-HttpClient/5','Seekport Crawler','AHC/2.1','eCairn-Grabber','mediawords bot','PHP-Curl-Class','Scrapy','curl/7','Blackboard','NetNewsWire','node-fetch','admantx','metadataparser','Domains Project','SerendeputyBot','Moreover',
'DuckDuckGo' ,'monitoring-plugins','Selfoss','Adsbot','acebookexternalhit','SpiderLing','Cocolyzebot','TTD-Content','superfeedr','Twingly','Google-Apps-Scrip','LinkpadBot','CensysInspect','Reeder','tweetedtimes','Amazonbot','MauiBot','Symfony BrowserKit',
'DataForSeoBot','GoogleProducer','TinEye-bot-live','sindresorhus/got','CriteoBot','Down/5','Yahoo Ad monitoring','MetaInspector','PetalBot','MetadataScraper','Cloudflare SpeedTest','aiohttp','AppEngine-Google','heritrix','sqlmap','Buck','wp_is_mobile',
'01h4x.com','404checker','404enemy','AIBOT','ALittle Client','ASPSeek','Aboundex','Acunetix','AfD-Verbotsverfahren','AiHitBot','Aipbot','Alexibot','AllSubmitter','Alligator','AlphaBot','Anarchie','Anarchy','Anarchy99','Ankit','Anthill','Apexoo','Aspiegel',
'Asterias','Atomseobot','Attach','AwarioRssBot','BBBike','BDCbot','BDFetch','BackDoorBot','BackStreet','BackWeb','Backlink-Ceck','Badass','Bandit','BatchFTP','Battleztar Bazinga','BetaBot','Bigfoot','Bitacle','BlackWidow','Black Hole','Blow','BlowFish',
'Boardreader','Bolt','BotALot','Brandprotect','Brandwatch','Buddy','BuiltBotTough','BuiltWith','Bullseye','BunnySlippers','BuzzSumo','CATExplorador','CODE87','CSHttp','Calculon','CazoodleBot','Cegbfeieh','CheTeam','CheeseBot','CherryPicker','ChinaClaw',
'Chlooe','Citoid','Claritybot','Cloud mapping','Cogentbot','Collector','Copier','CopyRightCheck','Copyscape','Cosmos','Craftbot','Crawling at Home Project','CrazyWebCrawler','Crescent','CrunchBot','Curious','Custo','CyotekWebCopy','DBLBot','DIIbot',
'DSearch','DTS Agent','DataCha0s','DatabaseDriverMysqli','Demon','Deusu','Devil','Digincore','DigitalPebble','Dirbuster','Disco','Discobot','Discoverybot','Dispatch','DittoSpyder','DnBCrawler-Analytics','DnyzBot','DomCopBot','DomainAppender',
'DomainSigmaCrawler','Dotbot','Download Wonder','Dragonfly','Drip','ECCP/1.0','EMail Siphon','EMail Wolf','EasyDL','Ebingbong','Ecxi','EirGrabber','EroCrawler','Evil','Express WebPictures','ExtLinksBot','Extractor','ExtractorPro','Extreme Picture Finder',
'EyeNetIE','FDM','FHscan','Fimap','Firefox/7.0','FlashGet','Flunky','Foobot','Freeuploader','FrontPage','Fuzz','FyberSpider','Fyrebot','G-i-g-a-b-o-t','GT::WWW','GalaxyBot','Genieo','GermCrawler','GetRight','GetWeb','Getintent','Gigabot','Go!Zilla',
'Go-Ahead-Got-It','GoZilla','Gotit','GrabNet','Grabber','Grafula','GrapeFX','GridBot','HEADMasterSEO','HMView','HTMLparser','HTTP::Lite','HTTrack','Haansoft','HaosouSpider','Harvest','Havij','Hloader','HonoluluBot','Humanlinks','HybridBot','IDBTE4M',
'IDBot','IRLbot','Iblog','Id-search','IlseBot','Image Fetch','Image Sucker','IndeedBot','Indy Library','InfoNaviRobot','InfoTekies','Intelliseek','InterGET','InternetSeer','Internet Ninja','Iria','Iskanie','IstellaBot','JOC Web Spider','JamesBOT','Jbrofuzz'
,'JennyBot','JetCar','Jetty','JikeSpider','Joomla','Jorgee','JustView','Jyxobot','Kenjin Spider','Keybot Translation-Search-Machine','Keyword Density','Kinza','Kozmosbot','LNSpiderguy','LWP::Simple','Lanshanbot','Larbin','Leap','LeechFTP','LeechGet','LexiBot'
,'Lftp','LibWeb','Libwhisker','LieBaoFast','Lightspeedsystems','Likse','LinkScan','LinkWalker','Linkbot','LinkextractorPro','LinksManager','LinqiaMetadataDownloaderBot','LinqiaRSSBot','LinqiaScrapeBot','Lipperhey','Lipperhey Spider','Litemage_walker','Lmspider'
,'MFC_Tear_Sample','MIDown tool','MIIxpc','MQQBrowser','MSFrontPage','MSIECrawler','MTRobot','Mag-Net','Magnet','Majestic-SEO','Majestic12','Majestic SEO','MarkMonitor','MarkWatch','Mass Downloader','Masscan','Mata Hari','Mb2345Browser','MeanPath Bot',
'Meanpathbot','Metauri','MicroMessenger','Microsoft Data Access','Microsoft URL Control','Minefield','Mister PiX','Moblie Safari','Mojeek','Mojolicious','MolokaiBot','Morfeus Fucking Scanner','Mozlila','Mr.4x3','Msrabot','Musobot','NICErsPRO','NPbot',
'Name Intelligence','Nameprotect','Navroad','NearSite','Needle','Nessus','NetAnts','NetLyzer','NetMechanic','NetSpider','NetZIP','Net Vampire','Netcraft','Nettrack','Netvibes','NextGenSearchBot','Nibbler','Niki-bot','Nikto','NimbleCrawler','Nimbostratus',
'Ninja','Nmap','Nuclei','Octopus','Offline Explorer','Offline Navigator','OnCrawl','OpenLinkProfiler','OpenVAS','Openfind','Openvas','OrangeBot','OrangeSpider','OutclicksBot','OutfoxBot','PECL::HTTP','PHPCrawl','POE-Component-Client-HTTP','PageAnalyzer',
'PageGrabber','PageScorer','PageThing.com','Page Analyzer','Pandalytics','Panscient','Papa Foto','Pavuk','PeoplePal','Petalbot','Pi-Monster','Picscout','Picsearch','PictureFinder','Piepmatz','Pimonster','Pixray','PleaseCrawl','Pockey','ProPowerBot','ProWebWalker',
'Probethenet','Psbot','Pu_iN','Pump','PxBroker','PyCurl','QueryN Metasearch','Quick-Crawler','RSSingBot','RankActive','RankActiveLinkBot','RankFlex','RankingBot','RankingBot2','Rankivabot','RankurBot','Re-re','ReGet','RealDownload','Reaper','RebelMouse','Recorder',
'RedesScrapy','RepoMonkey','Ripper','RocketCrawler','Rogerbot','SBIder','SEOlyticsCrawler','SEOprofiler','SEOstats','SISTRIX','SMTBot','SalesIntelligent','ScanAlert','Scanbot','ScoutJet','Screaming','ScreenerBot','ScrepyBot','Searchestate','Seekport','SemanticJuice',
'Semrush','SentiBot','SeoSiteCheckup','SeobilityBot','Seomoz','Shodan','Siphon','SiteCheckerBotCrawler','SiteExplorer','SiteLockSpider','SiteSnagger','SiteSucker','Site Sucker','Sitebeam','Siteimprove','Sitevigil','SlySearch','SmartDownload','Snake','Snapbot',
'Snoopy','SocialRankIOBot','Sociscraper','Sosospider','Sottopop','SpaceBison','Spammen','SpankBot','Spanner','Spbot','SputnikBot','Sqlmap','Sqlworm','Sqworm','Steeler','Stripper','Sucker','Sucuri','SuperBot','SuperHTTP','Surfbot','SurveyBot','Suzuran',
'Swiftbot','Szukacz','T0PHackTeam','T8Abot','Teleport','TeleportPro','Telesoft','Telesphoreo','Telesphorep','TheNomad','The Intraformant','Thumbor','TightTwatBot','Titan','Toata','Toweyabot','Tracemyfile','Trendiction','Trendictionbot','True_Robot','Turingos',
'Turnitin','TurnitinBot','TwengaBot','Twice','Typhoeus','URLy.Warning','URLy Warning','UnisterBot','Upflow','V-BOT','VB Project','VCI','Vacuum','Vagabondo','VelenPublicWebCrawler','VeriCiteCrawler','VidibleScraper','Virusdie','VoidEYE','Voil','Voltron',
'WASALive-Bot','WBSearchBot','WEBDAV','WISENutbot','WPScan','WWW-Collector-E','WWW-Mechanize','WWW::Mechanize','WWWOFFLE','Wallpapers','Wallpapers/3.0','WallpapersHD','WeSEE','WebAuto','WebBandit','WebCollage','WebCopier','WebEnhancer','WebFetch','WebFuck',
'WebGo IS','WebImageCollector','WebLeacher','WebPix','WebReaper','WebSauger','WebStripper','WebSucker','WebWhacker','WebZIP','Web Auto','Web Collage','Web Enhancer','Web Fetch','Web Fuck','Web Pix','Web Sauger','Web Sucker','Webalta','WebmasterWorldForumBot',
'Webshag','WebsiteExtractor','WebsiteQuester','Website Quester','Webster','Whack','Whacker','Whatweb','Who.is Bot','Widow','WinHTTrack','WiseGuys Robot','Wonderbot','Woobot','Wotbox','Wprecon','Xaldon WebSpider','Xaldon_WebSpider','Xenu','YoudaoBot','Zade',
'Zauba','Zermelo','Zeus','Zitebot','ZmEu','ZoomBot','ZumBot','ZyBorg','arquivo-web-crawler','arquivo.pt','autoemailspider','backlink-check','cah.io.community','check1.exe','clark-crawler','coccocbot','cognitiveseo','com.plumanalytics','crawl.sogou.com',
'crawler.feedback','crawler4j','dataforseo.com','demandbase-bot','domainsproject.org','eCatch','evc-batch','facebookscraper','gopher','instabid','internetVista monitor','ips-agent','isitwp.com','iubenda-radar','lwp-request','lwp-trivial','meanpathbot',
'mediawords','muhstik-scan','oBot','page scorer','pcBrowser','plumanalytics','polaris version','probe-image-size','ripz','s1z.ru','satoristudio.net','scan.lol','seobility','seocompany.store','seoscanners','seostar','sexsearcher','sitechecker.pro',
'siteripz','sogouspider','sp_auditbot','spyfu','sysscan','tAkeOut','trendiction.com','trendiction.de','ubermetrics-technologies.com','voyagerx.com','webgains-bot','webmeup-crawler','webpros.com','webprosbot','x09Mozilla','x22Mozilla','xpymep1.exe','zauba.io',
'zgrab','petalsearch','protopage','Miniflux','Feeder','Semanticbot' ,'ImageFetcher','Mastodon' ,'Neevabot','Pleroma','Akkoma','koyu.space','Embedly','Mjukisbyxor','Giant Rhubarb','GozleBot','Friendica','WhatsApp','XenForo','Yeti','MuckRack','PhxBot','Bytespider',
'GPTBot','SummalyBot','LinkedInBot','SpiderWeb','SpaceCowboys','LCC','Paqlebot','SeznamBot','SeznamHomepage','WP Fastest Cache',
'ChatGPT','Google-Extended','GoogleOther','anthropic','Claude-Web','cohere-ai','Diffbot','FacebookBot','ImagesiftBot','PerplexityBot','Omigili','yacybot','RepoLookoutBot','StractBot','IABot','rss-is-dead','Slackbot',
'Google-InspectionTool','Storebot-Google','Google-InspectionTool','APIs-Google','AdsBot-Google','Mediapartners-Google','Google-Safety','WellKnownBot','ArchiveBot','Sogou','iaskspider','Qwantbot','keys-so-bot','OAI-SearchBot',
'bot','spider','crawl',
        );

    foreach($bots as $b){if( stripos( $sistema, $b ) !== false ) return $b;}
    return "";
}
function ga4bottracking() {
$userAgent=$_SERVER['HTTP_USER_AGENT'];
$botname=is_bot($userAgent);

if($botname=="") { return;}
$domainName = $_SERVER["SERVER_NAME"];
$documentPath = $_SERVER["REQUEST_URI"];
$documentReferer = $_SERVER["HTTP_REFERER"];
if (empty($documentReferer) && $documentReferer !== "0") {
  $documentReferer = '';
} else {
  $documentReferer = $documentReferer;
}


$ga4Params =  array();
$ga4Params['v'] = "2";
$ga4Params['tid'] = 'G-XXXXX' ; 
$ga4Params['gcs'] = 'G101';
$ga4Params['gcd'] = '13t3t3t2t5';
$ga4Params['npa'] = '0';
$ga4Params['dma_cps'] = 'sypham';
$ga4Params['dma'] = '1';
$ga4Params['_rdi'] = '0';
$ga4Params['tt'] = 'antispam'; 
$ga4Params['cid'] = "5555";
$ga4Params['ecid'] = "5555";
$ga4Params['uid'] = 'anonymous';
$ga4Params['ul'] = 'en-us';
$ga4Params['sr'] = '1x1';
$ga4Params['ur'] = '';
$ga4Params['pscdl'] = 'noapi';
$ga4Params['sid'] = floor(microtime(true) * 1000);
$ga4Params['_p'] = rand(1000000000, 2147483647 );
$ga4Params['dt'] = 'anonymous';
$ga4Params['dl'] = urlencode( "http://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]") ;
$ga4Params['dr'] = urlencode($documentReferer);
$ga4Params['cs'] = urlencode($botname);
$ga4Params['cn'] = urlencode($botname);
$ga4Params['cm'] = 'bot';
$ga4Params['seg'] = '0';
$ga4Params['_ss'] = '1';
$ga4Params['_fv'] = '1';
$ga4Params['en'] = 'page_view';
$ga4Params['ep.bot_name'] = urlencode($botname);
$ga4Params['ep.http_code'] = http_response_code(); 
$ga4Params['ep.referrer'] = urlencode($documentReferer);
$ga4Params['ep.user_agent'] = urlencode($userAgent);
if (strlen($userAgent) > 100) {
$ga4Params['ep.user_agent2'] = urlencode(substr($userAgent, 100));
}

$theParamList = "";
$gurl = 'https://region1.google-analytics.com/g/collect';
foreach($ga4Params as $key => $value) {$theParamList .= $key."=".$value."&";}
$utmUrl = $gurl  . "?" .$theParamList;

$ch = curl_init();
curl_setopt($ch,CURLOPT_USERAGENT, "notset");
curl_setopt($ch,CURLOPT_URL, $utmUrl);
curl_setopt($ch,CURLOPT_HTTPHEADER,array('text/plain'));
curl_exec($ch);
curl_close($ch);
}

Zde je pak nutné upravit GA4 tracking ID, které jste si vygenerovali jen pro tento účel na separátní Google analytics 4 property. Data nemíchejte s normálními data sbíranými z webu.

$ga4Params['tid'] = 'G-XXXXX' ; //  ---- zde nahradit za své ID.

Případně si můžete upravit řádek s antispam frází, kde je pojmenování typu návštěvnosti pro GA4. (traffic_type)

$ga4Params['tt'] = 'anti-spam';

V případě aktualizace si pak můžete přidávat do pole další nové crawlery do funkce is_bot. (Zdroj z githubu)

Přidání kódu do header.php

Zde do headeru vložíte pak následující kód, který zavolá funkci přidanou do souboru functions.php. Tím se kód zavolá na každé stránce webu.

<?php ga4bottracking(); ?>

A uložíte.

Jde to dát i na jiné PHP weby než je WordPress?

Samozřejmě. Většinou ten samý kód dáte do hlavní šablony stránky v PHP. Celé je to postavené ze základních příkazů a ani to nemá další závislosti.

Otázky a odpovědi

Jaké jsou rizika?

Pokud neumíte s PHP, tak si při nevhodném přidání kódu může shodit frontend webu. U WP, tak stačí daný kód odebrat a zase je vše jako předtím.

Proč nepotřebuji souhlas s měřením?

Měří záměrně jen roboty, kteří se sami identifikují dle user-agenta jako roboti / crawleři obsahu mého webu. Nevyužívám žádné ip adresy etc. Jediné co používám je user-agent. Díky tomu, že se prokazatelně měří roboti a né lidi není potřeba souhlas.

Známé problémy

Aktualizace šablon, pokud aktualizujete šablonu, tak se můžete stát, že se vám to smaže z kódu. Tjs po aktualizaci šablony se podívejte, že tam ten kód stále je. Proto doporučuji si nastavit hlídání v GA4 aby vám při zmizení kódu/ pádu návštěvnosti o 80% a více přišla notifikace do emailu. Nastavíte na domovské stránce GA4 dole.

Potřebuji si tím pomoci.

Promiňte, nedělám tomu žádný support, berte to jako inspiraci.

Rychlost webu

Tím, že to je na PHP ve stránce se zpomalé webu skoro nulové.

Neměří mi to moc dat nebo některé stránky chybí

Můžete mít na webu cachovaný obsah a ten pak není změřen, protože ho vydá cache a né PHP. Tohle není dobře, ani špatně. Tohle se týký hlavně webu, co jsou kompletně schované za proxy, pokud máte na webu normální cachování, tak to měří v pohodě.

Měří to všechny stránky?

Měří to stránky se HTTP status kódem 200 a 404. Takže to neměří server errory(50x), přesměrování(30x).

Proč jsem zvolil PHP a ne javascript / GTM?

Roboti ve většině případů nespouští javascript, takže na to nejde použít GTM. Jde něco podobného postavit na server GTM a tam to měřit přes vložený obrázek, ale to je jiná liga, jiný sport. Tohle mělo být jednoduché a pro každého.

Jaké jsou alternativy tohoto řešení?

Klasický se filtrůjí access logy ze serveru. Což je log všech akcí co se stahují se serveru. Ten obsahuje vše, včetně CSS, JS, obrázků etc. a přesměrování. Soubory byvají velmi velké(někdy desitky giga i pentabity u nadnárodních projektů) a mažou se po nějaké době(1den až 30dní). Celý tento process byvá náročný a to od získání dat, filtraci dat jen na to co opravdu potřebujete, jejich analýzu a archivaci. Historicky se to dělo přes AWstats. Dneska to dělají lidi třeba přes uložení logů do elasticsearch databáze a pak to prohlédavání přes Kibanu, Grafana. etc. Způsobů je hodně a někdy to je dost práce.

Proč jsem zvolil GA4?

Cíl byl mít archív dat a zároveň alespoň trochu povědomé rozhraní a možnost si dělat vizualizace. Kromě základů zde je pak možnost exportovat data do Google big query, kde si pak můžete více hrát. Taky je zde možnost data vizualizovat v Looker Studio.

Závěr

Není to nic složitého, ale může vám to dost pomoci při řešení problémů s indexací webů, což byl i důvod, proč jsem si tohle napsal.

Update 2024-07-19

Data z BQ GA4 exportu. Aneb ukázka jak byl tento článek rychle nalezen crawlery a kolikrát už byl stáhnut.
Btw sice mě naštěvuje SeznamHomepage bot, ale jejich crawler SeznamBot nikoli a ani nejsem zaindexován na Seznamu na daný článek.
A to celý web je postavený na wordpressu a je rychlý.
Po těch 17hodinách jsem to dal na sociální sítě. Do té doby to byl takový soft launch.

A protože si myslím, že by si s tím mělo hrát více lidí, tak tady je SQL dotaz na sestavení podobné tabulky:

select 
   event_name
  ,event_date
  ,event_timestamp
  ,
    (select as struct * from (
      select ep.key key,
        concat(
          coalesce (ep.value.string_value, ""),
          coalesce (cast (ep.value.int_value as string), ""),
          coalesce (cast (ep.value.float_value as string), ""),
          coalesce (cast (ep.value.double_value as string), "")
        ) value
          from unnest (event_params) ep
      ) ep
      pivot (string_agg (value) for ep.key in
      (
        "page_location",
        "bot_name",
        "user_agent",
        "user_agent2", 
        "page_referrer"
        
      ))
    )params
  from `analytics_99999999.events_*` 
  where _table_suffix between '20240711' and '20270719' 
  and
  event_name LIKE '%page_view%'

Při použití je nutné změnit řádek analytics_99999999.events_* a nahradit 99999999 za vaše GA4 property ID a nastavit si datumi.

Výstupem bude jednoduchá plochá tabulka se sloupečky:

event_name
event_date
event_timestamp
page_location
bot_name
user_agent
user_agent2
page_referrer

Ze které si můžete jednoduše postavit report třeba v Google sheets napojených na Google big query.

Poslední aktualizace byla 19.7.2024 18:04:32, tak uvidíme jak rychle to vyhledávače naleznou.

 

Malá poznámka, regex s AI roboty

.*(CCBot|ChatGPT-User|anthropic-ai|ClaudeBot|FacebookBot|cohere-ai|OAI-SearchBot|Applebot-Extended|Bytespider|cohere-ai|Diffbot|GoogleOther|Google-Extended|GPTBot|ImagesiftBot|PerplexityBot|OmigiliBot).*
.