Eylül 17th, 2019

İlk Sayfadan Düşen Anahtar Kelimelerin Tespiti – Python

Yeni tasarıma geçtiniz, sitenizi taşıdınız veya sitenizde kritik bir değişikliğe gittiniz. Eğer bu çalışmaları adım adım planlı yapmazsanız, organik trafiğinizde gözle görülür bir düşüş olabilir. Bu hafta Yusuf Özbay ile yaptığımız analizlerin bir çoğu migration kaynaklı organik trafik düşüşü problemleriydi.

Böyle durumlarda ilk sayfadan düşen kelimeleri hızlıca tespit edersek müthiş zaman kazanmış oluruz diye düşündük. Aslında bu işi yapan SEO toolları mevcut ama bazıları historical data için yüksek paket zorunlu kılarken, bazıları sizin üye olduğunuz zamandan itibaren bu datayı verebiliyor. Çoğu durumda kurtarıcımız Search Console oluyor. Bu yazımızda da Python ile Search Console’dan veri çekerek hızlıca ilk sayfadan düşen anahtar kelimeleri tespit edeceğiz.

İlk Sayfaya Yeniden Çıkabiliriz!

İlk sayfaya çıkmanın önemini ve zorluğunu hepimiz biliyoruz. Fakat bazen öngöremediğimiz değişiklikler kritik bir düşüşe sebebiyet veriyor. Burada umutsuzluğa kapılmamak lazım.

Eğer bir anahtar kelimede ilk sayfadaysanız, bir çok enstrümanı doğru kullanmışsınızdır ve Google sizi ödüllenmiştir. Bu anahtar kelimelerde ilk sayfadan düşmeniz “genellikle” Google sebebiyetli değil, kendi yaptığınız hatalar neticesinde oluyor.

O zaman ilk sayfadan düştüğümüz anahtar kelimeleri bulursak ve bu anahtar kelimelerde yaptığımız hataları düzeltirsek, ilk sayfaya çıkma ihtimalimiz çok çok yüksek. Çünkü Google gözünde zaten ilk sayfa ile ödüllendirilmiştiniz. O zaman bu veriyi nasıl çekebiliriz başlayalım.

Search Console API Bağlantısı

Bağlantı kısmını bir önceki yazımızda paylaştık. Tüm detayları ile Search Console API’a nasıl bağlanırız ? adımlarını takip edebilirsiniz. Bugün ki analizimizde bu kodların devamını yazacağız.

PYTHON İLE SEARCH CONSOLE API BAĞLANTISI

Search Console API ile arayüzden daha fazla veri alınabiliyor. Bu yazımızda Python ile nasıl bağlanabilirsinizi anlattık.

ŞİMDİ OKU

Zaman Aralığını Belirleyelim

Api bağlantımızı yapmıştık. Aşağıdaki kodlarla birlikte Search Console’dan hangi tarih aralıklarında veri çekeceğimizi belirliyoruz. Biz burada bu script’in kullanımıyla beraber 1 yıl öncesini aldık. Yani kodu çalıştırdığınız zaman tarih girdisine gerek duymayacaksınız, isterseniz manuel bir string de girebilirsiniz.

import datetime
today = datetime.datetime.now()
from datetime import datetime, timedelta
start365 = today - timedelta(days=365)
startdate =datetime.strftime(start365, '%Y-%m-%d')
enddate = datetime.strftime(today, '%Y-%m-%d')

Şimdi Search Console’da yetkili olduğumuz internet sitesini giriyoruz.

site = "ENTER YOUR WEBSITE"

Öncelikle Search Console’da son bir yıl içerisinde tıklama aldığımız tüm kelimeleri bir request ile çekiyoruz. Bu request otomatik olarak en fazla tıklama aldıklarınıza göre sort ediliyor. Kodda görmüş olduğunuz RowLimit kaç anahtar kelime alacağınızı belirliyor. Biz en çok tıklama alınan 100 anahtar kelime için istek yaptık. Bu limiti 5000 satıra kadar değiştirebilirsiniz. Unutmayın sorgu sayısı arttıkça kodun çalışma süresi biraz uzayacak. ( 100’de yaklaşık 1 dakika )

keywords_request = { 'startDate': startdate, 'endDate': enddate, 'dimensions': ['query'], 'rowLimit': 100, }

Sonrasında yaptığımız bu istek doğrultusunda anahtar kelimeleri bir listeye kaydediyoruz.

query_keys = webmasters_service.searchanalytics().query(siteUrl=site, body=keywords_request).execute()
console_data_keys = pd.DataFrame(query_keys['rows'])
keys = [f['keys'][0] for f in query_keys['rows']]

Şimdi geldik önemli kısma. Burada boş bir dataframe oluşturduk. Ardından bir for döngüsü içerisinde çektiğimiz tüm anahtar kelimeler için tek tek istek oluşturuyoruz. Buradan gelen cevabı oluşturduğumuz boş dataframe’e yazıyoruz.

Search Console bizlere ortalama değerleri veriyor. Yani bugün ki sıralamamız 1.67 olabilir. Bunun anlamı bugün bazı kişilerde 1. sıradayken, bazılarında 2. sıradayız. Hatta 1.67, 2’ye daha yakın olduğu için, 2. sırada biraz daha fazla gözükmüşüz. Bu sebeple tüm sorguları tek tek her gün için yapıyoruz. Eğer aylık istek yapsaydık Search Console o ayın ortalamasını verecekti.

data = pd.DataFrame([])
for i in keys: request = { 'startDate': startdate, 'endDate': enddate, 'dimensions': ['date', 'query'], 'rowLimit': 365, "dimensionFilterGroups": [ { "filters": [ { "dimension": 'query', "operator": 'equals', "expression": i }, ] } ] } query = webmasters_service.searchanalytics().query(siteUrl=site, body=request).execute() k=pd.DataFrame(query['rows']) data = data.append(k)

Başarılı bir şekilde verimizi çektik. Dataframe üzerinde bir takım düzeltmeler yapıyoruz. Örneğin anahtar kelime ve tarihler aynı sütun içinde geldi bunları ayırıyoruz.

data['date'] = data['keys'].apply(pd.Series)[0]
data['keywords'] = data['keys'].apply(pd.Series)[1]
data = data.drop(columns="keys")

Şimdi yeni bir boş dataframe daha oluşturuyoruz.

position_change = pd.DataFrame(columns=["keywords","top","last","change"])

Son durumda Search Console’a bağlandık. Son 1 yıldaki tüm anahtar kelimeleri çektik. Ardından bu anahtar kelimelerin günlük verilerini de çektik. Tek bir şey kaldı. Filtrelerimizi uygulayıp sonucu görmek. Burada yine bir for döndüreceğiz ama önce for’un içini anlatmam lazım.

Şimdi burada şöyle bir yol izledik. Önce her anahtar kelimenin bugüne kadar yaptığı en iyi sıralamayı bulduk. Bunları ilk sayfa ve ilk sayfada olmayan olarak filtreledik. Yani bir kelimede daha önce hiç ilk sayfaya çıkamadıysak bu analizimizde yer almayacak. min_value son bir yılda ki en iyi sıralama.

filtered = data['keywords'] == i first_page = data['position'] <= 10 non_first_page = data['position'] > 10 min_value = data[filtered & first_page]['position'].min()

Search Console’da her gün data alabileceksiniz diye bir durum yok. Bir anahtar kelime diyelim 26’sında hiç tıklama almadıysa 26.sında bir veri görmeyeceğiz. Bu sebeple anahtar kelimeleri yine tek tek en son hangi tarihte veri aldığımızı belirledik. Sonra bu veriye göre filtreleyerek, en son veri alınan tarihteki sıralamamızı bulduk.

last_data = data[filtered]['date'].max()
date_filter = data['date'] == last_data
#bu tarihte ki son pozisyonu belirliyoruz.
last_rank = data[filtered & date_filter]['position'].min()

Sonrasında bilgilendirici olması adına en yüksek sıralamamız ile son sıralamamızın farkını alıyoruz.

 change_rank = - (last_rank - min value)

Tüm bu verileri az önce oluşturduğumuz dataframe’e yazdırıyoruz.

 y={"keywords":i,"top":min_value,"last":last_rank,"change":change_rank}
position_change = position_change.append(y, ignore_index=True)

Son olarak dataramemizi temizliyoruz. Search Console ortalama verdiği için 13.6666 gibi rakamlar olabiliyor tüm sayısal sütunları integera çeviriyoruz.

position_change.dropna(inplace=True)
position_change["top"] = position_change["top"].astype(int)
position_change["last"] = position_change["last"].astype(int)
position_change["change"] = position_change["change"].astype(int)

En son olarak sadece ilk sayfadan diğer sayfalara düşüşü filtreliyoruz. Yani 1. sıradan 5. sıraya düşmüşseniz script bunu göstermeyecek. Bunu neden göstermedik, ilk sayfadan düşmelerde yüksek bir oranla kullanıcı hatası vardır. Ama ilk sayfada 1’den 3’e düşmenizde rakipleriniz, kullanıcı deneyimi vb. faktörler devreye giriyor. Siz bu düşüşleri de görmek isteyebilirsiniz. O zaman buradaki 10 rakamını değiştirebilirsiniz.

position_change = position_change[position_change["last"]>10]

Son olarak dosyamızı excel’e kaydediyoruz.

console_data.to_excel(r'results.xls')

Eğer spyder vb IDE ile çalışıyorsanız variablelardan sonucu takip edebilirsiniz. Excel çıktınıza baktığınızda da bu görseldeki gibi bir görüntü görebilirsiniz. ( Umarım her şey yolundadır da görmezsiniz 🙂 )

Manuel olarak zaman alan çalışmaları ufak scriptlere yazıp bloğumuzda paylaşıyoruz. Aşağıda ki newsletter kısmından tüm yazılarımızı taze taze okuyabilirsiniz.

import httplib2
from apiclient.discovery import build
from oauth2client.client import OAuth2WebServerFlow
import pandas as pd
# Copy your credentials from the console
CLIENT_ID = "ENTER YOUR CLIENT ID"
CLIENT_SECRET = "ENTER YOUR CLIENT SECRET"
OAUTH_SCOPE = 'https://www.googleapis.com/auth/webmasters.readonly'
REDIRECT_URI = 'urn:ietf:wg:oauth:2.0:oob'
# Run through the OAuth flow and retrieve credentials
flow = OAuth2WebServerFlow(CLIENT_ID, CLIENT_SECRET, OAUTH_SCOPE, REDIRECT_URI)
authorize_url = flow.step1_get_authorize_url()
print('Go to the following link in your browser: ' + authorize_url)
code = input('Enter verification code: ').strip()
credentials = flow.step2_exchange(code)
# Create an httplib2.Http object and authorize it with our credentials
http = httplib2.Http()
http = credentials.authorize(http)
webmasters_service = build('webmasters', 'v3', http=http)
# Retrieve list of properties in account
site_list = webmasters_service.sites().list().execute()
# Filter for verified websites
verified_sites_urls = [s['siteUrl'] for s in site_list['siteEntry'] if s['permissionLevel'] != 'siteUnverifiedUser' and s['siteUrl'][:4] == 'http']
# Çekime Başlıyoruz
import datetime
today = datetime.datetime.now()
from datetime import datetime, timedelta
start365 = today - timedelta(days=365)
startdate =datetime.strftime(start365, '%Y-%m-%d')
enddate = datetime.strftime(today, '%Y-%m-%d')
site = "ENTER YOUR SITE"
keywords_request = { 'startDate': startdate, 'endDate': enddate, 'dimensions': ['query'], 'rowLimit': 100, }
query_keys = webmasters_service.searchanalytics().query(siteUrl=site, body=keywords_request).execute()
console_data_keys = pd.DataFrame(query_keys['rows'])
keys = [f['keys'][0] for f in query_keys['rows']]
data = pd.DataFrame([])
for i in keys: request = { 'startDate': startdate, 'endDate': enddate, 'dimensions': ['date', 'query'], 'rowLimit': 365, "dimensionFilterGroups": [ { "filters": [ { "dimension": 'query', "operator": 'equals', "expression": i }, ] } ] } query = webmasters_service.searchanalytics().query(siteUrl=site, body=request).execute() k=pd.DataFrame(query['rows']) data = data.append(k)
data['date'] = data['keys'].apply(pd.Series)[0]
data['keywords'] = data['keys'].apply(pd.Series)[1]
data = data.drop(columns="keys")
position_change = pd.DataFrame(columns=["keywords","top","last","change"])
for i in keys: #en yüksek sıralamayı alıyoruz. filtered = data['keywords'] == i first_page = data['position'] <= 10 non_first_page = data['position'] > 10 min_value = data[filtered & first_page]['position'].min() #bir anahtar kelimenin son veri alındığı tarihi belirliyoruz. last_data = data[filtered]['date'].max() date_filter = data['date'] == last_data #bu tarihte ki son pozisyonu belirliyoruz. last_rank = data[filtered & date_filter]['position'].min() print(last_rank) #Farkı hesaplatıyoruz. change_rank = -last_rank +min_value print(last_rank, min_value) y={"keywords":i,"top":min_value,"last":last_rank,"change":change_rank} position_change = position_change.append(y, ignore_index=True)
position_change.dropna(inplace=True)
position_change["top"] = position_change["top"].astype(int)
position_change["last"] = position_change["last"].astype(int)
position_change["change"] = position_change["change"].astype(int)
position_change = position_change[position_change["last"]>10]
position_change .to_excel(r'results.xls')
İlginizi Çekebilir