Toplu title ve description denetimi için Python betiği
Birkaç yüz sayfalık bir sitede title ve description kontrolünü tek tek sayfa açarak yapmak mümkün değil. Masaüstü tarama araçları bu işi yapar ama çoğu ücretli ya da ücretsiz sürümde URL sınırı koyar. Oysa ihtiyaç basit: sitemap'teki her URL'yi aç, title ve description'ı al, sorunlu olanları listele.
Aşağıdaki betik tam olarak bunu yapıyor. Sitemap'i okuyor, sayfaları nazikçe tek tek çekiyor, eksik, çok uzun, çok kısa ve site içinde tekrar eden etiketleri işaretleyip bir CSV dosyasına yazıyor.
Neyi kontrol ediyoruz
Title ve meta description için Google'ın resmi bir karakter sınırı yok. Sonuç sayfasındaki kesilme piksel genişliğine göre olur ve Google title'ı da description'ı da sayfa içeriğine göre yeniden yazabilir. Yine de pratikte bir kural setine ihtiyaç var; ben şu eşikleri kullanıyorum:
| Etiket | Kısa | Uzun | Not |
|---|---|---|---|
| title | 30 karakterden az | 60 karakterden fazla | Masaüstünde kesilme yaklaşık 600 piksel civarında |
| description | 70 karakterden az | 160 karakterden fazla | Mobilde daha fazla, masaüstünde daha az görünebilir |
Karakter sayısı piksel genişliğinin kaba bir tahmini. Türkçede "Ş", "Ğ", "M", "W" gibi geniş harfler ve büyük harf ağırlıklı başlıklar aynı karakter sayısında daha fazla yer kaplar. "i", "l", "ı" gibi dar harfler ise daha az. Yani 58 karakterlik bir title kesilebilir, 64 karakterlik bir title sığabilir. Betik kaba elemeyi yapıyor; sınırdaki başlıklar için piksel hesabını ayrı yapmak gerekiyor.
Tekrar kontrolü de en az uzunluk kadar önemli. Aynı title'ı taşıyan birden fazla sayfa, genellikle ya şablon hatasına ya da gerçekten birbirine çok benzeyen içeriklere işaret eder. Sayfalama, filtre ve etiket sayfalarında bu sık görülür.
Kurulum
Betik Python 3 ile çalışıyor ve iki harici kütüphane kullanıyor:
pip install requests beautifulsoup4Betik
Çalıştırmak için:
python denetim.py https://ornek.com/sitemap.xmlBetiğin yaptığı birkaç tercih
Sitemap index desteği. Kök etiket sitemapindex ise betik alt sitemap'leri sırayla açar. WordPress eklentileri ve çoğu e-ticaret altyapısı sitemap'i parçalara böldüğü için bu gerekli. Sıkıştırılmış .xml.gz dosyalarını ise bu haliyle açmıyor; öyle bir sitemap'iniz varsa gzip.decompress() ile bir satır eklemek yeterli.
Nazik tarama. İstekler arasında 1,5 saniye bekleme var ve User-Agent satırında betiğin adı ile bir iletişim adresi yer alıyor. Kendi sitenizde bile paylaşımlı hosting kullanıyorsanız paralel istek atmamanızı öneririm; betik yavaş ama sunucuyu yormaz. Başkasının sitesinde çalıştıracaksanız bekleme süresini artırın ve site sahibinin kurallarına saygı gösterin.
Sadece head içi. Title'ı head içinden alıyorum. Aksi halde gövdedeki bir SVG'nin <title> etiketi yanlışlıkla yakalanabiliyor. Description araması da büyük-küçük harf duyarsız; name="Description" yazan temalar da oluyor.
Boşluk temizliği. Title içindeki satır sonu ve fazla boşlukları tek boşluğa indiriyorum. Şablonlarda title'ın birkaç satıra bölünmüş olması sık görülüyor ve uzunluk hesabını bozuyor.
CSV biçimi. Ayırıcı olarak noktalı virgül ve utf-8-sig kodlaması kullanıyorum. Türkçe yerel ayarlı Excel dosyayı çift tıklayınca sütunları doğru ayırıyor ve Türkçe karakterler bozulmuyor. LibreOffice ya da Google E-Tablolar kullanıyorsanız içe aktarma sırasında ayırıcıyı seçmeniz yeterli.
Sınırlar
Betik ham HTML'i okuyor, JavaScript çalıştırmıyor. Title'ı istemci tarafında JavaScript ile değiştiren sitelerde (bazı tek sayfa uygulamaları gibi) gördüğünüz değer, tarayıcıda gördüğünüzden farklı olabilir. Google render sonrası DOM'u kullandığı için bu durumda asıl önemli olan render edilmiş hali. Böyle bir sitede bu betik size render öncesi durumu gösterir, bu da başlı başına faydalı bir teşhis bilgisi.
Ayrıca betik canonical ve noindex durumuna bakmıyor. Tekrar eden title'lar listesinde noindex olan ya da başka bir URL'ye canonical veren sayfalar da görünebilir. Bunları ayırmak isterseniz etiketler() fonksiyonuna link[rel=canonical] ve meta[name=robots] okumasını eklemek birkaç satırlık iş.
Sonuçları değerlendirmek
CSV'yi açtığımda sırayla şuna bakıyorum:
httpsütununda 200 dışındaki değerler. Sitemap'te yönlendiren ya da 404 veren URL olmamalı; bu ayrı bir temizlik işi.title_durumdeğeri EKSİK olanlar. Bunlar genelde şablon hatası.title_tekrardeğeri 1'den büyük olanlar. Aynı gruptaki sayfaların gerçekten ayrı sayfa olması gerekip gerekmediğine karar veriyorum.- UZUN ve KISA olanlar. Burada acele etmiyorum; kısa bir title her zaman sorun değil, uzun bir title da bazen bilinçli bir tercih.
Sınırda kalan title'lar için karakter sayısından daha doğru bir ölçü gerekiyor. CSV'deki title ve description sütunlarını kopyalayıp toplu title aracına yapıştırdığımda her satırın piksel genişliğini ve kesilip kesilmeyeceğini görüyorum. Tek bir sayfanın yeni title'ını denerken de SERP önizleme aracını kullanıyorum.
Betiği genişletmek
Temel sürüm bilinçli olarak kısa. Kendi kullanımımda zamanla şu eklemeleri yaptım, ihtiyacınıza göre seçebilirsiniz:
- H1 kontrolü:
soup.find_all("h1")ile sayfadaki H1 sayısını ve ilk H1 metnini CSV'ye eklemek. Title ile H1'in tamamen aynı ya da tamamen alakasız olduğu sayfalar böylece hızla görünüyor. - Canonical ve robots: Tekrar eden title'ları değerlendirirken hangi sayfanın noindex olduğunu ya da başka bir URL'yi canonical gösterdiğini bilmek, yanlış alarmları ayıklıyor.
- Yönlendirme takibi:
r.historydoluysa URL yönlendirilmiş demektir. Sitemap'te yönlendiren URL tutmamak için bu bilgiyi ayrı bir sütuna yazmak işe yarıyor. - Karşılaştırma: Her çalıştırmanın CSV'sini tarihle saklayıp iki dosya arasında hangi title'ların değiştiğini listelemek. Bir tema güncellemesinin tüm title'ları bozduğunu bu sayede ertesi gün fark edebilirsiniz.
Bu eklemelerin hiçbiri betiğin temel akışını değiştirmiyor; hepsi etiketler() fonksiyonuna birkaç satır ve CSV'ye birkaç sütun demek.
Özetle
- Betiği sitemap adresiyle çalıştırın, çıktıyı Excel ya da E-Tablolar'da açın.
- Önce 200 dışı durum kodlarını ve eksik etiketleri düzeltin.
- Tekrar eden title ve description'ları şablon mu, içerik mi sorunu diye ayırın.
- Uzun ve kısa etiketleri piksel bazında kontrol edip gerekeni yeniden yazın.
- Düzeltmelerden sonra betiği tekrar çalıştırıp iki CSV'yi karşılaştırın.
Comments / questions
If you have a question about any topic or wish to contact me: Telegram or send an email to [email protected] Thanks!