robots.txt Dosyası Nedir, Nasıl Okunur?

Yayın tarihi:

13 dk okuma

Acar Diveroli
Yazar: Acar Diveroli
User-agent, Disallow ve Allow satırları yazılı bir belge kartının bot küpüne bağlandığı çizim

Herhangi bir sitenin adresinin sonuna /robots.txt ekleyip açtığınızda, çoğu zaman birkaç satırlık düz bir metin dosyası görürsünüz. Bu dosya sitenin arama motorlarına, tarayıcılara (crawler) ve scraper'lara "şu yolları taramayın" dediği yerdir. Bir SEO uzmanı için sitenin arama motorlarında nasıl görüneceğini etkileyen bir ayar, veri toplayan bir geliştirici için ise işe başlamadan önce okunması gereken ilk belgedir.

Bu yazıda robots.txt'nin ne olduğunu, nerede bulunduğunu ve kuralların nasıl okunduğunu, User-agent, Disallow, Allow, joker karakterler ve en uzun eşleşme kuralıyla birlikte anlatıyoruz. Ardından Crawl-delay ve Sitemap satırlarını, dosyanın yasal olarak bağlayıcı olup olmadığını, bir scraper'ın robots.txt'yi Python ile nasıl okuması gerektiğini (ve standart kütüphanedeki ayrıştırıcının hangi durumlarda yanlış sonuç verdiğini), SEO tarafındaki sık hataları ve yapay zeka botları için yazılan satırları ele alıyoruz.

robots.txt nedir?

robots.txt, 1994'ten beri kullanılan ve uzun yıllar yazılı bir standarda dayanmadan yaygınlaşan Robots Exclusion Protocol'ün (robot hariç tutma protokolü) dosyasıdır. Protokol 2022'de RFC 9309 ile resmi bir standart hâline geldi. Bu standart dosyanın biçimini, kuralların nasıl eşleştirileceğini ve dosyaya ulaşılamadığında ne yapılacağını tanımlar.

Dosyanın işlevi basittir: site sahibi, otomatik ziyaretçilerin hangi yollara girmemesini istediğini belirtir. Bunun tipik nedenleri şunlardır:

  • Sunucu yükü: Arama ve filtre sayfaları gibi her istekte veritabanını yoran yollar.
  • Değersiz veya tekrar eden içerik: Sıralama parametreleriyle üretilen binlerce aynı sayfa, sepet ve hesap sayfaları.
  • Tarama bütçesi: Arama motoru botlarının zamanını önemli sayfalara yönlendirmek.
  • İçerik kullanım tercihi: Belirli botların, örneğin yapay zeka eğitimi için veri toplayanların siteyi taramaması.

robots.txt bir güvenlik mekanizması değildir. Dosya herkese açıktır ve bir yolu Disallow ile kapatmak, o yolun varlığını herkese duyurmak anlamına da gelir. Gizli kalması gereken sayfalar parola, erişim kontrolü veya noindex gibi yöntemlerle korunmalıdır.

robots.txt nerede bulunur?

Dosya her zaman sitenin kök dizinindedir ve adı küçük harfle robots.txt'dir:

  • https://ornek.com/robots.txt geçerlidir.
  • https://ornek.com/klasor/robots.txt hiçbir bot tarafından okunmaz.

Kural kapsamı protokol, alan adı ve port bazındadır. https://ornek.com/robots.txt yalnızca https://ornek.com için geçerlidir; https://magaza.ornek.com alt alan adının kendi dosyası olmalıdır. http:// ve https:// sürümleri de teknik olarak ayrı dosyalardır.

Dosyaya ulaşılamadığında ne olacağını RFC 9309 şöyle tanımlar:

  • 4xx yanıtı (dosya yok): Tarayıcı sitede herhangi bir kısıtlama olmadığını varsayabilir.
  • 5xx yanıtı veya ağ hatası (dosyaya ulaşılamıyor): Tarayıcı sitenin tamamının kapalı olduğunu varsaymalıdır.

Standart ayrıca tarayıcıların dosyayı önbellekte tutabileceğini, ama genellikle 24 saatten uzun süre eski sürümü kullanmamalarını önerir. Yani dosyada yaptığınız bir değişikliğin botlara yansıması bir güne kadar sürebilir.

Kurallar nasıl okunur?

Aşağıda bir e-ticaret sitesi için gerçekçi bir örnek dosya var:

text
User-agent: *
Disallow: /sepet
Disallow: /hesabim/
Disallow: /arama
Allow: /arama/populer
Disallow: /*?siralama=
Disallow: /*.pdf$
Crawl-delay: 5

User-agent: OrnekFiyatBotu
Disallow: /hesabim/
Allow: /

User-agent: GPTBot
Disallow: /

Sitemap: https://ornek.com/sitemap.xml
SatırAnlamı
User-agent: *Bu gruptaki kurallar, kendisi için ayrı grup yazılmamış bütün botlara uygulanır
Disallow: /sepet/sepet ile başlayan her yol: /sepet, /sepet/ekle, hatta /sepetim
Disallow: /hesabim//hesabim/ klasörü ve altındaki her şey; /hesabim (sonda eğik çizgi yok) bu kurala uymaz
Disallow: /arama/arama, /arama?q=telefon, /arama/populer
Allow: /arama/populerBir önceki yasağın istisnası; daha uzun olduğu için bu yol taranabilir
Disallow: /*?siralama=* herhangi bir karakter dizisi: ?siralama= parametresi içeren her adres
Disallow: /*.pdf$$ adresin sonu: .pdf ile biten adresler; /katalog.pdf?v=2 bu kurala uymaz
Crawl-delay: 5İstekler arasında 5 saniye bekleme talebi (standart dışı, aşağıda açıklanıyor)
User-agent: OrnekFiyatBotuBu bota özel grup; bu bot yukarıdaki * grubunu hiç okumaz
Allow: /Bu bot için hesap sayfaları dışında her yer açık
User-agent: GPTBot + Disallow: /GPTBot sitenin tamamını taramamalı
Sitemap:Site haritasının adresi; gruplardan bağımsızdır

User-agent grupları

Dosya gruplardan oluşur. Her grup bir veya daha fazla User-agent satırıyla başlar ve ardından gelen kurallar o gruba aittir. Bir bot dosyayı okurken:

  1. Kendi adıyla eşleşen bir grup arar. Eşleştirme, botun ürün adına (örneğin GPTBot) göre ve büyük-küçük harf ayrımı yapılmadan yapılır; tarayıcının tam User-Agent dizesine göre değil.
  2. Kendisine özel bir grup bulursa yalnızca o grubun kurallarını uygular. * grubundaki kurallar bu bota eklenmez.
  3. Özel grup yoksa * grubunu uygular.
  4. Hiçbir grup yoksa sitede kısıtlama olmadığını varsayar.

İkinci madde sık gözden kaçar. Yukarıdaki örnekte OrnekFiyatBotu için ayrı bir grup yazıldığı için bu bot /sepet ve /arama yasaklarından da Crawl-delay talebinden de etkilenmez.

Disallow, Allow ve en uzun eşleşme kuralı

Kurallar yol öneki olarak eşleşir: Disallow: /sepet, /sepet ile başlayan her yolu kapsar. Bir adrese birden fazla kural uyduğunda RFC 9309'a göre en uzun eşleşen kural geçerlidir. /arama/populer adresi hem Disallow: /arama (6 karakter) hem Allow: /arama/populer (14 karakter) kuralına uyar; daha uzun olan Allow kazanır ve sayfa taranabilir.

İki kural aynı uzunlukta olup biri Allow, diğeri Disallow ise standart Allow'un tercih edilmesini önerir. Kuralların dosyadaki sırası sonucu değiştirmez. Bu nokta, aşağıda göreceğimiz gibi bazı ayrıştırıcılarda doğru uygulanmaz.

Joker karakterler

  • * sıfır veya daha fazla karakterle eşleşir: Disallow: /*?oturum= oturum parametresi taşıyan her adresi kapatır.
  • $ adresin sonunu belirtir: Disallow: /*.pdf$ yalnızca .pdf ile biten adresleri kapatır.

Disallow: satırının değeri boş bırakılırsa (Disallow:) hiçbir yol kapatılmamış olur. Disallow: / ise sitenin tamamını kapatır. Bu iki satır arasındaki tek karakterlik fark, SEO hatalarının en pahalılarından birine yol açabilir.

Crawl-delay ve Sitemap satırları

Crawl-delay, bir botun aynı siteye art arda gönderdiği istekler arasında kaç saniye beklemesi gerektiğini belirten bir taleptir. RFC 9309'un parçası değildir, ama birçok tarayıcı ve scraper tarafından okunur. Google Crawl-delay satırını desteklemez; Google'ın tarama hızı kendi sistemleriyle belirlenir. Diğer bazı arama motorları bu satırı dikkate alır.

Bir scraper için Crawl-delay değeri, site sahibinin açıkça belirttiği bir hız tercihidir ve standart dışı olsa bile uyulması gereken bir işarettir. Hız sınırlarına uymanın diğer yollarını Web Scraping'de Engellenmeden Veri Toplama Yöntemleri yazımızda anlattık.

Sitemap satırı, site haritası dosyasının tam adresini verir. Gruplardan bağımsızdır, dosyanın herhangi bir yerinde bulunabilir ve birden fazla kez yazılabilir. Hem arama motorları hem scraper'lar için sitenin bütün sayfalarını bağlantı bağlantı gezmek yerine doğrudan sayfa listesine ulaşmanın yoludur.

robots.txt yasal olarak bağlayıcı mı?

robots.txt teknik olarak bir erişim engeli değil, bir taleptir. Dosyada bir yolun kapatılmış olması, o yola erişimi fiziksel olarak engellemez. Bu yüzden "robots.txt'ye uymak zorunlu mu" sorusunun cevabı teknik değil, hukuki ve etiktir.

Pratikte bilinmesi gerekenler:

  • Meşru tarayıcıların hepsi uyar. Arama motorları, arşiv servisleri ve kurumsal tarayıcılar robots.txt'yi okur ve uygular.
  • Site şartlarıyla birlikte değerlendirilir. Birçok sitenin kullanım şartları otomatik erişimi robots.txt'ye atıf yaparak düzenler. Örneğin Google'ın hizmet şartları, robots.txt gibi makine tarafından okunabilir talimatlara aykırı otomatik erişimi kötüye kullanım örnekleri arasında sayar.
  • Uyuşmazlıklarda belirleyici bir işaret olabilir. Bir sitenin açıkça kapattığı yolları tarayan bir scraper, sitenin tercihini bildiği hâlde yok saymış sayılır.
  • robots.txt'ye uymak her şeyi yasal yapmaz. Açık bir yoldaki kişisel verileri toplamak da KVKK veya GDPR kapsamındaki yükümlülüklerden bağımsız değildir.

Veri toplamanın hukuki çerçevesini Web Scraping Yasal mı? yazımızda ele aldık. Bu yazı hukuki danışmanlık değildir; kendi işiniz için bir hukukçuya danışmanızı öneririz.

Scraper robots.txt'yi nasıl okumalı?

Python'un standart kütüphanesinde urllib.robotparser modülü bulunur ve resmi belgesi temel kullanımı anlatır. Ancak modülü yukarıdaki örnek dosyayla test ettiğimizde, RFC 9309'dan ayrıldığı dört nokta çıktı:

DurumRFC 9309urllib.robotparser
Disallow: /arama önce, Allow: /arama/populer sonra/arama/populer taranabilir (en uzun kural)Taranamaz; ilk eşleşen kuralı uygular
Aynı iki kural ters sıradaTaranabilirTaranabilir
Disallow: /*?siralama=/kategori?siralama=fiyat kapalıAçık; * desteklenmiyor
Disallow: /*.pdf$/katalog.pdf kapalıAçık; $ desteklenmiyor

Ayrıca iki davranış farkı var:

  • Bot adı olarak tam User-Agent dizesi verildiğinde (Mozilla/5.0 (compatible; GPTBot/1.2; ...)) modül bota özel grubu bulamadı ve * grubunu uyguladı. Fonksiyona yalnızca ürün adını (GPTBot) vermek gerekir.
  • Dosya 401 veya 403 ile yanıt verdiğinde modül sitenin tamamını kapalı sayar. RFC 9309 ise 4xx yanıtlarını "dosya yok" olarak değerlendirir. Modülün read() fonksiyonu dosyayı Python'un varsayılan User-Agent değeriyle ve zaman aşımı olmadan indirdiği için, bu değeri engelleyen bir sitede yanlışlıkla "her şey kapalı" sonucu alabilirsiniz.

Bu yüzden dosyayı kendi istemcinizle indirmek, parse() fonksiyonuna vermek ve joker karakter kullanan dosyalarda daha kapsamlı bir ayrıştırıcı tercih etmek daha güvenlidir:

python
from urllib.parse import urlsplit
from urllib.robotparser import RobotFileParser

import requests

BOT_ADI = "OrnekFiyatBotu"
USER_AGENT = f"{BOT_ADI}/1.0 (+https://ornek.com/bot-hakkinda)"


def robots_icin(site, session):
    """robots.txt'yi indirir; RFC 9309'daki 4xx ve 5xx davranışını uygular."""
    parser = RobotFileParser()
    try:
        response = session.get(f"{site}/robots.txt", timeout=10)
    except requests.RequestException:
        parser.parse(["User-agent: *", "Disallow: /"])  # ulaşılamıyor: hepsi kapalı
        return parser
    if response.status_code >= 500:
        parser.parse(["User-agent: *", "Disallow: /"])
    elif response.status_code >= 400:
        parser.parse([])  # dosya yok: kısıtlama yok
    else:
        parser.parse(response.text.splitlines())
    return parser


session = requests.Session()
session.headers["User-Agent"] = USER_AGENT

url = "https://ornek.com/urun/123"
site = "{0.scheme}://{0.netloc}".format(urlsplit(url))
robots = robots_icin(site, session)

if robots.can_fetch(BOT_ADI, url):
    bekleme = robots.crawl_delay(BOT_ADI) or 2
    print(f"Taranabilir, istekler arası {bekleme} sn beklenecek")
else:
    print("robots.txt bu adresi kapatıyor, atlanıyor")

print("Site haritaları:", robots.site_maps())

Örnekteki iki ayrıntı önemlidir: can_fetch fonksiyonuna tam User-Agent dizesi değil, yalnızca bot adı verilir; ve dosya her site için bir kez indirilip bellekte tutulur, her sayfada yeniden indirilmez.

Joker karakterler ve en uzun eşleşme kuralı sizin için önemliyse, Scrapy'nin kullandığı protego kütüphanesi bu kuralları RFC'ye daha yakın biçimde uygular. Hangi ayrıştırıcıyı kullanırsanız kullanın, hedef sitenin dosyasıyla birkaç adresi elle kontrol ederek sonuçları doğrulayın.

SEO için sık yapılan hatalar

robots.txt, arama motoru görünürlüğünü doğrudan etkilediği için SEO tarafında da sık yanlış yapılandırılır:

  • Canlıya geçişte Disallow: / satırını unutmak. Test ortamında siteyi kapatmak için yazılan satır canlı siteye taşınır ve site aramadan kaybolur.
  • robots.txt ile sayfayı dizinden çıkarmaya çalışmak. Disallow, sayfanın taranmasını engeller, dizine eklenmesini değil. Başka sitelerden bağlantı alan kapalı bir sayfa, içeriği okunmadan yalnızca adresiyle arama sonuçlarında görünebilir. Dizinden çıkarmak için sayfanın taranabilir olması ve noindex taşıması gerekir.
  • CSS ve JavaScript dosyalarını kapatmak. Arama motoru sayfayı doğru görüntüleyemez ve mobil uyumluluk ile içerik değerlendirmesi bozulur.
  • Sonda eğik çizgiyi karıştırmak. Disallow: /blog hem /blog/ klasörünü hem /blogger-rehberi sayfasını kapatır.
  • Büyük-küçük harf farkını atlamak. Yol eşleşmesi büyük-küçük harfe duyarlıdır: Disallow: /Arama, /arama yolunu kapatmaz.
  • Dosyayı alt alan adına koymamak. magaza.ornek.com için ayrı bir robots.txt gerekir.
  • Değişikliğin anında yansıyacağını beklemek. Botlar dosyayı önbellekten okur; değişikliğin etkisi bir güne kadar gecikebilir.

Google'ın robots.txt'yi nasıl yorumladığını, dosya boyutu sınırı ve hata kodlarındaki davranışıyla birlikte Google Search Central belgesi ayrıntılı anlatır. Farklı ülkelerdeki arama sonuçlarının kontrolü tarafında ise SEO proxy çözümümüz sayfasına bakabilirsiniz.

Yapay zeka botları için satırlar

Son yıllarda robots.txt dosyalarına en çok eklenen satırlar, yapay zeka şirketlerinin tarayıcılarına yöneliktir. Bu botların bir kısmı model eğitimi için veri toplar, bir kısmı bir kullanıcının sorusu üzerine anlık olarak sayfa getirir. Sık görülen ürün adları:

  • GPTBot (OpenAI)
  • ClaudeBot (Anthropic)
  • CCBot (Common Crawl)
  • Google-Extended: Ayrı bir tarayıcı değil, Google'ın mevcut botlarının topladığı içeriğin Gemini modellerinde kullanımını kontrol eden bir işarettir; Google Arama'daki görünürlüğü etkilemez.

Örneğin bir site, eğitim amaçlı taramayı kapatıp arama motorlarına açık kalmak için şu satırları ekleyebilir:

text
User-agent: GPTBot
Disallow: /

User-agent: CCBot
Disallow: /

User-agent: Google-Extended
Disallow: /

Şirketler zaman zaman yeni bot adları ekler veya mevcut botların görevlerini ayırır. Bu satırları yazarken ya da bir scraper'ı bu kurallara göre ayarlarken ilgili şirketin güncel belgesini kontrol edin. robots.txt'ye uymayan botlara karşı sitelerin başka katmanlarda aldığı önlemlere bir örnek Cloudflare Precursor yazımızda. Yapay zeka modellerinin web verisini nasıl kullandığına bir örnek de GPT-6 Astra ile Web Scraping yazımızda.

Kendi yapay zeka ajanınızı veya scraper'ınızı yazıyorsanız, ona tanımlı bir ürün adı verin ve robots.txt'yi bu adla okuyun. Site sahibi sizin için özel bir grup yazabilir ve tarama tercihlerini doğrudan size iletebilir.

Kullanım senaryoları

  • Geniş ölçekli tarayıcı: Her alan adı için robots.txt'yi bir kez indirir, önbellekte tutar, her adresi kuyruğa almadan önce kontrol eder. Ölçekleme tarafı web crawler çözümü sayfamızda.
  • Fiyat takip betiği: Sitemap'ten ürün adreslerini alır, robots.txt'nin kapattığı arama ve filtre sayfalarını hiç ziyaret etmez, Crawl-delay değerine uyar. Genel kurgu veri kazıma çözümü sayfamızda.
  • SEO denetimi: Canlıya geçişten önce robots.txt'nin önemli sayfaları kapatmadığını ve site haritası satırının doğru olduğunu kontrol eder.
  • Yapay zeka botlarına politika belirleme: İçerik sahibi, hangi botların siteyi hangi amaçla tarayabileceğine karar verip ilgili satırları ekler.

Bazı siteler robots.txt ile kapattıkları yollara botları çekmek için gizli bağlantılar da yerleştirir; robots.txt'ye uyan bir tarayıcı bu tuzaklardan kendiliğinden uzak durur. Mekanizmayı Honeypot Tuzakları yazımızda anlattık.

Sık yapılan hatalar (scraper tarafı)

  • robots.txt'yi hiç okumamak. Sitenin açıkça belirttiği tercihi bilmeden taramaya başlamak.
  • urllib.robotparser sonucuna körü körüne güvenmek. Kural sırası ve joker karakterlerde yanlış sonuç verebilir.
  • can_fetch fonksiyonuna tam User-Agent dizesi vermek. Bota özel grup bulunamaz.
  • Bota özel grubun * grubuyla birleştiğini varsaymak. Özel grup varsa yalnızca o uygulanır.
  • Dosyayı her istekte yeniden indirmek. Siteye gereksiz yük bindirir; site başına bir kez indirip önbellekte tutun.
  • 5xx yanıtında taramaya devam etmek. Standart, dosyaya ulaşılamadığında sitenin tamamının kapalı sayılmasını ister.
  • Crawl-delay standart değil diye yok saymak. Site sahibinin açık bir hız talebidir.

Karar rehberi

DurumunuzÖneri
Adres Disallow ile kapalıTaramayın
Adres açık, Crawl-delay varİstekler arasında en az o kadar bekleyin
robots.txt 404 dönüyorKısıtlama yok sayılır, site şartlarına yine bakın
robots.txt 5xx dönüyor veya ulaşılamıyorSiteyi kapalı sayın, sonra tekrar deneyin
Dosyada * veya $ joker karakterleri varRFC'ye uygun bir ayrıştırıcı kullanın
Botunuz için özel grup varYalnızca o grubu uygulayın
Site haritası satırı varAdresleri site haritasından alın
Sayfayı arama motorundan kaldırmak istiyorsunuzrobots.txt değil, noindex

Sık sorulan sorular

robots.txt olmayan bir siteyi taramak serbest mi?

robots.txt yoksa sitede tarama kısıtlaması olmadığı varsayılır. Ancak bu, sitenin kullanım şartlarının, hız sınırlarının ve kişisel veri mevzuatının geçerli olmadığı anlamına gelmez.

Disallow ile noindex arasındaki fark nedir?

Disallow botun sayfayı taramasını, yani içeriğini indirmesini engeller. noindex ise sayfanın arama sonuçlarında gösterilmemesini ister ve botun sayfayı okuyabilmesini gerektirir. Bir sayfayı hem Disallow ile kapatıp hem noindex eklerseniz bot noindex etiketini hiç göremez.

Google Crawl-delay satırını okur mu?

Hayır. Google bu satırı desteklemez ve tarama hızını kendi sistemleriyle ayarlar. Diğer bazı arama motorları ve birçok tarayıcı ise bu satırı dikkate alır.

robots.txt dosyası ne kadar büyük olabilir?

RFC 9309, tarayıcıların en az 500 kibibaytlık bir dosyayı işleyebilmesini ister; bu sınırın ötesindeki kurallar göz ardı edilebilir. Pratikte robots.txt dosyaları bunun çok altında kalır ve kısa tutulması hata riskini azaltır.

Yapay zeka botlarını robots.txt ile engelleyebilir miyim?

Kuralları robots.txt'ye uyan botlar için evet; ilgili ürün adıyla bir grup açıp Disallow: / yazmanız yeterlidir. robots.txt'ye uymayan botlar için ise sunucu veya CDN tarafında ek önlemler gerekir.

Scraper'ım için hangi User-agent adını kullanmalıyım?

Botunuzu tanımlayan kısa bir ürün adı ve iletişim adresi içeren bir değer: OrnekFiyatBotu/1.0 (+https://ornek.com/bot-hakkinda). robots.txt'yi kontrol ederken yalnızca OrnekFiyatBotu kısmını kullanın.

Özetle

robots.txt, sitenin kök dizininde duran ve botlara hangi yolları taramamalarını söyleyen dosyadır. Kurallar User-agent gruplarıyla ayrılır; bota özel grup varsa yalnızca o uygulanır, çakışan kurallarda en uzun eşleşme kazanır, * ve $ joker karakter olarak kullanılır. Crawl-delay standart dışıdır ve Google tarafından desteklenmez, ama scraper'lar için açık bir hız talebidir. Python'un urllib.robotparser modülü kural sırası ve joker karakterlerde RFC'den ayrılır; dosyayı kendi istemcinizle indirip sonuçları doğrulayın. Kurallara uygun veri toplama işleriniz için proxy hizmetlerimize göz atabilirsiniz.

ChatGPT'ye sorClaude'a sor