O sitemap (mapa do site) é um arquivo XML com a lista das URLs de um site que o proprietário disponibiliza aos buscadores e aos rastreadores (crawlers). Para as tarefas de coleta de dados, o mapa do site não tem preço: em vez de percorrer os links às cegas, de página em página, você recebe uma relação pronta de endereços, muitas vezes com a data da última modificação e a prioridade. Por isso o parsing do sitemap costuma ser o primeiro passo antes do parsing do HTML. Este artigo dá sequência ao nosso panorama dos formatos de documentos; como o sitemap é um caso particular de XML, as técnicas gerais de trabalho com a árvore estão descritas no artigo sobre o parsing de XML.
Estrutura do arquivo
O sitemap padrão é descrito pelo esquema de sitemaps.org. Cada URL é um elemento <url> com um <loc> obrigatório e os opcionais <lastmod>, <changefreq> e <priority>.
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url>
<loc>https://example.com/product/101</loc>
<lastmod>2026-05-12</lastmod>
<priority>0.8</priority>
</url>
<url>
<loc>https://example.com/product/102</loc>
<lastmod>2026-06-01</lastmod>
</url>
</urlset>Um detalhe importante: o namespace http://www.sitemaps.org/schemas/sitemap/0.9. Por causa dele, a busca «ingênua» pela tag loc sem levar o namespace em conta devolve o vazio; é o erro mais frequente ao desmontar mapas (mais sobre namespaces no artigo sobre XML).
Índice de sitemaps e sitemaps aninhados
Nos sites grandes, um único arquivo não comporta todos os links (o limite é de 50 000 URLs ou 50 MB), então usa-se um índice de mapas: um arquivo com links para outros sitemaps. O elemento raiz aqui é <sitemapindex> e, dentro, vão elementos <sitemap> com seus <loc> aninhados.
<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<sitemap><loc>https://example.com/sitemap-products.xml</loc></sitemap>
<sitemap><loc>https://example.com/sitemap-articles.xml.gz</loc></sitemap>
</sitemapindex>Por isso um parser confiável precisa ser recursivo: primeiro ler o índice e, depois, baixar e desmontar um a um cada mapa aninhado. Repare que os arquivos aninhados muitas vezes são servidos comprimidos em gzip (.xml.gz) — é preciso descomprimi-los na hora.
Onde procurar o mapa
O endereço do mapa costuma constar no robots.txt, na linha Sitemap:. Se não aparecer ali, verificam-se os caminhos padrão /sitemap.xml e /sitemap_index.xml. Convém começar justamente pelo robots.txt: é a forma mais confiável de conhecer a localização vigente.
Python
O caminho mais transparente: baixar o arquivo e desmontá-lo como um XML normal com o lxml, sem esquecer o namespace nem a recursão pelo índice.
import gzip
import requests
from lxml import etree
NS = {"sm": "http://www.sitemaps.org/schemas/sitemap/0.9"}
def fetch(url):
data = requests.get(url, timeout=30).content
if url.endswith(".gz"):
data = gzip.decompress(data)
return etree.fromstring(data)
def parse_sitemap(url, urls=None):
urls = urls if urls is not None else []
root = fetch(url)
# se for um índice, descemos aos mapas aninhados
for loc in root.xpath("//sm:sitemap/sm:loc/text()", namespaces=NS):
parse_sitemap(loc.strip(), urls)
# links normais
for loc in root.xpath("//sm:url/sm:loc/text()", namespaces=NS):
urls.append(loc.strip())
return urls
links = parse_sitemap("https://example.com/sitemap.xml")
print(len(links), "URLs encontradas")Se você não quiser escrever à mão a recursão e o tratamento do gzip, existe a biblioteca especializada ultimate-sitemap-parser: ela encontra o mapa sozinha, percorre os índices e devolve a lista plana de páginas.
from usp.tree import sitemap_tree_for_homepage
tree = sitemap_tree_for_homepage("https://example.com/")
for page in tree.all_pages():
print(page.url, page.last_modified)JavaScript / Node.js
No Node, o mapa se desmonta com praticidade usando a dupla fetch e fast-xml-parser (o mesmo usado para o XML).
const { XMLParser } = require("fast-xml-parser");
async function parseSitemap(url) {
const xml = await (await fetch(url)).text();
const parser = new XMLParser();
const doc = parser.parse(xml);
if (doc.sitemapindex) {
const maps = [].concat(doc.sitemapindex.sitemap);
const all = [];
for (const m of maps) all.push(...await parseSitemap(m.loc));
return all;
}
return [].concat(doc.urlset.url).map((u) => u.loc);
}
parseSitemap("https://example.com/sitemap.xml").then((urls) =>
console.log(urls.length)
);O que fazer com as datas de atualização
O campo <lastmod> é a razão principal para amar os mapas do site. Comparando-o com o momento do percurso anterior, dá para baixar apenas as páginas modificadas e não sobrecarregar o site com requisições desnecessárias. Isso transforma um scraping pontual em um monitoramento regular eficiente: não se percorre o site inteiro, só o delta. Leve em conta que o lastmod nem sempre está preenchido, nem sempre com honestidade, então use-o como pista, não como verdade absoluta.
Reunida a lista de URLs, começa a extração de dados das páginas propriamente dita — isso já é tarefa do parsing de HTML. Se você precisa percorrer com regularidade um site grande com mapa índice, gzip e filtragem por data, configuramos o scraping de ponta a ponta, agendamento incluído, com a entrega do resultado no formato que convier, por exemplo CSV ou Excel.