Projetando painéis para o site de comércio eletrônico de análise da web. Parte 3: Canal SEO

Neste artigo, coletaremos um painel para análise de tráfego de SEO. Descarregaremos os dados através de scripts python e de arquivos .csv.

O que vamos descarregar?


Para analisar a dinâmica das posições das frases de pesquisa, você precisará descarregar do Yandex.Webmaster e do Google Search Console . Para avaliar a "utilidade" de bombear a posição da frase de pesquisa, os dados de frequência serão úteis. Eles podem ser obtidos no Yandex.Direct e no Google Ads . Bem, para analisar o comportamento do lado técnico do site, usaremos o Page Speed ​​Insider .


Dinâmica de tráfego SEO

Console de pesquisa do Google


Para interagir com a API, usaremos a biblioteca searchconsole . O github descreve em detalhes como obter os tokens necessários para o login. O procedimento para carregar e carregar dados no banco de dados MS SQL será o seguinte:

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


Infelizmente, o webmaster pode carregar apenas 500 frases de pesquisa. Carregar cortes por país, tipo de dispositivo etc. ele também não pode. Devido a essas restrições, além de enviar posições para 500 palavras do Webmaster, enviaremos dados do Yandex.Metrica para as páginas de destino. Para quem não possui muitas frases de busca, basta 500 palavras. Se o seu núcleo semântico de acordo com o Yandex for amplo o suficiente, você precisará descarregar posições de outras fontes ou escrever seu analisador de posição.

 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


Permite avaliar a velocidade de download do conteúdo do site. Se o site começou a carregar mais lentamente, isso pode reduzir significativamente a posição do site nos resultados da pesquisa.

 #  -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') 

Anúncios do Google e Yandex Direct


Para estimar a frequência das consultas de pesquisa, descarregamos a frequência do nosso núcleo de SEO.


Previsão de orçamento Yandex


Planejador de palavras-chave do Google

Métrica Yandex


Carregue dados sobre visualizações e visitas para páginas de login do tráfego de 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') 

Aquisição de dados no Power BI


Vamos ver o que conseguimos descarregar:

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

A partir desses dados, poderemos coletar dinâmicas por semana, por segmento, dados gerais por segmentos e solicitações, dinâmica e dados gerais por páginas e velocidade de carregamento de conteúdo. É assim que o relatório final pode ser:



Por um lado, existem muitos sinais diferentes e é difícil entender quais são as tendências gerais. Por outro lado, cada placa exibe dados importantes sobre posições, impressões, cliques, CTR, velocidade de carregamento da página.

Artigos do ciclo:

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


All Articles