# www.websiteboosting.com / Patrik Luerwer & Mario Fischer # # Codebeispiel fuer R - Website Boosting Ausgabe 70 # Aus der Serie "R Leuchtungen", Teil 9 # Dieses Skript zeigt Google Search Console Daten, ob sich signifikante # Änderungen an der CTR bei gleichen Rankingpositionen ergeben haben. # Damit kann man u. a. prüfen, ob sich durch Titletausch in den Such- # ergebnissen Verbesserungen oder Verschlechterungen ergeben haben # # Alle Zeilen, die mit # beginnen, dienen nur der Erklaerung # und werden von R ignoriert. # Hinweis. Die fünf nachfolgenden Librarys muessen einmalig installiert # werden. Wie das genau geht, steht im Heft und auf Youtube bei # WebsiteBoosting tV! # Entfernen Sie die beiden Doppelkreuze vor "instal....". # R wird dann ggf. nochmal neu starten wollen. Ist halt so. # Anschließend können Sie die # wieder vorne anstellen, sonst werden die immer # wieder installiert. Das ist lästig. Es geht auch einfacher, mehr dazu im Heft! # # install.packages("tidyverse") # install.packages("googleAuthR") # install.packages("searchConsoleR") # install.packages("lubridate") # install.packages("glue") # # Nachfolgended werden die installierten Librarys in den Speicher von R geladen: library(tidyverse) library(googleAuthR) library(searchConsoleR) library(lubridate) library(glue) # Konfiguration ------------------------------------------------- # TODO: Name der Authenifizierungsdate eintragen, die man von Google bekommen hat KEY_FILE <- "name-der-authentifizierungsdatei.json" # TODO: Name der Property angeben GSC_PROP <- "https://www.domainname.com/" # TODO: Schreibweisen der Brand-Suchanfragen eintragen, die ignoriert werden BRAND_QUERIES <- c("brandbegriff-1", "brandbegriff-2", "brandbegriff-3", "brandbegriff-n") # TODO: Vergleichszeitraum nach dem Title-Update angeben # ACHTUNG: GSC-Daten stehen mit drei Tagen Verzögerung bereit # Als Beispiel für das GOOGLE_TITLE_UPDATE: "2021-08-21" # Jeweils vor (PRE) und nach (POST) Update START_DATE_PRE <- ymd("2021-08-10") END_DATE_PRE <- ymd("2021-08-16") START_DATE_POST <- ymd("2021-09-01") END_DATE_POST <- ymd("2021-09-06") # TODO: Zulässige Schwankung der Position angeben # Beispiel: 0.9 (vorbelegt) wäre 0,9 oder 3.5 wäre 3,5 # Statt Komma bitte einen Punkt als Dezimalzeichen verwenden POSITION_FLUCTUATION <- 0.9 # TODO: Zulässige Schwankung der CTR eintragen (in Prozentpunkten) # Hinweis: Alles unter dieser Prozentzahl (5% vorbelegt) wird nicht verwendet CTR_FLUCTUATION <- 5 # Zugriff auf die Search Console (GSC)------------------------------------- options(googleAuthR.scopes.selected = "https://www.googleapis.com/auth/webmasters.readonly") gar_auth_service(KEY_FILE) DATES <- as.character(c( seq(START_DATE_PRE, END_DATE_PRE, "1 day"), seq(START_DATE_POST, END_DATE_POST, "1 day"))) # Abfrage der Daten ********************************************* l <- list() for (i in 1:length(DATES)) { date <- DATES[i] message(glue("\n\n[{ i } / {length(DATES) }] { date }")) r <- search_analytics(siteURL = GSC_PROP, startDate = date, endDate = date, dimensions = c("date", "page", "query"), searchType = "web", rowLimit = 1e6) %>% mutate(period = case_when(date <= END_DATE_PRE ~ "pre", date >= START_DATE_POST ~ "post")) l[[i]] <- r } gsc_data_raw <- bind_rows(l) # Aufbereitung der Daten ---------------------------------------- gsc_data <- gsc_data_raw %>% # Brand-Queries entfernen filter(!str_detect(query, paste0("(", paste(BRAND_QUERIES, collapse = "|"), ")"))) %>% # Metriken auf page-Basis und Zeitraum aggregieren group_by(period, page) %>% summarise(position = sum(impressions * position) / sum(impressions), clicks = sum(clicks), impressions = sum(impressions)) %>% ungroup() %>% mutate(ctr = clicks / impressions * 100) %>% # Nur pages behalten, die in beiden Zeiträumen gerankt haben group_by(page) %>% filter(n() == 2) %>% ungroup() %>% select(period, page, clicks, impressions, ctr, position) %>% arrange(page, desc(period)) %>% # Deltas berechnen group_by(page) %>% mutate(pos_diff = position - lag(position), ctr_diff = ctr - lag(ctr)) %>% fill(ends_with("_diff"), .direction = "up") %>% ungroup() %>% # pages mit Änderungen entsprechend der Grenzwerte ermitteln filter(abs(pos_diff) <= POSITION_FLUCTUATION, abs(ctr_diff) >= CTR_FLUCTUATION) %>% select(period, page, clicks, impressions, ctr, position) %>% # Daten in ein weites Format bringen pivot_wider(names_from = period, values_from = c(clicks, impressions, ctr, position)) %>% mutate(ctr_diff = ctr_post - ctr_pre, .after = ctr_post) # Export der Daten in das Arbeitsverzeichnis------------------------------------ write_csv2(gsc_data, "ctr_vergleich.csv") ### Ende des des Skrips ### Für weitere Infos siehe Beitrag in Website Boosting, Ausgabe 70 ### Oder auf WebsiteBoosting.tv bzw. dem Kanal in Youtube