---
title: "Como encontrar o sitemap de um site e ver todas as páginas"
description: "Veja primeiro a linha Sitemap do robots.txt e depois caminhos comuns como /sitemap.xml. Mostramos como ler índices, arquivos .gz e lastmod com Python."
url: https://proxynet.io/pt-br/blog/find-website-sitemap
date: 2026-09-24
author: "Acar Diveroli"
category: "Web scraping, Tutoriais"
lang: pt-BR
---

# Como encontrar o sitemap de um site e ver todas as páginas

Você precisa de uma lista com todas as páginas de produto da loja online de um concorrente. Clicar em cada categoria levaria horas e custaria milhares de requisições. Talvez o dono já publique essa lista para os mecanismos de busca em um único arquivo XML: o sitemap, um arquivo que lista os endereços que o site quer ver rastreados. Encontrá-lo permite ver todas as páginas de um site com poucas requisições.

Este guia mostra onde procurar um sitemap e em que ordem, como ler o arquivo, como abrir índices e arquivos `.gz` e como usar o `lastmod` para pegar só as páginas que mudaram. No fim há um script em Python testado, a explicação de por que um sitemap nunca mostra o site inteiro e o que fazer quando ele não existe. Para o quadro mais amplo de como um crawler é projetado, veja a nossa página de [web crawler](/pt-br/web-crawler).

> **Nota: Resposta rápida**
>
> Abra `/robots.txt` no domínio e procure linhas que começam com `Sitemap:`; elas trazem o endereço completo do sitemap, e pode haver várias. Sem essa linha, tente `/sitemap.xml`, `/sitemap_index.xml` e, no WordPress, `/wp-sitemap.xml`. Um arquivo com a raiz `<sitemapindex>` lista outros sitemaps, não páginas, e arquivos `.gz` são compactados com gzip. Os endereços das páginas ficam em `<loc>`, e as datas de alteração, em `<lastmod>`. Um sitemap é a lista que o dono escolheu, não o site inteiro, e o robots.txt prevalece sobre ele.

## Como encontrar o sitemap de um site?

Tente estes lugares nesta ordem. Cada passo custa uma requisição.

1. **As linhas `Sitemap:` do robots.txt.** Abra `https://example.com/robots.txt`. Os donos listam ali o endereço completo de cada sitemap. A RFC 9309 permite que os crawlers leiam essas linhas como um registro fora do protocolo robots.txt ([seção 2.2.4](https://www.rfc-editor.org/rfc/rfc9309.html#section-2.2.4)); o resto da sintaxe está em [O que é robots.txt e como ler o arquivo?](/pt-br/blog/robots-txt).
2. **Os caminhos na raiz.** Tente `/sitemap.xml` e depois `/sitemap_index.xml`. A maioria dos geradores usa um dos dois.
3. **O caminho da plataforma.** Desde a versão 5.5, o núcleo do WordPress publica um índice em `/wp-sitemap.xml` e o acrescenta ao robots.txt ([anúncio do WordPress 5.5](https://make.wordpress.org/core/2020/07/22/new-xml-sitemaps-functionality-in-wordpress-5-5/)). Plugins de SEO como o Yoast o substituem pelo próprio índice, em geral `/sitemap_index.xml`. A Shopify serve `/sitemap.xml`, que aponta para sitemaps separados de produtos, coleções, blogs e páginas.
4. **O mapa do site em HTML.** Uma página "Mapa do site" no rodapé é feita para pessoas, mas mostra as seções principais.
5. **O Search Console, para o seu próprio site.** O relatório Sitemaps lista o que você enviou e quantas URLs o Google descobriu em cada arquivo.

Uma busca `site:example.com filetype:xml` digitada à mão no Google, uma única vez, também pode ajudar. Não a automatize: o Google trata consultas feitas por script como tráfego incomum ([Tráfego incomum no Google](/pt-br/blog/google-unusual-traffic-error)).

## Como ler um arquivo de sitemap: urlset, sitemapindex e lastmod

Um sitemap com duas páginas tem esta forma:

```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>
```

O [protocolo de sitemaps](https://www.sitemaps.org/protocol.html) exige apenas `<loc>`; `<lastmod>`, `<changefreq>` e `<priority>` são opcionais. O Google ignora os dois últimos e só usa o `lastmod` quando ele é preciso de forma "consistente e verificável" ([Google Search Central](https://developers.google.com/search/docs/crawling-indexing/sitemaps/build-sitemap?hl=pt-br)). Outras quatro regras importam quando você lê o arquivo de outra pessoa:

- Um arquivo tem no máximo 50.000 URLs e 50 MB (52.428.800 bytes) sem compressão.
- O arquivo é UTF-8, e `&` é escrito como `&amp;`. Um parser XML converte de volta; uma expressão regular, não.
- Um sitemap em `/catalog/sitemap.xml` só pode listar endereços que ficam sob `/catalog/`.
- As linhas `<xhtml:link hreflang="…">` apontam para as versões da página em outros idiomas; elas não são entradas `<loc>`.

## Como ir de um sitemap a todas as URLs?

Um script que transforma um domínio em uma lista de URLs funciona assim:

1. Baixe o robots.txt uma vez; guarde as regras e as linhas `Sitemap:`.
2. Se não houver linha `Sitemap:`, tente os caminhos comuns e pare no primeiro `200`.
3. Baixe o arquivo. Se os dois primeiros bytes forem `1f 8b`, descompacte-o com gzip.
4. Verifique o elemento raiz. Para `sitemapindex`, repita o passo 3 para cada `<loc>` filho; para `urlset`, colete as entradas.
5. Com uma data de corte, descarte as entradas mais antigas e pule os arquivos filhos cujo `lastmod` no índice seja anterior ao corte.
6. Confira cada endereço com o robots.txt e pule os bloqueados.
7. Remova as duplicatas e coloque o resto na fila. Como manter a fila em disco para que uma execução interrompida possa continuar está em [O que é paginação e como percorrer todas as páginas?](/pt-br/blog/pagination-web-scraping).

Um crawler monta o mesmo tipo de lista seguindo links, com uma requisição por página e regras de profundidade e de duplicatas. A diferença está explicada em [Web scraping vs. web crawling](/pt-br/blog/web-scraping-vs-web-crawling).

## Métodos de descoberta de URLs lado a lado

| Método | Carga no site | O que mostra | Informação de alteração | Quando usar |
|---|---|---|---|---|
| Sitemap XML | Muito baixa: poucos arquivos | Os endereços que o dono quer rastreados; pode estar incompleto | `lastmod`, se for preciso | Sempre primeiro |
| Feed RSS ou Atom | Muito baixa | Só conteúdo recente | Datas de publicação | Blogs, notícias, novos anúncios |
| API oficial ou exportação | Baixa, com limites documentados | O que a API oferece | Geralmente | Quando existir; antes do HTML |
| Seguir links | Alta: uma requisição por página | Tudo o que tem link, com armadilhas e duplicatas | Nenhuma | Sem sitemap ou com lacunas; com limite de profundidade |
| API CDX da Wayback | Nenhuma (as requisições vão para o arquivo) | Endereços arquivados; alguns já não existem | Data da captura | Sem sitemap; lista de candidatos |
| Google Search Console | Nenhuma | As páginas que o Google conhece | Status de rastreamento e de indexação | Só o seu próprio site |

O sitemap vem primeiro: poucas requisições devolvem a maior parte dos endereços.

## Como abrir índices de sitemap e arquivos .gz?

Sites grandes dividem a lista por tipo. O índice tem `<sitemapindex>` como raiz e um elemento `<sitemap>` para cada arquivo filho, cada um com um `<loc>` e um `<lastmod>` opcional. O guia do Google sobre [sitemaps grandes](https://developers.google.com/search/docs/crawling-indexing/sitemaps/large-sitemaps?hl=pt-br) exige que os arquivos filhos fiquem no mesmo site, no diretório do índice ou abaixo dele. Mesmo assim, um script deve lembrar os arquivos que já abriu, para que um índice que aponta para si mesmo não o prenda em um loop.

Arquivos compactados costumam terminar em `.xml.gz`, e os servidores tendem a enviá-los como `application/gzip`, sem cabeçalho `Content-Encoding`. Nesse caso, o Requests entrega os bytes compactados sem alteração; no nosso teste local, o corpo começava com `1f 8b`, a assinatura do gzip. Verificar esses dois bytes funciona qualquer que seja o nome do arquivo.

O limite de 50 MB vale para o arquivo descompactado, então pare de ler ali. Isso também protege você de uma bomba de descompressão, um arquivo pequeno que se expande para gigabytes; as [notas de segurança de XML](https://docs.python.org/pt-br/3/library/xml.html) do Python a listam ao lado dos ataques de expansão de entidades.

## Usar o lastmod para baixar só as páginas alteradas

O `lastmod` usa o formato W3C Datetime: uma data (`2026-09-20`) ou uma data com hora e fuso horário (`2026-09-20T10:00:00+03:00`). A partir do Python 3.11, `datetime.fromisoformat()` lê as duas formas, inclusive com um `Z` no final. Trate valores sem fuso como UTC, para que todas as datas possam ser comparadas.

Mantenha as entradas alteradas desde a sua última execução e também as entradas com `lastmod` ausente ou inválido: nada indica que elas continuaram iguais. Em um índice, o `lastmod` diz quando cada arquivo filho mudou, então um arquivo filho mais antigo pode ser pulado sem ser baixado. No nosso teste com um corte de 30 dias, o script pulou um arquivo alterado pela última vez em janeiro de 2025 e fez três requisições em vez de quatro.

Saber se as datas significam alguma coisa depende do site:

- **A mesma data e hora em todas as entradas:** o sitemap é recriado a cada deploy, e a data não diz nada sobre as páginas.
- **Nenhuma data:** em 24 de setembro de 2026, nenhuma das entradas do sitemap de docs.python.org tinha `lastmod`.
- **Algumas datas:** o núcleo do WordPress não escreve `lastmod` para os arquivos do seu índice, então é preciso abrir todos os arquivos filhos. Desde o WordPress 6.5, as entradas de posts trazem um; os sitemaps de categorias, tags e autores, não.

Onde o `lastmod` falha, use requisições condicionais e `304 Not Modified`, descritas em [Como fazer web scraping sem ser bloqueado](/pt-br/blog/web-scraping-without-getting-blocked).

## Por que um sitemap difere do que o site realmente serve?

O Google diz que um sitemap enviado é "apenas uma dica". Espere cinco tipos de diferença:

1. **Páginas ausentes.** Em 24 de setembro de 2026, `docs.python.org/sitemap.xml` listava 8 URLs, uma página inicial por versão do Python, enquanto o site serve milhares de páginas.
2. **Entradas desatualizadas.** Produtos excluídos continuam listados e retornam `404` ou `410`. Tire-os da sua lista.
3. **Conflitos com o robots.txt.** Um endereço pode estar no sitemap e bloqueado no robots.txt. O robots.txt é a regra explícita do dono, então pule o endereço; no nosso teste, uma página de busca listada foi pulada dessa forma.
4. **Escopo.** Um sitemap em um subdiretório cobre só esse diretório, e cada subdomínio tem o próprio robots.txt e o próprio sitemap.
5. **Variantes.** Parâmetros de tracking, versões em outros idiomas e páginas cuja tag canonical aponta para outro endereço, tudo isso aparece. Decida de qual versão você precisa.

Um sitemap lista páginas publicadas de propósito, não páginas escondidas; páginas que exigem login e páginas `noindex` ficam fora deste método. O lado jurídico está em [Web scraping é legal? Um panorama](/pt-br/blog/is-data-web-scraping-legal).

## E se o site não tiver sitemap?

Sitemaps são opcionais. Estas são as próximas opções legítimas, em ordem:

1. **Um feed.** O WordPress serve um em `/feed/`, e muitos sites anunciam o seu com `<link rel="alternate">` no head da página. Para conteúdo novo, ele funciona tão bem quanto um sitemap.
2. **Uma API oficial ou uma exportação,** com formato e limite documentados. Veja o caminho 1 em [Cloudflare scraper: por que é bloqueado e o que funciona](/pt-br/blog/cloudflare-scraper).
3. **Seguir links** a partir das páginas de categoria, com um limite de profundidade e um teto de páginas, como mostra o guia de crawling citado acima.
4. **A API CDX da Wayback Machine.** Uma consulta como `https://web.archive.org/cdx/search/cdx?url=example.com/blog/&matchType=prefix&collapse=urlkey&fl=original&limit=500` lista os endereços arquivados sob um caminho ([documentação do servidor CDX](https://github.com/internetarchive/wayback/blob/master/wayback-cdx-server/README.md)). Para `docs.python.org/3/library/`, o nosso resultado incluiu `2to3.html`, que hoje redireciona porque o Python removeu o 2to3. Verifique cada endereço e mantenha o `limit`, para não sobrecarregar também o arquivo.
5. **O relatório Páginas do Search Console,** para o seu próprio site.

Não recomendamos adivinhar caminhos com listas de palavras (wordlists), fazer scraping automático dos resultados do Google nem entrar em áreas com login. Mantenha um ritmo baixo em cada site.

## Ler um sitemap com Python: um exemplo que funciona

O script precisa do Python 3.11 ou mais recente, do Requests e do lxml (`pip install requests lxml`).

```python
"""Encontra o sitemap de um site, abre índices e arquivos .gz e lista as URLs.

Uso: python read_sitemap.py https://example.com [DIAS]
Com DIAS, lista só as URLs alteradas nos últimos DIAS dias (ou sem data utilizável).
"""
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                        # segundos de espera antes de cada requisição
LIMIT = 50 * 1024 * 1024           # sitemaps.org: no máximo 50 MB sem compressão
CANDIDATES = ["/sitemap.xml", "/sitemap_index.xml", "/wp-sitemap.xml"]

session = requests.Session()
session.headers["User-Agent"] = USER_AGENT
if os.environ.get("PROXY_URL"):    # ex.: 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)             # nunca baixa o mesmo arquivo duas vezes na mesma execução
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: confie nos dois primeiros bytes, não no nome do arquivo
        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: erro do servidor, fique de fora
        else:
            lines = []                                # 4xx: sem robots.txt, sem regras
    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 ou ...Z
    except ValueError:
        return None                          # data inválida: tratar como desconhecida
    return when if when.tzinfo else when.replace(tzinfo=timezone.utc)

def name(el):
    return etree.QName(el).localname         # nome da tag sem o namespace

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):          # só elementos, sem comentários
        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                     # nada neste arquivo mudou depois do corte
            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)
```

### O que o script faz e o que deixa de fora

- **Um cliente educado.** Uma única sessão espera um segundo antes de cada requisição e envia um `User-Agent` honesto, com o nome do bot e um endereço de contato ([O que é User-Agent?](/pt-br/blog/what-is-user-agent)).
- **O robots.txt pelo seu próprio cliente.** O arquivo vai para `RobotFileParser.parse()`, porque `read()` o baixaria com a identidade padrão do urllib. Um `4xx` significa que não há regras, e um `5xx` significa ficar de fora, como exige a RFC 9309. `site_maps()` devolve as linhas `Sitemap:` ou `None` ([documentação do Python](https://docs.python.org/pt-br/3/library/urllib.robotparser.html)), e `can_fetch()` recebe o nome do bot, não o `User-Agent` completo.
- **Parsing seguro.** `resolve_entities=False` e `no_network=True` impedem que o lxml expanda entidades ou carregue qualquer coisa remota; no nosso teste, um `<loc>` montado com entidades aninhadas voltou vazio. `localname` ignora diferenças de namespace.
- **Sem novas tentativas nem requisições paralelas, de propósito.** Para `429` e `Retry-After`, veja [Códigos de status HTTP no web scraping](/pt-br/blog/http-status-codes-web-scraping); para requisições paralelas, [Concorrência e paralelismo no web scraping](/pt-br/blog/concurrency-vs-parallelism).

Nós o executamos com Python 3.13.9, Requests 2.34.2 e lxml 6.1.3 em um site local: um robots.txt que bloqueia `/search/`, um índice, um sitemap de produtos em gzip enviado sem `Content-Encoding` e um sitemap de páginas datado de janeiro de 2025. Com um corte de 30 dias:

```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
```

`product/2`, alterado em março, ficou fora do corte; `product/3` (sem data) e `product/4` (data inválida) ficam, e `&amp;` saiu como `&`. O sitemap de páginas nunca foi requisitado. Sem robots.txt, o script encontrou o índice no segundo caminho candidato. Em docs.python.org, ele fez duas requisições e imprimiu 8 URLs, e a mesma execução por um proxy HTTP local, com `PROXY_URL` definido, deu a mesma lista.

Ler um sitemap não exige proxy. A linha do proxy serve para a etapa seguinte, a de conferir as páginas listadas como os visitantes de outro país as veem; nela, um [Proxies residenciais](https://proxynet.io/pt-br/residential-proxy) dá a você endereços locais no mesmo ritmo educado.

Se você prefere uma biblioteca, o `ultimate-sitemap-parser` (1.8.1 no PyPI) encontra sitemaps pelo robots.txt e pelos nomes comuns e percorre a árvore com `sitemap_tree_for_homepage()`. O `SitemapSpider` do Scrapy segue sitemaps aninhados e pode começar pelo robots.txt ([O que é Scrapy e como usar com proxy](/pt-br/blog/scrapy-proxy)).

## Casos de uso

- **Monitoramento de preços:** pegue as URLs de produtos no sitemap e baixe de novo só as que mudaram ([Como monitorar preços da concorrência no e-commerce](/pt-br/blog/competitor-price-tracking)).
- **Auditorias de SEO do seu próprio site:** confirme que toda URL do sitemap retorna `200` e que nenhuma está bloqueada no robots.txt; depois, veja como as páginas aparecem em outros países ([proxy para SEO](/pt-br/seo-proxy)).
- **Crawls grandes:** comece pelo sitemap e evite links-armadilha ([Armadilhas honeypot](/pt-br/blog/honeypot-traps)).
- **Extração pontual:** prepare a lista de URLs antes de extrair os campos ([Como extrair dados de um site](/pt-br/blog/extract-data-from-website)).
- **Monitoramento de mudanças:** uma execução diária com corte de um dia mostra novos anúncios ou artigos ([web crawler](/pt-br/web-crawler)).

## Erros comuns

- **Tentar só `/sitemap.xml`.** O robots.txt muitas vezes aponta para outro arquivo.
- **Ler só a primeira linha `Sitemap:`.** Todas as linhas contam.
- **Tratar um índice como lista de páginas.** Os valores `<loc>` dele são sitemaps.
- **Reconhecer o gzip pelo nome do arquivo.** Verifique os dois primeiros bytes.
- **Descartar entradas sem `lastmod`.** Elas podem ser justamente as que mudaram.
- **Confiar em um `lastmod` idêntico em todas as entradas.** Ele registra o build.
- **Baixar uma URL só porque o sitemap a lista.** O robots.txt continua valendo.
- **Fazer parsing de XML com expressões regulares.** O `&amp;` continua escapado.
- **Baixar todos os arquivos filhos a cada execução.** Use o `lastmod` do índice. Para conexões que falham, veja [Max retries exceeded with url](/pt-br/blog/max-retries-exceeded-with-url).

## Guia de decisão

| Necessidade | Recomendação |
|---|---|
| O endereço do sitemap de um site, rápido | `/robots.txt`, depois `/sitemap.xml` e `/sitemap_index.xml` |
| O sitemap de um site WordPress | `/wp-sitemap.xml`; `/sitemap_index.xml` com um plugin de SEO |
| Milhares de endereços em uma lista | Um script que abra índices e gzip, ou o `ultimate-sitemap-parser` |
| Só as páginas alteradas desde a última execução | Um corte por `lastmod`; requisições condicionais onde as datas falham |
| Uma URL do sitemap bloqueada no robots.txt | Pule |
| Sem sitemap | Feed e API, depois seguir links com limite ou a Wayback CDX |
| Todas as páginas do seu próprio site | Os relatórios Páginas e Sitemaps do Search Console |
| Crawls regulares de URLs do sitemap em escala | Uma estrutura de crawler com pool de proxies ([web crawler](/pt-br/web-crawler), [Proxies rotativos](https://proxynet.io/pt-br/rotating-proxy)) |

## Perguntas frequentes

### Como ver o sitemap de um site?

Digite no navegador o domínio seguido de `/robots.txt` e abra o endereço da linha `Sitemap:`. Se não houver nenhuma, tente `/sitemap.xml` e `/sitemap_index.xml`. Um arquivo `.gz` é baixado e precisa ser descompactado antes.

### Todo site tem sitemap?

Não. Sitemaps são opcionais, e sites pequenos com bons links internos muitas vezes não têm um. Sem sitemap, use um feed, uma API, links seguidos com limite ou a API CDX da Wayback.

### Qual é a diferença entre sitemap.xml e sitemap_index.xml?

`sitemap_index.xml` costuma ser um índice que lista outros sitemaps. Mas não é o nome que decide: abra o arquivo e verifique o elemento raiz. `<urlset>` contém páginas, `<sitemapindex>` contém sitemaps.

### Como encontrar páginas que não estão no sitemap?

Siga links a partir de páginas conhecidas, leia o feed, use a API ou consulte a API CDX da Wayback e depois verifique os endereços arquivados. Não recomendamos adivinhar caminhos com listas de palavras. Seguir links é o tema de [Web scraping vs. web crawling](/pt-br/blog/web-scraping-vs-web-crawling).

### Dá para confiar no lastmod?

Depende do site. Datas idênticas em todas as entradas indicam que o sitemap é gerado de novo a cada build. O núcleo do WordPress deixa o `lastmod` de fora do índice e dos sitemaps de categorias e de autores. Onde as datas falham, as requisições condicionais permitem que o servidor responda `304` para as páginas que não mudaram.

### O que fazer se uma URL do sitemap estiver bloqueada pelo robots.txt?

Pule a URL. O robots.txt é a regra explícita do dono para os crawlers, enquanto um sitemap é só uma lista. O script acima verifica cada endereço com `can_fetch()` antes de imprimi-lo; os detalhes estão em [O que é robots.txt e como ler o arquivo?](/pt-br/blog/robots-txt).

## Em resumo

Procure o sitemap primeiro no robots.txt, depois em `/sitemap.xml`, em `/sitemap_index.xml` e no caminho da plataforma. Abra índices e arquivos gzip, use o `lastmod` para manter só o que mudou e deixe o robots.txt prevalecer sobre o sitemap sempre. Sem sitemap, passe para feeds, APIs, links seguidos com limite e a API CDX da Wayback. Quando a lista chegar a milhares de páginas por dia, a nossa página de [web crawler](/pt-br/web-crawler) mostra como fazer esse crawl em escala.
