---
title: "Sitemap Nasıl Bulunur? Bir Sitenin Tüm Sayfalarını Görmek"
description: "Sitemap'i bulmak için önce robots.txt'deki Sitemap satırına, sonra /sitemap.xml gibi yollara bakın. Index, .gz ve lastmod'u Python ile okumayı anlatıyoruz."
url: https://proxynet.io/tr/blog/find-website-sitemap
date: 2026-09-24
author: "Acar Diveroli"
category: "Web Scraping, Nasıl Yapılır"
lang: tr
---

# Sitemap Nasıl Bulunur? Bir Sitenin Tüm Sayfalarını Görmek

Bir rakibin online mağazasındaki bütün ürün sayfalarının listesine ihtiyacınız var. Kategorileri tek tek tıklayarak gezmek saatler ve binlerce istek demek. Oysa site sahibi bu listeyi arama motorları için tek bir XML dosyasında zaten yayımlıyor olabilir: sitemap (site haritası), yani sitenin taranmasını istediği adresleri sıralayan dosya. Bu dosyayı bulursanız bir sitenin tüm sayfalarını birkaç istekle görebilirsiniz.

Bu yazıda sitemap'i nerede ve hangi sırayla arayacağınızı, dosyanın nasıl okunduğunu, index ve `.gz` dosyalarının nasıl açıldığını ve `lastmod` ile yalnız değişen sayfaları nasıl seçeceğinizi anlatıyoruz. Sonda test ettiğimiz bir Python betiği var; sitemap'in neden hiçbir zaman sitenin tamamını göstermediğini ve sitemap yoksa ne yapılacağını da ele alıyoruz. Crawler tasarımının genel resmi için [web crawler](/tr/web-crawler) sayfamıza bakabilirsiniz.

> **Not: Kısa cevap**
>
> Alan adında `/robots.txt` dosyasını açın ve `Sitemap:` ile başlayan satırlara bakın; bu satırlar sitemap'in tam adresini verir ve birden fazla olabilir. Böyle bir satır yoksa `/sitemap.xml`, `/sitemap_index.xml` ve WordPress sitelerinde `/wp-sitemap.xml` yollarını deneyin. Kök etiketi `<sitemapindex>` olan dosya sayfaları değil, başka sitemap'leri listeler; `.gz` dosyaları gzip ile sıkıştırılmıştır. Sayfa adresleri `<loc>`, değişiklik tarihleri `<lastmod>` etiketinde durur. Sitemap sitenin tamamı değil, sahibinin seçtiği listedir ve ikisi çeliştiğinde robots.txt geçerlidir.

## Bir sitenin sitemap'i nasıl bulunur?

Şu yerlere sırayla bakın. Her adım yalnız bir istek harcar.

1. **robots.txt'deki `Sitemap:` satırları.** `https://example.com/robots.txt` adresini açın. Site sahipleri her sitemap'in tam adresini buraya yazar. RFC 9309, crawler'ların bu satırları robots.txt protokolünün dışında kalan ayrı bir kayıt olarak okumasına izin verir ([bölüm 2.2.4](https://www.rfc-editor.org/rfc/rfc9309.html#section-2.2.4)); söz diziminin geri kalanını [robots.txt Dosyası Nedir, Nasıl Okunur?](/tr/blog/robots-txt) yazımızda bulabilirsiniz.
2. **Kök dizindeki yollar.** Önce `/sitemap.xml`, sonra `/sitemap_index.xml` adresini deneyin. Sitemap üreten araçların çoğu bu ikisinden birini kullanır.
3. **Platformun yolu.** WordPress çekirdeği 5.5 sürümünden beri `/wp-sitemap.xml` adresinde bir index yayımlar ve bunu robots.txt'ye ekler ([WordPress 5.5 duyurusu](https://make.wordpress.org/core/2020/07/22/new-xml-sitemaps-functionality-in-wordpress-5-5/)). Yoast gibi SEO eklentileri bunun yerine kendi index'lerini koyar, genellikle `/sitemap_index.xml`. Shopify `/sitemap.xml` sunar; bu dosya ürünler, koleksiyonlar, bloglar ve sayfalar için ayrı sitemap'lere bağlanır.
4. **HTML site haritası.** Alt bilgideki "Site haritası" sayfası insanlar için yazılır ama sitenin ana bölümlerini gösterir.
5. **Kendi siteniz için Search Console.** Site haritaları raporu gönderdiğiniz dosyaları ve Google'ın her dosyada kaç URL keşfettiğini listeler.

Google'a elle bir kez yazılan `site:example.com filetype:xml` araması da işe yarayabilir. Bunu otomatikleştirmeyin: Google betikle gönderilen sorguları olağandışı trafik sayar ([Google Olağandışı Trafik Hatası](/tr/blog/google-unusual-traffic-error)).

## Sitemap dosyası nasıl okunur: urlset, sitemapindex ve lastmod

İki sayfalık bir sitemap şöyle görünür:

```xml
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
  <url>
    <loc>https://example.com/product/1</loc>
    <lastmod>2026-09-21T12:00:00+00:00</lastmod>
  </url>
  <url>
    <loc>https://example.com/product/2?colour=red&amp;size=m</loc>
  </url>
</urlset>
```

[Sitemap protokolü](https://www.sitemaps.org/protocol.html) yalnız `<loc>` etiketini zorunlu tutar; `<lastmod>`, `<changefreq>` ve `<priority>` isteğe bağlıdır. Google son ikisini yok sayar ve `lastmod` değerini yalnız "tutarlı ve doğrulanabilir biçimde" doğru olduğunda kullanır ([Google Search Central](https://developers.google.com/search/docs/crawling-indexing/sitemaps/build-sitemap)). Başkasının dosyasını okurken dört kural daha işinize yarar:

- Bir dosya en fazla 50.000 URL ve sıkıştırılmamış hâlde 50 MB (52.428.800 bayt) tutar.
- Dosya UTF-8'dir ve `&` karakteri `&amp;` diye yazılır. XML ayrıştırıcı (parser) bunu geri çevirir, düzenli ifade (regex) çevirmez.
- `/catalog/sitemap.xml` adresindeki bir sitemap yalnız `/catalog/` altındaki adresleri listeleyebilir.
- `<xhtml:link hreflang="…">` satırları bir sayfanın dil sürümlerini gösterir; bunlar `<loc>` kaydı değildir.

## Sitemap'ten her URL'ye nasıl ulaşılır?

Bir alan adını URL listesine çeviren betik şöyle çalışır:

1. robots.txt'yi bir kez indirin; kurallarını ve `Sitemap:` satırlarını saklayın.
2. `Sitemap:` satırı yoksa yaygın yolları deneyin ve ilk `200` yanıtında durun.
3. Dosyayı indirin. İlk iki baytı `1f 8b` ise gzip ile açın.
4. Kök elemana bakın. `sitemapindex` ise her alt `<loc>` için 3. adımı tekrarlayın; `urlset` ise kayıtları toplayın.
5. Bir tarih sınırı varsa eski kayıtları atın ve index'teki `lastmod` değeri sınırdan eski olan alt dosyaları hiç açmayın.
6. Her adresi robots.txt'ye göre kontrol edin ve kapalı olanları atlayın.
7. Tekrarları temizleyin ve kalanları kuyruğa ekleyin. Yarıda kalan bir çalışmanın kaldığı yerden sürmesi için kuyruğu diskte tutmayı [Sayfalama (Pagination) Nedir, Scraping'de Nasıl Taranır?](/tr/blog/pagination-web-scraping) yazımızda anlattık.

Crawler da aynı türden bir listeyi bağlantıları izleyerek çıkarır: her sayfa için bir istek atar, derinlik ve tekrar kurallarına uyar. İki yaklaşımın farkını [Web Scraping ve Web Crawling Farkı Nedir?](/tr/blog/web-scraping-vs-web-crawling) yazısında açıkladık.

## URL keşif yöntemleri yan yana

| Yöntem | Siteye yük | Ne gösterir | Değişiklik bilgisi | Ne zaman kullanılır |
|---|---|---|---|---|
| XML sitemap | Çok düşük: birkaç dosya | Sahibinin taranmasını istediği adresler; eksik olabilir | Doğruysa `lastmod` | Her zaman ilk sırada |
| RSS ya da Atom feed | Çok düşük | Yalnız yeni içerik | Yayın tarihleri | Blog, haber, yeni ilanlar |
| Resmi API ya da dışa aktarma | Düşük, sınırları belgelenmiş | API'nin sunduğu kadarı | Çoğunlukla var | Sunuluyorsa; HTML'den önce |
| Bağlantı izleme | Yüksek: sayfa başına bir istek | Bağlantı verilen her şey, tuzaklar ve tekrarlar dahil | Yok | Sitemap yoksa ya da eksikse; derinlik sınırıyla |
| Wayback CDX API | Yok (istekler arşive gider) | Arşivlenmiş adresler; bazıları artık yok | Arşive alınma tarihi | Sitemap yoksa; aday liste için |
| Google Search Console | Yok | Google'ın bildiği sayfalar | Tarama ve dizine ekleme durumu | Yalnız kendi siteniz |

Sitemap bu yüzden ilk sırada: birkaç istekle adreslerin çoğu elinizde olur.

## Sitemap index'i ve .gz dosyaları nasıl açılır?

Büyük siteler listelerini türe göre böler. Index'in kök elemanı `<sitemapindex>` olur ve her alt dosya için bir `<sitemap>` elemanı içerir; her birinde bir `<loc>` ve isteğe bağlı bir `<lastmod>` bulunur. Google'ın [büyük sitemap'ler](https://developers.google.com/search/docs/crawling-indexing/sitemaps/large-sitemaps) rehberi alt dosyaların aynı sitede, index'in bulunduğu dizinde ya da onun altında durmasını şart koşar. Betik yine de açtığı dosyaları hatırlamalı; böylece kendine bağlanan bir index onu döngüye sokamaz.

Sıkıştırılmış dosyalar genellikle `.xml.gz` ile biter ve sunucular bunları çoğunlukla `Content-Encoding` header'ı olmadan `application/gzip` türüyle gönderir. Bu header, yanıt gövdesinin nasıl sıkıştırıldığını istemciye bildirir. Header olmayınca Requests size sıkıştırılmış baytları olduğu gibi verir; yerel testimizde gövde, gzip imzası olan `1f 8b` ile başladı. Bu iki baytı kontrol etmek, dosyanın adı ne olursa olsun işe yarar.

50 MB sınırı sıkıştırılmamış dosya için geçerlidir, bu yüzden okumayı orada kesin. Böylece sıkıştırma bombasına (decompression bomb), yani açıldığında gigabaytlara büyüyen küçük bir dosyaya karşı da korunursunuz. Python'ın [XML güvenlik notları](https://docs.python.org/3/library/xml.html) bu saldırıyı entity genişletme saldırılarının yanında sayar.

## lastmod ile yalnız değişen sayfaları çekmek

`lastmod` W3C Datetime biçimini kullanır: yalnız tarih (`2026-09-20`) ya da saat ve saat dilimiyle birlikte tarih (`2026-09-20T10:00:00+03:00`). Python 3.11'den itibaren `datetime.fromisoformat()` ikisini de, sondaki `Z` dahil okur. Saat dilimi olmayan değerleri UTC sayın; böylece bütün tarihler birbiriyle karşılaştırılabilir.

Son çalışmanızdan beri değişen kayıtları ve `lastmod` değeri eksik ya da bozuk olan kayıtları tutun, çünkü bunların aynı kaldığını gösteren bir şey yok. Index'te `lastmod` her alt dosyanın ne zaman değiştiğini söyler, bu yüzden eski bir alt dosya indirilmeden atlanabilir. 30 günlük sınırla yaptığımız testte betik, en son Ocak 2025'te değişen bir dosyayı atladı ve dört yerine üç istek yaptı.

Tarihlerin bir anlam taşıyıp taşımadığı siteye bağlıdır:

- **Her yerde aynı tarih ve saat:** sitemap her derlemede yeniden üretiliyordur ve tarih sayfalar hakkında bir şey söylemez.
- **Hiç tarih yok:** 24 Eylül 2026'da docs.python.org sitemap'indeki kayıtların hiçbirinde `lastmod` yoktu.
- **Yalnız bazı kayıtlarda tarih:** WordPress çekirdeği index'indeki dosyalar için `lastmod` yazmaz, bu yüzden her alt dosyayı açmanız gerekir. WordPress 6.5'ten beri yazı kayıtlarında bu alan var; kategori, etiket ve yazar sitemap'lerinde yok.

`lastmod` işe yaramadığında koşullu istekleri ve `304 Not Modified` yanıtını kullanın; bunları [Web Scraping'de Engellenmeden Veri Toplama Yöntemleri](/tr/blog/web-scraping-without-getting-blocked) yazısında anlattık.

## Sitemap neden sitenin gerçekte sunduğundan farklıdır?

Google, gönderilen bir sitemap'i "yalnızca bir ipucu" olarak görür. Beş tür fark bekleyin:

1. **Eksik sayfalar.** 24 Eylül 2026'da `docs.python.org/sitemap.xml` 8 URL listeliyordu, her Python sürümü için bir başlangıç sayfası. Oysa site binlerce sayfa sunuyor.
2. **Eskimiş kayıtlar.** Silinen ürünler listede kalır ve `404` ya da `410` döner. Bunları listenizden çıkarın.
3. **robots.txt çelişkileri.** Bir adres sitemap'te bulunup robots.txt'de kapalı olabilir. robots.txt site sahibinin açık kuralıdır, o yüzden adresi atlayın; testimizde listedeki bir arama sayfası bu şekilde atlandı.
4. **Kapsam.** Alt dizindeki bir sitemap yalnız o dizini kapsar ve her alt alan adının kendi robots.txt'si ve sitemap'i vardır.
5. **Varyantlar.** Takip parametreleri, dil alternatifleri ve canonical etiketi başka bir adresi gösteren sayfalar da listede çıkar. Hangi sürüme ihtiyacınız olduğuna karar verin.

Sitemap gizli sayfaları değil, bilerek yayımlanan sayfaları listeler; yalnız giriş yapılarak açılan sayfalar ve `noindex` sayfalar bu yöntemin dışında kalır. İşin hukuki tarafını [Web Scraping (Web Kazıma) Yasal mı?](/tr/blog/web-scraping-legal) yazısında ele aldık.

## Sitenin sitemap'i yoksa ne yapılır?

Sitemap zorunlu değildir. Bu durumda sırasıyla şu meşru seçeneklere bakın:

1. **Feed.** WordPress `/feed/` adresinde bir feed sunar, birçok site de kendi feed'ini sayfanın `<head>` bölümündeki `<link rel="alternate">` etiketiyle duyurur. Yeni içerik için sitemap kadar iş görür.
2. **Resmi API ya da dışa aktarma.** Biçimi ve sınırları belgelidir. [Cloudflare Scraper: Neden Engellenir, Veriye Nasıl Ulaşılır?](/tr/blog/cloudflare-scraper) yazısındaki birinci yola bakın.
3. **Kategori sayfalarından bağlantı izleme.** Derinlik sınırı ve sayfa tavanı koyun; yöntemi yukarıda linkini verdiğimiz crawling yazısında anlattık.
4. **Wayback Machine CDX API.** `https://web.archive.org/cdx/search/cdx?url=example.com/blog/&matchType=prefix&collapse=urlkey&fl=original&limit=500` gibi bir sorgu, bir yolun altındaki arşivlenmiş adresleri listeler ([CDX sunucu dokümantasyonu](https://github.com/internetarchive/wayback/blob/master/wayback-cdx-server/README.md)). `docs.python.org/3/library/` için aldığımız sonuçta `2to3.html` da vardı; Python 2to3'ü kaldırdığı için bu adres artık yönlendiriyor. Her adresi kontrol edin ve arşive de yük bindirmemek için `limit` parametresini kaldırmayın.
5. **Search Console'daki Sayfalar raporu.** Yalnız kendi siteniz için.

Kelime listeleriyle yol tahmin etmeyi, Google sonuçlarını otomatik kazımayı ya da giriş gerektiren alanlara girmeyi önermiyoruz. Site başına istek hızını düşük tutun.

## Python ile sitemap okuma: çalışan bir örnek

Betik Python 3.11 veya üstü, Requests ve lxml ister (`pip install requests lxml`).

```python
"""Bir sitenin sitemap'ini bulur, index ve .gz dosyalarını açar, URL'leri listeler.

Kullanım: python read_sitemap.py https://example.com [GÜN]
GÜN verilirse yalnız son GÜN günde değişen (ya da kullanılabilir tarihi olmayan) URL'ler listelenir.
"""
import gzip
import io
import os
import sys
import time
from datetime import datetime, timedelta, timezone
from functools import lru_cache
from urllib.parse import urljoin
from urllib.robotparser import RobotFileParser

import requests
from lxml import etree

BOT_NAME = "ExampleSitemapReader"
USER_AGENT = f"{BOT_NAME}/1.0 (+mailto:bots@example.com)"
DELAY = 1.0                        # her istekten önce beklenecek saniye
LIMIT = 50 * 1024 * 1024           # sitemaps.org: sıkıştırılmamış hâlde en fazla 50 MB
CANDIDATES = ["/sitemap.xml", "/sitemap_index.xml", "/wp-sitemap.xml"]

session = requests.Session()
session.headers["User-Agent"] = USER_AGENT
if os.environ.get("PROXY_URL"):    # ör. http://user:pass@pr.proxynet.io:8000
    session.proxies = {"http": os.environ["PROXY_URL"], "https": os.environ["PROXY_URL"]}

xml_parser = etree.XMLParser(resolve_entities=False, no_network=True)

@lru_cache(maxsize=16)             # bir çalışmada aynı dosyayı iki kez indirme
def fetch(url):
    time.sleep(DELAY)
    resp = session.get(url, timeout=(5, 30))
    resp.raise_for_status()
    data = resp.content
    if data[:2] == b"\x1f\x8b":    # gzip: dosya adına değil, ilk iki bayta güven
        with gzip.GzipFile(fileobj=io.BytesIO(data)) as gz:
            data = gz.read(LIMIT + 1)
    if len(data) > LIMIT:
        raise ValueError(f"{url} is larger than 50 MB uncompressed")
    return data

def read_robots(site):
    robots = RobotFileParser()
    try:
        lines = fetch(urljoin(site, "/robots.txt")).decode("utf-8", "replace").splitlines()
    except requests.HTTPError as err:
        if err.response.status_code >= 500:
            lines = ["User-agent: *", "Disallow: /"]  # RFC 9309: sunucu hatası, siteye girme
        else:
            lines = []                                # 4xx: robots.txt yok, kural da yok
    robots.parse(lines)
    return robots

def find_sitemaps(site, robots):
    if robots.site_maps():
        return robots.site_maps()
    for path in CANDIDATES:
        url = urljoin(site, path)
        if not robots.can_fetch(BOT_NAME, url):
            continue
        try:
            fetch(url)
        except requests.HTTPError:
            continue
        return [url]
    return []

def parse_date(text):
    if not text:
        return None
    try:
        when = datetime.fromisoformat(text)  # 2026-09-20, 2026-09-20T10:00:00+03:00 ya da ...Z
    except ValueError:
        return None                          # bozuk tarih: bilinmiyor say
    return when if when.tzinfo else when.replace(tzinfo=timezone.utc)

def name(el):
    return etree.QName(el).localname         # namespace olmadan etiket adı

def read_sitemap(url, since, seen):
    if url in seen:
        return
    seen.add(url)
    try:
        root = etree.fromstring(fetch(url), xml_parser)
    except (requests.RequestException, etree.XMLSyntaxError, ValueError) as err:
        print(f"skipped {url}: {err}", file=sys.stderr)
        return
    is_index = name(root) == "sitemapindex"
    for entry in root.iterchildren(etree.Element):          # yalnız elemanlar, yorumlar hariç
        fields = {name(f): (f.text or "").strip() for f in entry.iterchildren(etree.Element)}
        loc, lastmod = fields.get("loc"), parse_date(fields.get("lastmod"))
        if not loc:
            continue
        if is_index:
            if since and lastmod and lastmod < since:
                continue                     # bu dosyada sınırdan sonra değişen bir şey yok
            yield from read_sitemap(loc, since, seen)
        elif since is None or lastmod is None or lastmod >= since:
            yield loc, lastmod

if __name__ == "__main__":
    site = sys.argv[1]
    days = int(sys.argv[2]) if len(sys.argv) > 2 else None
    since = datetime.now(timezone.utc) - timedelta(days=days) if days else None
    robots = read_robots(site)
    seen, listed = set(), set()
    for sitemap in find_sitemaps(site, robots):
        for loc, lastmod in read_sitemap(sitemap, since, seen):
            if loc in listed:
                continue
            listed.add(loc)
            if robots.can_fetch(BOT_NAME, loc):
                print(lastmod.date() if lastmod else "-", loc)
            else:
                print("disallowed by robots.txt, skipped:", loc, file=sys.stderr)
```

### Betiğin yaptıkları ve dışarıda bıraktıkları

- **Tek istemci, düşük hız.** Tek bir oturum (session) her istekten önce bir saniye bekler ve bot adı ile iletişim adresi taşıyan dürüst bir `User-Agent` gönderir ([User-Agent Nedir, Nasıl Öğrenilir ve Değiştirilir?](/tr/blog/what-is-user-agent)).
- **robots.txt kendi istemcinizle indirilir.** Dosya `RobotFileParser.parse()` metoduna verilir, çünkü `read()` onu urllib'in varsayılan kimliğiyle indirirdi. RFC 9309'un istediği gibi `4xx` "kural yok", `5xx` "siteye girme" anlamına gelir. `site_maps()`, `Sitemap:` satırlarını ya da `None` döndürür ([Python dokümantasyonu](https://docs.python.org/3/library/urllib.robotparser.html)); `can_fetch()` ise tam `User-Agent` metnini değil, bot adını alır.
- **Güvenli ayrıştırma.** `resolve_entities=False` ve `no_network=True`, lxml'in entity'leri genişletmesini ya da uzaktan bir şey yüklemesini engeller; testimizde iç içe entity'lerden kurulmuş bir `<loc>` boş döndü. `localname` namespace farklarını yok sayar.
- **Yeniden deneme ve paralel istek bilerek yok.** `429` ve `Retry-After` için [Scraping'de HTTP Hata Kodları: 403, 407, 429 ve 503](/tr/blog/http-status-codes-web-scraping), paralel istekler için [Concurrency ve Parallelism](/tr/blog/concurrency-vs-parallelism) yazısına bakın.

Betiği Python 3.13.9, Requests 2.34.2 ve lxml 6.1.3 ile yerel bir siteye karşı çalıştırdık. Sitede `/search/` yolunu kapatan bir robots.txt, bir index, `Content-Encoding` olmadan gönderilen gzip'li bir ürün sitemap'i ve Ocak 2025 tarihli bir sayfa sitemap'i vardı. 30 günlük sınırla çıktı şöyle:

```text
$ python read_sitemap.py http://127.0.0.1:18766 30
disallowed by robots.txt, skipped: http://127.0.0.1:18766/search/?q=x
2026-09-21 http://127.0.0.1:18766/product/1
- http://127.0.0.1:18766/product/3
- http://127.0.0.1:18766/product/4?colour=red&size=m
```

Mart ayında değişen `product/2` sınırın dışında kaldı; `product/3` (tarihsiz) ve `product/4` (bozuk tarih) listede kaldı, `&amp;` da `&` olarak çıktı. Sayfa sitemap'i hiç istenmedi. robots.txt olmadığında betik index'i ikinci aday yolda buldu. docs.python.org'a karşı iki istek yaptı ve 8 URL yazdırdı; aynı çalışma `PROXY_URL` tanımlıyken yerel bir HTTP proxy üzerinden de aynı listeyi verdi.

Sitemap okumak için proxy gerekmez. Koddaki proxy satırı bir sonraki aşama için: listedeki sayfaları başka bir ülkedeki ziyaretçilerin gördüğü gibi kontrol etmek. O aşamada bir [Residential Proxy](https://proxynet.io/tr/residential-proxy) size aynı düşük hızda yerel adresler verir.

Hazır bir kütüphane tercih ederseniz `ultimate-sitemap-parser` (PyPI'da 1.8.1) sitemap'leri robots.txt ve yaygın dosya adları üzerinden bulur ve `sitemap_tree_for_homepage()` ile ağacı dolaşır. Scrapy'nin `SitemapSpider` sınıfı iç içe sitemap'leri izler ve robots.txt'den başlayabilir ([Scrapy Nedir ve Proxy ile Nasıl Kullanılır?](/tr/blog/scrapy-proxy)).

## Kullanım alanları

- **Fiyat takibi:** ürün URL'lerini sitemap'ten alın ve yalnız değişenleri yeniden çekin ([E-Ticarette Rakip Fiyat Takibi Nasıl Yapılır?](/tr/blog/competitor-price-tracking)).
- **Kendi sitenizin SEO denetimi:** her sitemap URL'sinin `200` döndüğünü ve hiçbirinin robots.txt'de kapalı olmadığını doğrulayın, sonra sayfaların başka ülkelerden nasıl göründüğüne bakın ([SEO proxy](/tr/seo-proxy)).
- **Büyük taramalar:** sitemap'ten başlayın ve tuzak bağlantılardan uzak durun ([Honeypot Tuzakları](/tr/blog/honeypot-traps)).
- **Tek seferlik veri çekme:** alanları çekmeden önce URL listesini hazırlayın ([Web Sitesinden Veri Çekme](/tr/blog/extract-data-from-website)).
- **Değişiklik izleme:** bir günlük sınırla her gün çalışan betik yeni ilanları ya da yazıları gösterir ([web crawler](/tr/web-crawler)).

## Sık yapılan hatalar

- **Yalnız `/sitemap.xml` denemek.** robots.txt çoğu zaman başka bir dosyayı gösterir.
- **Yalnız ilk `Sitemap:` satırını okumak.** Her satır ayrı bir sitemap gösterir.
- **Index'i sayfa listesi sanmak.** Onun `<loc>` değerleri sayfa değil, sitemap adresidir.
- **gzip'i dosya adından anlamaya çalışmak.** İlk iki bayta bakın.
- **`lastmod` değeri olmayan kayıtları atmak.** Değişenler tam da onlar olabilir.
- **Her kayıtta aynı olan `lastmod` değerine güvenmek.** Bu tarih sayfanın değil, derlemenin zamanıdır.
- **Sitemap'te var diye bir URL'yi çekmek.** robots.txt yine geçerlidir.
- **XML'i düzenli ifadelerle ayrıştırmak.** `&amp;` kaçışlı hâlde kalır.
- **Her çalışmada bütün alt dosyaları indirmek.** Index'teki `lastmod` değerini kullanın. Bağlantılar hata veriyorsa [Max Retries Exceeded With URL Hatası](/tr/blog/max-retries-exceeded-with-url) yazısına bakın.

## Karar rehberi

| İhtiyaç | Öneri |
|---|---|
| Bir sitenin sitemap adresini hızlıca bulmak | `/robots.txt`, sonra `/sitemap.xml` ve `/sitemap_index.xml` |
| WordPress sitesinin sitemap'i | `/wp-sitemap.xml`; SEO eklentisi varsa `/sitemap_index.xml` |
| Binlerce adresi liste hâlinde almak | Index ve gzip açan bir betik ya da `ultimate-sitemap-parser` |
| Yalnız son çalışmadan beri değişen sayfalar | `lastmod` sınırı; tarihlerin işe yaramadığı yerde koşullu istek |
| robots.txt'de kapalı bir sitemap URL'si | Atlayın |
| Sitemap yok | Feed ve API, sonra sınırlı bağlantı izleme ya da Wayback CDX |
| Kendi sitenizin bütün sayfaları | Search Console'daki Sayfalar ve Site haritaları raporları |
| Sitemap URL'lerini büyük ölçekte düzenli taramak | Proxy havuzuyla çalışan bir crawler kurulumu ([web crawler](/tr/web-crawler), [Rotating Proxy](https://proxynet.io/tr/rotating-proxy)) |

## Sıkça sorulan sorular

### Bir sitenin sitemap'i nasıl görüntülenir?

Tarayıcıya alan adını ve ardından `/robots.txt` yazın, `Sitemap:` satırındaki adresi açın. Böyle bir satır yoksa `/sitemap.xml` ve `/sitemap_index.xml` adreslerini deneyin. `.gz` uzantılı dosya indirilir ve önce açılması gerekir.

### Her sitenin sitemap'i var mı?

Hayır. Sitemap isteğe bağlıdır ve iç bağlantıları iyi kurulmuş küçük siteler çoğu zaman sitemap yayımlamaz. Sitemap yoksa feed, API, sınırlı bağlantı izleme ya da Wayback CDX API kullanın.

### sitemap.xml ile sitemap_index.xml arasındaki fark nedir?

`sitemap_index.xml` genellikle başka sitemap'leri listeleyen bir index'tir. Yine de bunu dosya adı belirlemez: dosyayı açın ve kök elemana bakın. `<urlset>` sayfaları, `<sitemapindex>` ise sitemap'leri tutar.

### Sitemap'te olmayan sayfalar nasıl bulunur?

Bilinen sayfalardan bağlantı izleyin, feed'i okuyun, API'yi kullanın ya da Wayback CDX API'yi sorgulayın, ardından arşivlenmiş adresleri tek tek kontrol edin. Kelime listeleriyle yol tahmin etmeyi önermiyoruz. Bağlantı izlemeyi [Web Scraping ve Web Crawling Farkı Nedir?](/tr/blog/web-scraping-vs-web-crawling) yazısında anlattık.

### lastmod'a güvenilir mi?

Siteye göre değişir. Her kayıtta aynı tarih varsa sitemap her derlemede yeniden üretiliyordur. WordPress çekirdeği index'inde ve kategori ile yazar sitemap'lerinde `lastmod` yazmaz. Tarihlerin işe yaramadığı yerde koşullu istek gönderin; sunucu değişmeyen sayfalar için `304` döner.

### Sitemap'teki bir URL robots.txt'de engelliyse ne yapmalı?

Atlayın. robots.txt site sahibinin crawler'lara verdiği açık kuraldır, sitemap ise yalnız bir listedir. Yukarıdaki betik her adresi yazdırmadan önce `can_fetch()` ile kontrol eder; ayrıntılar [robots.txt Dosyası Nedir, Nasıl Okunur?](/tr/blog/robots-txt) yazısında.

## Özet

Sitemap'i önce robots.txt'de, sonra `/sitemap.xml`, `/sitemap_index.xml` ve platformun kendi yolunda arayın. Index ve gzip dosyalarını açın, yalnız değişenleri tutmak için `lastmod` değerini kullanın ve robots.txt ile sitemap çeliştiğinde her seferinde robots.txt'ye uyun. Sitemap yoksa feed, API, sınırlı bağlantı izleme ve Wayback CDX API'ye geçin. Liste günde binlerce sayfaya çıktığında bu taramayı büyük ölçekte nasıl yürüteceğinizi [web crawler](/tr/web-crawler) sayfamızda bulabilirsiniz.
