Python SEO

Python ile Backlinklerin Analizi

External linkler (backlinkler),başka bir web sitesinden sitenize gelen herhangi bir linke verilen isimdir. Genellikle backlinkler başka bir sitenin belirli bir içeriği, bir yazıyı, bir ürünü veya hizmeti önermek veya referans vermek için link verdiği anlamına gelir. Backlinkler, arama motoru optimizasyonu (SEO) için çok önemlidir çünkü bir web sitesinin alaka düzeyini ve otoritesini belirlemeye yardımcı olurlar.

Google gibi arama motorları, belirli bir web sitesine gelen backlink sayısını ve kalitesini bir sitenin popülaritesini ve otoritesini belirlemek için kullanır. Yüksek kaliteli backlinkler genellikle bir sitenin arama motoru sıralamalarında daha yüksek bir pozisyona çıkmasına yardımcı olur.

Python ile External Linklerin (Backlinklerin) Analizi Nedir?

Aşağıda paylaştığımız kodlar, bir web sitesine (domaine) gelen backlinklerin en çok hangi sayfalara dağıldığını belirlemek ve bu linklerin kategorisel (siteye göre) dağılımını grafik haline getirerek görselleştirmek amacıyla yazılmıştır.

Bu kodlarda basit (domain bazlı xpath) değişiklikleri yapılarak sabit bir backlink verisi üstünden siteye gelen backlinkler ve bu backlinklerin kategorisel dağılımı analiz edilebilir.

Bu Analizin Amacı ve Faydaları Nelerdir?

Statik bir backlink verisi üstünde gerçekleştirilen bu data analizi ile sitenize gelen backlinklerin en çok hangi sayfalara dağıldığını görebilir ve bu linklerin yarattığı pagerank etkisini dikkate alarak siteniz için yeni bir link dağılım şeması oluşturabilirsiniz.

Örneğin https://www.dijitalzade.com/dns-nedir sayfası bu analiz sonucunda en çok backlink alan sayfa olarak belirlenirse, site içerisinde kurulacak bir iç link şeması (planı) dahilinde bu sayfa üzerinden yapılabilecek maksimum link dağılım örgüsü kurgulanarak, sayfanın dışarıdan aldığı backlink (pagerank) etkisinin site içerisindeki önemli sayfalara dağılımı sağlanabilir.

Bu tarz bir taktik genelde SaaS projelerinde footer’da açılan bir section (alan) üstünden site / marka için önemli sayfalara link dağıtma şekilde gerçekleştirilir. Genellikle bu alan içerisine örneğin Blog bölümünün son yayınlanan 10 içeriği eklenerek kullanıcı tarafından ziyade pagerank tarafında ana sayfa üstünden link etkinliğinin blog sayfalarına dağılması amaçlanır.

Sitenin boyutu fark etmeksizin faydalı olabilecek bu çalışma özellikle orta ve büyük ölçekli, genellikle binlerce linkten oluşan site link şemalarının yönetildiği projelerde dağılım planı oluşturulurken ekstra faydalı olabilir.

Bu analiz ile sayfalara gelen link sayılarının görülmesinin yanı sıra kategorilere gelen linklerin sayısının da grafik haline getirilmesi linkleme planları için son derece faydalı olabilir. External linkler (backlinkler) sizin kontrolünüz dışında sitenize gelen linkler olabileceğinden özellikle sizin istediğiniz bir veya bir kaç kategori yerine farklı kategorilere gelen backlinklerin stabil bir grafik üstünden görüntülenmesi, backlink edinme noktasında kurgulayacağınız içerik üretim planları için fayda sağlayabilir.

Örneğin; Siteniz için en kritik kategoriler A ve B kategorileri iken C ve E kategorilerine gelen backlinkler daha fazlaysa, C ve E kategorilerinde yer alan yüksek backlink alan içerikleri kullanarak iç linklerinizi alakalı A ve B kategorilerine dağıtabilir ve yeni içerik planında A ve B kategorilerinin daha fazla backlink kazanmalarına odaklanabilirsiniz.

Datanızı ve aşağıdaki kod örneklerini kullanarak analizini geliştirebilir ve C ve E kategorilerinin hangi şekillerde backlinkler aldığını analiz ederek benzer formatta içerikleri A ve B kategorileriniz için üretebilirsiniz.

Python ile External Linklerin Analizi

Kodu yazmaya, kullanmaya başlamadan önce importlarımızı yapalım.

Bu kod içerisinde kullanılan importlar aşağıdaki gibidir.

import pandas as pd
import numpy as np
from requests_html import HTMLSession
import matplotlib.pyplot as plt

  • Pandas -> Dataların okunması ve dataframe olarak kullanılması için pandas kütüphanesini import ediyoruz.
  • Numpy -> Aşağıda yer alan analiz dahilinde numpy kullanmadık ancak sayısal bir veri oluşturma, numpy array kullanma durumlarına yönelik Numpy’ı import edebilirsiniz.
  • HTMLSession -> xPath kullanımı ile veri çekmek ve HTTP isteği göndermek için import ediyoruz.
  • Matplotlib.pyplot -> doğrudan analiz sonunda verilere göre grafik oluşturmak için import ediyoruz.

Verinin Oluşturulması

Bu analiz dahilinde kullanacağımız backlink verilerini Ahrefs’den aldık (oluşturduk). Ahrefs backlink veritabanı noktasında son derece başarılı bir platform olduğundan ötürü backlinklerin analizi için bu platformu tercih ettik ancak siz farklı bir platformu tercih edebilirsiniz.

Ahrefs içerisinde domain adresinizi yazdıktan sonra referring domains bölümünden sitenize gelen backlinkleri görebilir ve bu veriyi export alabilirisiniz.

Verinin genel görüntüsü şu şekilde:

Storyly backlink verileri (Ahrefs)
Backlink analizi için SEO manager olarak çalıştığım Storyly.io’nun backlink verilerini kullandım.

İndirdiğiniz backlink verisini Python kodlarınızın çalıştığı klasör içerisine alarak koda devam edebilirsiniz.

Verinin Okunması ve İlk Bakış

Veriyi okumak için import ettiğimiz pandas’ı kullanıyoruz.

data = pd.read_excel('storyly-outlinks.xlsx')

Bu kod ile storyly-outlinks.xlsx olarak kaydettiğimiz excel dosyasını okuyor ve DataFrame haline getiriyoruz.

DataFrame haline getirilen verinin okunması
DataFrame haline getirilen verinin okunması

Pandas kullanılarak okunan ve DataFrame haline getirilen veriye data.head(5) yaparak ilk 5 örnek üzerinden bir bakış atıyoruz.

.head() kullanımı ile DataFrame haline getirilen verinin genel durumu incelenir. Görselde görülebildiği gibi data değişkenine atanan DataFrame’imimiz içerisinde çok sayıda kolon (32) ve satır mevcut.

Verinin İşlenmesi ve Ana Kodlar

data.columns

Yaparak data içerisinde sitenin hangi sayfalarına link verildiğinin hangi kolon kullanılarak görülebileceğini inceliyoruz.

Bizim verimizde data.columns yaptığımızda aşağıdaki kolon başlıklarını çıktı olarak aldık.

Index(['Referring page title', 'Referring page URL', 'Language', 'Platform',
       'Referring page HTTP code', 'Domain rating', 'UR', 'Domain traffic',
       'Referring domains', 'Linked domains', 'External links', 'Page traffic',
       'Keywords', 'Target URL', 'Left context', 'Anchor', 'Right context',
       'Type', 'Content', 'Nofollow', 'UGC', 'Sponsored', 'Rendered', 'Raw',
       'Lost status', 'Drop reason', 'Discovered status', 'First seen',
       'Last seen', 'Lost', 'Author', 'Links in group'],
      dtype='object')

Adından da anlaşılabileceği gibi ‘Target URL’ kolon başlığı, sitenin backlink alınan URL’lerini görüntülemek için döngü kurmamız gereken başlık.

target_dict = dict()
for target in data['Target URL'].values:
  if target not in target_dict.keys():
    target_dict[target] = 1
  else:
    target_dict[target] += 1

Devamında Target URL kolonun altında yer alan site URL’lerinde döngü kurulmadan önce target_dict adında bir dictionary oluşturuyoruz. Bu dictionary’i döngü ile alınan URL’leri ve onlara gelen backlinklerin sayısını tutmak için kullanacağız.

Bu dictionary oluşturulduktan sonra for döngüsü ile ‘Target URL’ kolonu altındaki URL’lerde dolaşıp bunlara gelen backlinklerin sayılarını dictionary üzerine yazıyoruz.

target_urls_list = sorted(target_dict.items(), key=lambda x: x[1], reverse=True)

İşlem bittikten sonra oluşan dictionary’i key’lere göre değilde değerlere göre olacak şekilde sıralıyoruz. Bu aşamada veri dataFrame haline getirilip sort.values() kullanılarak da sıralanabilir ancak ben alternatif olarak sorted() metodunu kullandım ve liste olarak çıktıyı aldım.

target_dict = dict(target_urls_list)

Bu kod ile sorted() metodu yanıt olarak bir liste döndürdüğü için aldığım listeyi daha kolay işleyebilmek adına tekrar dict objesi haline getiriyorum.
Çağrılan dictionary objesinin sonucu
Kodun buraya kadar olan bölümünü çalıştırdığınızda çıktı olarak üsttekine benzer bir dictionary objesi alacaksınız. Obje içerisinde keyler bölümünde link verilen URL’ler ve value (değerler) bölümünde o linke gelen backlinklerin sayısını göreceksiniz.

Kodun bundan sonraki bölümünde data, DataFrame’i içerisindeki ‘Target URL’ kolonun altındaki URL’ler üstünde döngü kurularak HTTP isteği ilgili URL’lere gönderilecek ve gelen yanıt içerisinden sayfaların kategorileri xPath yardımı ile alınacaktır
session = HTMLSession()
category_link_counter = dict()
for url in data['Target URL'].values:
 url = str(url).strip()
 r = session.get(url)
 category = r.html.xpath('//div[@class="category-tag no-margin"]//text()')
 try:
  category = category[0]
  if category not in category_link_counter.keys():
    category_link_counter[category] = 1
  else:
   category_link_counter[category] += 1
 except:
   if '/glossary' in url:
     category='Glossary'
   elif url == 'https://www.storyly.io/':
     category = 'Homepage'
   else:
     category = 'Other Pages'
    if category not in category_link_counter.keys():
     category_link_counter[category] = 1
    else:
     category_link_counter[category] += 1

İşlem sonunda şu şekilde bir dict çıktısı alınacaktır

{'Glossary': 134,
 'User Engagement': 66,
 'Homepage': 439,
 'Insights': 105,
 'Other Pages': 144,
 'Personalization': 27,
 'Marketing Tips': 57,
 'Technology': 16,
 'Product News': 12} 
Döngü ile alınan URL’lerin kategorilerinin xPath ile çekilmesi sürecinde kullanılacak xPath, sitelere (domaine) özgü olacağından işlem öncesinde URL’lerin kategorilerini çekmeye yönelik xPath’i ayarlayın.
category_names = list(category_link_counter.keys())
links = list(category_link_counter.values())

Bu kod ile Matplotlib grafiğinde X ve Y eksenlerindeki metinleri oluşturmak ve grafik değerlerini göstermek için dict içerisindeki key ve değerleri ayrı birer list haline getiriyoruz.

 my_fig, my_axe = plt.subplots(figsize=(14,6))
my_axe.bar(category_link_counter.keys(), category_link_counter.values())
my_axe.set_title('External Link Distribution of Storyly')
my_axe.set_ylabel('Link Count')
my_axe.set_xlabel('Categories')
for i in range(len(category_names)):
    my_axe.text(x=category_names[i], y=links[i]+0.9, s=links[i])

Python’un matplotlib kütüphanesini kullanarak elde ettiğimiz verileri (üstteki dict çıktısı) görselleştiriyoruz. Görselleştirme işlemi özellikle farklı departmanlara data ile alakalı somut verileri görselleştirmek ve daha net aktarabilmek için önemlidir.

Kodun görsel çıktısı aşağıdaki gibi olacaktır:

Storyly'nin external linklerinin kategorisel dağılımı.
Storyly’nin external linklerinin kategorisel dağılımı

Neden önemlidir bölümünde değindiğimiz gibi , siteye gelen external linklerin kategori bazlı dağılımını görmek ve buna göre iç linkleme, içerik üretimi yada genel marketing kanal dağılım stratejilerini oluşturmak SEO çalışmalarının yanı sıra genel marketing süreçleri içinde son derece faydalı olacaktır.

Kodun Bütün Hali

import pandas as pd
import numpy as np
from requests_html import HTMLSession
import matplotlib.pyplot as plt

data = pd.read_excel('storyly-outlinks.xlsx')

print(data.columns)

target_dict = dict() 
for target in data['Target URL'].values: 
	if target not in target_dict.keys(): 
		target_dict[target] = 1 
	else: 
		target_dict[target] += 1

target_urls_list = sorted(target_dict.items(), key=lambda x: x[1], reverse=True)

target_dict = dict(target_urls_list)

session = HTMLSession()
category_link_counter = dict()
for url in data['Target URL'].values:
    url = str(url).strip()
    r = session.get(url)
    category = r.html.xpath('//div[@class="category-tag no-margin"]//text()')
    try:
        category = category[0]
        if category not in category_link_counter.keys():
            category_link_counter[category] = 1
        else:
            category_link_counter[category] += 1
    except:
        if '/glossary' in url:
            category='Glossary'
        elif url == 'https://www.storyly.io/':
            category = 'Homepage'
        else:
            category = 'Other Pages'
        if category not in category_link_counter.keys():
            category_link_counter[category] = 1
        else:
            category_link_counter[category] += 1


category_names = list(category_link_counter.keys())
link_counts = list(category_link_counter.values())

my_fig, my_axe = plt.subplots(figsize=(14,6))
my_axe.bar(category_link_counter.keys(), category_link_counter.values())
my_axe.set_title('External Link Distribution of Storyly')
my_axe.set_ylabel('Link Count')
my_axe.set_xlabel('Categories')
for i in range(len(category_names)):
    my_axe.text(x=category_names[i], y=link_counts[i]+0.9, s=link_counts[i])

Oskay Günaçar

Oskay Günaçar, Teknik SEO uzmanı ve Dijitalzade SEO & Dijital Pazarlama bloğunun kurucusudur. Front-end programlama, Python, semantic SEO, teknik SEO, Google patentleri ve Google search başlıca ilgili alanlarıdır. 5 yıldan fazla SEO deneyimi ile İKİLER, Webtures, Boosmart ve Storyly.io şirketlerinde SEO uzmanı pozisyonlarında görev almış ve outsource uzman olarak çok sayıda projeye dahil olmuştur. Sektör içerisinde çalıştığı çok sayıda başarılı, büyük web sitesinin yönetim ve geliştirme (SEO) süreçlerinden elde ettiği uzmanlık ve deneyimleri paylaşmayı amaçladığı Dijitalzade web sitesi üzerinden doğru ve kaliteli bilginin kolay ulaşılabilir olması amacıyla içerik üretmektedir.
Başa dön tuşu