🎯 Um navegador em nuvem personalizável e anti-detecção alimentado por Chromium desenvolvido internamente, projetado para rastreadores web e agentes de IA. 👉Experimente agora
De volta ao blog

Rastreamento Baseado em Sitemap: Encontre URLs Antes de Recuperá-las

James Thompson
James Thompson

Scraping and Proxy Management Expert

22-Jul-2026

TL;DR:

  • A maioria dos crawlers descobre URLs seguindo links, o que significa buscar páginas que você não deseja para encontrar aquelas que deseja.
  • Um sitemap fornece a lista antecipadamente: uma solicitação HTTP retorna cada URL que o site deseja indexar, já deduplicada pelo publisher.
  • Filtrar um sitemap real neste guia reduziu 7.577 entradas para as 597 que correspondiam à seção alvo, antes que uma única página fosse carregada.
  • Defina um orçamento de rastreamento explícito a partir dessa lista, ao invés de rastrear até que algo o impeça — o limite deve estar no código, não nas suas intenções.
  • Renderize JavaScript apenas quando os dados precisarem; as páginas neste walkthrough servem seus títulos do lado do servidor, então uma busca não renderizada é mais rápida e retorna o mesmo campo.
  • Comece no plano gratuito do Scrapeless e aponte a etapa de descoberta para um sitemap que você tem permissão para rastrear.

Crawlers que seguem links funcionam, e eles são ineficientes. Para acessar as páginas de artigos de um site, você busca a página inicial, listagens de categorias, paginação, páginas de tags e qualquer outra coisa que esteja entre o ponto de entrada e o conteúdo — e depois joga a maior parte disso fora.

Um sitemap ignora isso. É uma lista de URLs que o publisher deseja explicitamente que sejam descobertas, o que o torna o mecanismo de descoberta mais barato disponível e o que menos provavelmente irritará alguém.

O que um Sitemap Oferece

Um sitemap é um arquivo XML que lista as URLs de um site, definido pelo protocolo de sitemaps. Existem duas formas e você precisa lidar com ambas:

  • Um urlset contém entradas <url><loc> apontando para páginas.
  • Um sitemapindex contém entradas <sitemap><loc> apontando para outros sitemaps, utilizados quando um site excede o limite de 50.000 URLs ou 50 MB por arquivo do protocolo.

Ambos usam o mesmo elemento <loc>, razão pela qual o parser abaixo lê <loc> e então decide o que está analisando. Sitemaps também são comumente servidos em gzip, então um buscador deve lidar com isso de forma transparente.

Onde encontrar um: verifique /sitemap.xml primeiro, depois a diretiva Sitemap: dentro de robots.txt, que o padrão do Protocolo de Exclusão de Robots define como o local canônico para anunciá-lo.

Pré-requisitos

  • Python 3.9 ou mais recente. A etapa de descoberta usa apenas a biblioteca padrão.
  • Uma chave de API do Scrapeless para a etapa de busca:
bash Copy
export SCRAPELESS_API_KEY="sua_chave_api_aqui"

Os exemplos abaixo apontam para o sitemap do Scrapeless, portanto, o walkthrough é seguro para ser executado exatamente como escrito. Troque por um sitemap que você tem permissão para rastrear quando você adaptá-lo.

Descobrir e Filtrar

Uma solicitação, então filtragem na memória. Nada foi buscado do site ainda:

python Copy
import gzip, re, urllib.request

SITEMAP = "https://www.scrapeless.com/sitemap.xml"
LOC_RE = re.compile(r"<loc>\s*([^<\s]+)\s*</loc>", re.I)

def fetch_xml(url: str) -> str:
    req = urllib.request.Request(url, headers={"User-Agent": "sitemap-demo/1.0"})
    with urllib.request.urlopen(req, timeout=60) as r:
        raw = r.read()
    if url.endswith(".gz") or raw[:2] == b"\x1f\x8b":
        raw = gzip.decompress(raw)
    return raw.decode("utf-8", errors="replace")

xml = fetch_xml(SITEMAP)
is_index = "<sitemapindex" in xml.lower()
urls = LOC_RE.findall(xml)

print(f"tipo de documento: {'índice de sitemap' if is_index else 'url set'}")
print(f"total de entradas <loc>: {len(urls)}")

blog = sorted({u for u in urls if "/en/blog/" in u})
print(f"filtrado para /en/blog/: {len(blog)}")
print(f"primeiro: {blog[0]}")
text Copy
tipo de documento: url set
total de entradas <loc>: 7.577
filtrado para /en/blog/: 597
primeiro: https://www.scrapeless.com/pt/blog/10-best-no-code-web-scrapers

Esse é todo o argumento para essa abordagem: 7.577 URLs enumeradas e reduzidas a 597 relevantes, ao custo de uma solicitação. Um crawler que segue links teria buscado centenas de páginas para chegar à mesma lista e ainda perderia qualquer coisa que não estivesse ligada de um caminho que ele aconteceu de percorrer.

Três detalhes nesse código têm peso.

A verificação gzip inspeciona os bytes mágicos em vez de confiar na extensão do arquivo, porque muitos servidores retornam conteúdo em gzip de uma URL .xml. A assinatura de dois bytes \x1f\x8b que ele procura é o cabeçalho definido na especificação do formato de arquivo GZIP.

sorted({...}) é uma compreensão de conjunto, então URLs duplicadas colapsam antes de você contá-las. Sitemaps contêm duplicatas, particularmente quando um site é montado a partir de vários geradores.

Detectar <sitemapindex> importa porque um índice significa que os valores <loc> que você acabou de coletar são mais sitemaps, não páginas. Se is_index for verdadeiro, busque cada um deles e repita antes de tratar qualquer coisa como uma URL de página.

Defina um Orçamento Explícito, Então Busque

A descoberta é barata; a recuperação não. O número de páginas que você irá recuperar deve ser uma constante no código, não uma propriedade emergente de quanto tempo o loop roda:

python Copy
import json, os, re, urllib.request

SITEMAP = "https://www.scrapeless.com/sitemap.xml"
API = "https://api.scrapeless.com/api/v2/unlocker/request"
LOC_RE = re.compile(r"<loc>\s*([^<\s]+)\s*</loc>", re.I)
TITLE_RE = re.compile(r"<title[^>]*>(.*?)</title>", re.S | re.I)

def fetch_sitemap(url: str) -> str:
    req = urllib.request.Request(url, headers={"User-Agent": "sitemap-demo/1.0"})
    with urllib.request.urlopen(req, timeout=60) as r:
        return r.read().decode("utf-8", errors="replace")

def fetch_page(url: str) -> str:
    body = json.dumps({
        "actor": "unlocker.webunlocker",
        "input": {"url": url, "js_render": False},
    }).encode()
    req = urllib.request.Request(API, data=body, headers={
        "x-api-token": os.environ["SCRAPELESS_API_KEY"],
        "Content-Type": "application/json",
    })
    with urllib.request.urlopen(req, timeout=180) as r:
        return json.loads(r.read())["data"]

urls = sorted({u for u in LOC_RE.findall(fetch_sitemap(SITEMAP)) if "/en/blog/" in u})
print(f"candidatos após filtro e desduplicação: {len(urls)}")

BUDGET = 3
print(f"orçamento de rastreamento: {BUDGET}")

for url in urls[:BUDGET]:
    html = fetch_page(url)
    m = TITLE_RE.search(html)
    title = re.sub(r"<[^>]+>", "", m.group(1)).strip() if m else "(sem título)"
    print(f"  {url.rsplit('/', 1)[-1]} -> {title}")
text Copy
candidatos após filtro e desduplicação: 597
orçamento de rastreamento: 3
  10-best-no-code-web-scrapers -> 10 Melhores Scrapers Web Sem Código para Extração de Dados Sem Esforço em 2025
  20-ways-for-web-scraping-without-getting-blocked -> 20 Maneiras de Web Scraping Sem Ser Bloqueado
  403-web-scraping -> Erro 403 em Web Scraping: 10 Soluções Fáceis para Corrigir Pedidos Proibidos

BUDGET é uma constante nomeada aplicada com um fatiamento. Isso é deliberado: um rastreador cuja condição de parada é "a lista acabou" se comporta de forma muito diferente em uma seção de algumas centenas de URLs do que em uma com dezenas de milhares, e a diferença só aparece em produção.

Note que js_render está definido como False. Essas páginas servem seu <title> no HTML inicial, portanto a renderização adicionaria custo e latência para um campo que já está lá. Renderize quando os dados que você precisa estão escritos no DOM por um script — não por padrão. A API de Rastreamento Universal Scrapeless lida com ambos, e o guia de renderização JS cobre como saber em qual caso você está.

A contagem de URLs é uma instantânea. Um sitemap é um documento ao vivo, então reexecutar a descoberta em um dia diferente retorna um número diferente — esse é o objetivo de lê-lo a cada execução ao invés de codificar uma lista.

Solução de Problemas

/sitemap.xml retorna 404. Leia robots.txt e procure por uma linha Sitemap:, que pode apontar para outro lugar completamente diferente. Alguns sites publicam um apenas lá; alguns não publicam nenhum, caso em que o seguimento de links é sua única opção restante.

O parser retorna zero URLs de um arquivo que parece válido. Verifique se a resposta foi compactada com gzip e não descompactada — a verificação de byte mágico acima lida com o caso comum. Também confirme que você buscou XML e não uma página de erro HTML, que é o que um redirecionamento para um 404 amigável produz.

Os números parecem muito baixos. O documento provavelmente é um índice de sitemap. Cada <loc> nele é outro sitemap para buscar, e os URLs das páginas estão um nível abaixo.

As entradas apontam para URLs que não existem mais. Sitemaps são gerados, e os geradores ficam desatualizados. Trate a lista como candidatos em vez de garantias, e espere que algumas entradas retornem 404.

Verifique os termos do site e seu robots.txt antes de rastrear qualquer coisa, mantenha a coleta para páginas públicas e mantenha o orçamento proporcional ao que o site pode fornecer confortavelmente. Um sitemap diz o que um editor está disposto a ter indexado; não é uma licença para buscar tudo o mais rápido que puder.

Conclusão

O rastreamento baseado em sitemaps substitui a parte mais desperdiciadora de um rastreador — a descoberta — por uma única solicitação. Neste guia, isso significou enumerar 7.577 URLs, restringindo a 597 que importavam, e buscando apenas 3, com o limite escrito no código ao invés de deixado ao acaso.

O hábito que se generaliza além dos sitemaps é a ordenação: enumere primeiro, filtre e deduplicate enquanto ainda é gratuito, decida explicitamente quanto você irá buscar, e somente então comece a fazer solicitações. A maioria dos rastreadores que se mete em problemas faz esses passos na ordem oposta.
Comece com o plano gratuito Scrapeless para executar a etapa de busca contra uma fonte que você está autorizado a rastrear e revise a precificação do Scrapeless ao dimensionar um trabalho recorrente.

Perguntas Frequentes

P: Como encontro o sitemap de um site?

Tente primeiro /sitemap.xml, depois leia robots.txt em busca de uma diretiva Sitemap:, que o RFC 9309 define como o local canônico para anunciá-lo. Sites grandes costumam publicar um índice nesse caminho, apontando para vários sitemaps de seção em vez de um único arquivo plano.

P: Qual é a diferença entre um índice de sitemap e um urlset?

Um urlset lista URLs de páginas; um índice de sitemap lista outros arquivos de sitemap. Ambos usam elementos <loc>, então um parser que apenas olha para <loc> retornará felizmente URLs de sitemaps enquanto você pensa que tem páginas. Verifique um elemento raiz <sitemapindex> e prossiga quando encontrar um — a divisão existe porque o protocolo limita um único arquivo a 50.000 URLs ou 50 MB.

P: Rastrear a partir de um sitemap é melhor do que seguir links?

Para descoberta, geralmente sim: uma solicitação retorna URLs que o editor listou explicitamente, em vez de buscar páginas intermediárias para encontrá-las. A troca é a cobertura — um sitemap contém apenas o que o gerador escolheu incluir, então páginas que existem, mas foram omitidas, permanecem invisíveis. Seguir links ainda é melhor quando você precisa de tudo acessível, em vez de tudo anunciado.

P: Devo renderizar JavaScript ao rastrear a partir de um sitemap?

Somente quando o campo que você deseja não está no HTML inicial. As páginas neste guia servem seu <title> do lado do servidor, então js_render é definido como False e a busca é mais barata e rápida. Verifique uma página primeiro: se os dados aparecerem na origem da visualização, você não precisa de renderização.

P: Quantas páginas devo buscar por execução?

Defina um número explicitamente e limite a lista de candidatos a isso, como o BUDGET faz acima. O valor certo depende da capacidade do site e das suas necessidades, mas a parte importante é que é uma decisão registrada no código, em vez de um efeito colateral do comprimento da lista — o que transforma um trabalho em uma seção pequena e um trabalho em todo o site em eventos muito diferentes.

Na Scorretless, acessamos apenas dados disponíveis ao público, enquanto cumprem estritamente as leis, regulamentos e políticas de privacidade do site aplicáveis. O conteúdo deste blog é apenas para fins de demonstração e não envolve atividades ilegais ou infratoras. Não temos garantias e negamos toda a responsabilidade pelo uso de informações deste blog ou links de terceiros. Antes de se envolver em qualquer atividade de raspagem, consulte seu consultor jurídico e revise os termos de serviço do site de destino ou obtenha as permissões necessárias.

Artigos mais populares

Catálogo