Formatos e fontes de dados 4 min de leitura

Parsing de sitemaps: como percorrer o mapa do site antes de coletar dados

Por que começar a coleta pelo sitemap.xml: parsing de mapas índice, seleção das URLs necessárias e economia no rastreamento do site antes do scraping.

EW
Equipe Web-Scraping.biz
Coleta de dados para as demandas do negócio
Publicado: 9 abril 2025

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

xml
<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.

xml
<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.

python
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.

python
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).

javascript
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.