Diseño de paneles de control para el sitio de comercio electrónico de análisis web. Parte 3: Canal SEO

En este artículo, recopilaremos un panel para el análisis de tráfico SEO. Descargaremos los datos a través de scripts de python y archivos .csv.

¿Qué descargaremos?


Para analizar la dinámica de las posiciones de las frases de búsqueda, deberá descargar desde Yandex.Webmaster y Google Search Console . Para evaluar la "utilidad" de bombear la posición de la frase de búsqueda, los datos de frecuencia serán útiles. Se pueden obtener de Yandex.Direct y Google Ads . Bueno, para analizar el comportamiento del lado técnico del sitio, utilizaremos Page Speed ​​Insider .


Dinámica de tráfico SEO

Consola de búsqueda de Google


Para interactuar con la API, utilizaremos la biblioteca searchconsole . El github describe en detalle cómo obtener los tokens necesarios para iniciar sesión. El procedimiento para cargar datos y cargarlos en la base de datos MS SQL será el siguiente:

def google_reports(): #     account = searchconsole.authenticate(client_config=r'credentials.json' , credentials=r'cred_result.json') webproperty = account['https://test.com/'] #        , ,      report = webproperty.query.range('today', days=-10).dimension('country', 'device', 'page', 'query').get() now = datetime.now() fr = now - timedelta(days = 9) to = now - timedelta(days = 3) res = pd.DataFrame(columns=['dt_from', 'dt_to', 'country', 'device', 'page', 'query', 'clicks', 'impressions', 'position']) #    DataFrame      for i in report.rows: temp={} temp['country'] = i[0] temp['device'] = i[1] temp['page'] = i[2] temp['query'] = i[3] temp['clicks'] = i[4] temp['impressions'] = i[5] temp['position'] = i[7] temp['dt_from'] = fr.strftime("%Y-%m-%d") temp['dt_to'] = to.strftime("%Y-%m-%d") res = res.append(temp, ignore_index=True) to_sql_server(res, 'google_positions') 

Yandex.Webmaster


Lamentablemente, el webmaster solo puede cargar 500 frases de búsqueda. Cargue cortes por país, tipo de dispositivo, etc. él tampoco puede. Debido a estas restricciones, además de subir posiciones para 500 palabras del Webmaster, subiremos datos de Yandex.Metrica a las páginas de destino. Para aquellos que no tienen muchas frases de búsqueda, 500 palabras serán suficientes. Si su núcleo semántico según Yandex es lo suficientemente ancho, tendrá que descargar posiciones de otras fuentes o escribir su analizador de posición.

 def yandex_reports(): token = "..." #  UserID url = "https://api.webmaster.yandex.net/v4/user/" headers = {"Authorization": "OAuth " + token} res = requests.get(url, headers=headers) a = json.loads(res.text) userId = a['user_id'] host_id = "https:test.com:443" #  500        res = requests.get(url+str(userId)+"/hosts/"+host_id+"/search-queries/popular/?order_by=TOTAL_SHOWS&query_indicator=TOTAL_SHOWS", headers=headers) df1 = pd.DataFrame(columns=['query_id', 'query_text', 'shows', 'dt_from', 'dt_to']) a = json.loads(res.text) for i in a['queries']: temp={} temp['query_id'] = i['query_id'] temp['query_text'] = i['query_text'] temp['shows'] = i['indicators']['TOTAL_SHOWS'] temp['query_text'] = i['query_text'] temp['dt_from'] = a['date_from'] temp['dt_to'] = a['date_to'] df1 = df1.append(temp, ignore_index=True) #  500        res = requests.get(url+str(userId)+"/hosts/"+host_id+"/search-queries/popular/?order_by=TOTAL_SHOWS&query_indicator=TOTAL_CLICKS", headers=headers) df2 = pd.DataFrame(columns=['query_id', 'clicks']) a = json.loads(res.text) for i in a['queries']: temp={} temp['query_id'] = i['query_id'] temp['clicks'] = i['indicators']['TOTAL_CLICKS'] df2 = df2.append(temp, ignore_index=True) #  500        res = requests.get(url+str(userId)+"/hosts/"+host_id+"/search-queries/popular/?order_by=TOTAL_SHOWS&query_indicator=AVG_SHOW_POSITION", headers=headers) df3 = pd.DataFrame(columns=['query_id', 'position']) a = json.loads(res.text) for i in a['queries']: temp={} temp['query_id'] = i['query_id'] temp['position'] = i['indicators']['AVG_SHOW_POSITION'] df3 = df3.append(temp, ignore_index=True) df1 = df1.merge(df2, on='query_id') df1 = df1.merge(df3, on='query_id') to_sql_server(df1, 'yandex_positions') 

Page Speed ​​Insider


Le permite evaluar la velocidad de descarga del contenido del sitio. Si el sitio comenzó a cargar más lentamente, esto puede reducir significativamente la posición del sitio en los resultados de búsqueda.

 #  -50      conn = pymssql.connect(host=host,user=user,password=password) sql_string = r''' ;with a as( select distinct page, sum(clicks) as clicks from seo_google_positions group by page ) select top 50 page from a order by clicks desc ''' data = pd.read_sql(sql_string, conn) conn.close() #        dat = pd.DataFrame(columns=['first_cpu_idle', 'first_contentful_paint', 'page', 'dt']) for i, j in data.iterrows(): url = "https://www.googleapis.com/pagespeedonline/v5/runPagespeed?url={0}&category=performance&strategy=desktop".format(j[0]) res = requests.get(url) res = json.loads(res.text) temp = {} temp['first_cpu_idle'] = res['lighthouseResult']['audits']['first-cpu-idle']['displayValue'] temp['first_contentful_paint'] = res['lighthouseResult']['audits']['first-contentful-paint']['displayValue'] temp['page'] = j[0] temp['dt'] = now.strftime("%Y-%m-%d") dat = dat.append(temp, ignore_index = True) to_sql_server(dat, 'google_pagespeed') 

Google Ads y Yandex Direct


Para estimar la frecuencia de las consultas de búsqueda, descargamos la frecuencia de nuestro núcleo de SEO.


Previsión presupuestaria de Yandex


Planificador de palabras clave de Google

Yandex Metric


Cargue datos sobre vistas y visitas a páginas de inicio de sesión del tráfico SEO.

 token = token headers = {"Authorization": "OAuth " + token} now = datetime.now() fr = (now - timedelta(days = 9)).strftime("%Y-%m-%d") to = (now - timedelta(days = 3)).strftime("%Y-%m-%d") res = requests.get("https://api-metrika.yandex.net/stat/v1/data/?ids=ids&metrics=ym:s:pageviews,ym:s:visits&dimensions=ym:s:startURL,ym:s:lastsignSearchEngine,ym:s:regionCountry,ym:s:deviceCategory&date1={0}&date2={1}&group=all&filters=ym:s:lastsignTrafficSource=='organic'&limit=50000".format(fr,to), headers=headers) a = json.loads(res.text) re = pd.DataFrame(columns=['page', 'device', 'view', 'dt_from', 'dt_to', 'engine', 'visits', 'country', 'pageviews']) for i in a['data']: temp={} temp['page'] = i['dimensions'][0]['name'] temp['engine'] = i['dimensions'][1]['name'] temp['country'] = i['dimensions'][2]['name'] temp['device'] = i['dimensions'][3]['name'] temp['view'] = i['metrics'][0] temp['visits'] = i['metrics'][1] temp['pageviews'] = i['metrics'][0] temp['dt_from'] = fr temp['dt_to'] = to re=re.append(temp, ignore_index=True) to_sql_server(re, 'yandex_pages') 

Adquisición de datos en Power BI


Veamos qué hemos logrado descargar:

  • google_positions y yandex_positions
  • google_frequency y yandex_frequency
  • google_speed y yandex_speed
  • yandex_metrika

A partir de estos datos, podremos recopilar dinámicas por semana, por segmento, datos generales por segmentos y solicitudes, dinámicas y datos generales por páginas y velocidad de carga de contenido. Así es como podría verse el informe final:



Por un lado, hay muchos signos diferentes y es difícil entender cuáles son las tendencias generales. Por otro lado, cada placa muestra datos importantes sobre posiciones, impresiones, clics, CTR, velocidad de carga de la página.

Artículos del ciclo:

Source: https://habr.com/ru/post/467019/


All Articles