Saltar para o conteúdo
Voltar ao blogue

Como utilizar o GoSpider: rastrear, limpar URLs e extrair dados

Suciu DanÚltima atualização em 23 min read
Como utilizar o GoSpider: rastrear, limpar URLs e extrair dados
Resumo: O GoSpider é um rastreador de linha de comandos destinado a descobrir URLs, não um extrator completo de dados estruturados. Este guia sobre como utilizar o GoSpider demonstra um rastreio limitado, um tratamento adequado dos resultados, uma transferência do Colly para CSV e um procedimento de diagnóstico para respostas 403 ou páginas que requerem renderização em JavaScript.

O rastreio da Web consiste na descoberta e percurso automatizados de páginas Web através dos seus links. O GoSpider é um rastreador de linha de comandos baseado em Go que mapeia URLs rapidamente, enquanto um extrator como o Colly visita as páginas selecionadas e extrai campos para um esquema utilizável.

Se procurou por «Como utilizar o GoSpider», a distinção mais importante é o ponto de transferência: o GoSpider constrói o conjunto de URLs candidatas e, em seguida, o seu código de limpeza e extração decide o que se torna dados. Essa separação mantém a descoberta suficientemente ampla para encontrar páginas úteis, sem a misturar com seletores, validação de registos ou gravação em CSV.

Este tutorial começa com um pequeno site de teste público, explica os comandos do GoSpider que controlam o âmbito e a carga e, em seguida, transforma o resultado numa pipeline Go reproduzível. Também trata os sinalizadores e os valores predefinidos como sensíveis à versão. Antes de executar qualquer receita, compare-a com gospider -h e o repositório oficial do GoSpider, pois os aliases e o comportamento podem mudar entre versões.

Como utilizar o GoSpider: o que faz e onde se limita

O GoSpider aceita um alvo ou uma lista de alvos, solicita páginas, segue links elegíveis e reporta URLs encontradas em HTML, scripts, mapas do site, ficheiros robots, subdomínios ou fontes externas opcionais. Isso torna o rastreador web GoSpider útil para trabalhos de inventário, reconhecimento de segurança em sistemas autorizados, verificações de migração e criação de uma fila de entrada para extração posterior.

Por si só, não transforma páginas arbitrárias em registos de produtos, artigos ou tabelas. O GoSpider consegue identificar /catalogue/a-light-in-the-attic_1000/index.html; o código de extração ainda tem de abrir essa página, selecionar o título e o preço, validá-los e serializar o resultado. Um guia que compare web scraping e web crawling é um recurso útil se a sua equipa tender a utilizar esses termos de forma intercambiável.

A outra limitação é a renderização. O GoSpider pode inspecionar ficheiros JavaScript em busca de cadeias de caracteres semelhantes a URLs, mas não executa uma aplicação de página única como um navegador faria. Se os dados só aparecerem após um clique, deslocamento, fluxo de início de sessão ou chamada à API do lado do cliente, a descoberta de URLs pode ficar incompleta. Utilize o GoSpider primeiro para superfícies públicas, estáticas ou renderizadas pelo servidor. Só avance para a etapa seguinte depois de determinar se a falha se deve ao âmbito, ao controlo de acesso ou à falta de execução no navegador.

Introdução rápida: instalar o GoSpider e gerar uma lista de URLs limpa

Este primeiro fluxo de trabalho «Como utilizar o GoSpider» utiliza o «Books to Scrape», um site de treino público, com profundidade reduzida e baixa pressão de pedidos. O objetivo não é a cobertura máxima nem a velocidade. Trata-se de um ficheiro de URLs reproduzível que pode inspecionar antes de alargar o âmbito. Mantenha o comando inicial inalterado durante tempo suficiente para estabelecer uma linha de base e, em seguida, altere um parâmetro de controlo de cada vez. Essa abordagem torna as diferenças na saída e na carga explicáveis.

Instale a CLI e verifique o seu ambiente

Instale uma versão atual do Go seguindo as instruções oficiais de instalação do Go e, em seguida, confirme se a cadeia de ferramentas funciona:

go version
go env GOBIN
go env GOPATH

No momento da redação deste artigo, o padrão esperado de instalação do módulo é:

go install github.com/jaeles-project/gospider@latest
gospider -h

O comando de instalação, a versão, os aliases e os valores predefinidos requerem uma verificação do repositório atual antes da publicação. Considere gospider -h o binário que instalou como de referência para as receitas abaixo.

Se o macOS ou o Linux não conseguirem encontrar o executável e GOBIN estiver vazio, a documentação fornecida coloca os binários instalados pelo Go no diretório GOPATH bin :

export PATH="$(go env GOPATH)/bin:$PATH"
gospider -h

Mantenha essa exportação no ficheiro de arranque do seu shell apenas após confirmar o diretório. Em qualquer plataforma, uma GOBIN tem prioridade. Guarde a saída de go version, go env GOBINe gospider -h juntamente com as suas notas de execução. Esse pequeno registo facilita muito a explicação do motivo pelo qual um comando se comporta de forma diferente noutra estação de trabalho ou após uma atualização.

<!-- É necessária investigação adicional: confirme as instruções atuais do Windows relativas a GOBIN e PATH na documentação atual do Go antes de adicionar comandos específicos do sistema operativo. -->

Execute uma primeira exploração limitada

Crie um diretório de trabalho e, em seguida, rastreie apenas um nível de links a partir da página inicial:

mkdir gospider-project
cd gospider-project

gospider   -s https://books.toscrape.com/   -d 1   -c 2   -k 1   -m 20   -o output   -q

Nas versões descritas no resumo fornecido, -s define um site, -d 1 mantém a recursão superficial, -c 2 limita os pedidos simultâneos para um domínio correspondente, -k 1 adiciona um atraso, -m 20 define um tempo limite, -o armazena os resultados e -q reduz o ruído do terminal. Verifique cada opção em relação à saída de ajuda atual antes de utilizar o comando sem alterações.

Comece de forma conservadora, mesmo num site de teste. A profundidade multiplica os caminhos, a simultaneidade multiplica o trabalho em curso e um rastreio sem atraso pode criar uma carga evitável. Algumas versões documentadas interpretam a profundidade 0 como recursão ilimitada; por isso, não a utilize até ter testado novamente esse comportamento e definido um âmbito rígido.

Para um fluxo rápido e limpo, capture os URLs e deduplique-os:

gospider -s https://books.toscrape.com/ -d 1 -c 2 -k 1 -q   | grep -Eo 'https?://[^[:space:]]+'   | sort -u > urls.txt

Abra urls.txt e confirme se todos os nomes de host e caminhos pertencem ao destino pretendido. O ficheiro pode incluir URLs de categorias, paginação e recursos, juntamente com páginas de produtos. Isso é esperado na fase de descoberta. Não compense aumentando a profundidade por enquanto. Identifique primeiro o padrão de caminho que representa as páginas que o seu extrator consegue realmente processar.

Interprete a saída com tags, silenciosa e em JSON

Execute o rastreio sem -q quando precisares de proveniência. Em compilações documentadas, as etiquetas distinguem os recursos solicitados ([url]), links analisados a partir de HTML ([href]), ficheiros JavaScript ([javascript]) e cadeias de caracteres semelhantes a URLs encontradas durante a inspeção de scripts ([linkfinder]). Volte a testar essas etiquetas na sua versão instalada.

A saída silenciosa é mais fácil de canalizar, mas descarta contexto útil. O JSON é preferível quando outro programa necessita de campos de tipo ou de origem:

gospider -s https://books.toscrape.com/ -d 1 --json > crawl.jsonl
head -n 3 crawl.jsonl

Não vincule o código de produção a um esquema JSON presumido até inspecionar uma amostra atual e validar como os erros são representados. Os recursos estáticos ou links excluídos podem ainda ser apresentados como descobertas, mesmo quando o GoSpider não os solicita.

Configurar o GoSpider por tarefa de rastreio

Uma configuração prática do «Como utilizar o GoSpider» começa com quatro decisões: quais os hosts autorizados, até onde os links podem expandir-se, qual a carga aceitável e que tipo de saída a sua próxima etapa espera. Construa o comando a partir dessas decisões, em vez de ativar todas as opções de descoberta. Indique o anfitrião pretendido, a profundidade máxima, o número de trabalhadores-alvo, a concorrência por domínio, o atraso e o formato de saída ao lado do comando. Esses seis valores formam um contrato de rastreio compacto que os revisores podem compreender antes da execução.

Escolha os alvos, o âmbito e a saída

Utilize -s para um URL inicial e -S para um ficheiro que contenha vários alvos. Mantenha a lista de sites explícita, com um URL aprovado por linha, e guarde cada execução num diretório de saída datado, para que os resultados de diferentes configurações não se misturem.

printf '%s
'   'https://books.toscrape.com/'   'https://quotes.toscrape.com/' > sites.txt

gospider -S sites.txt -d 1 -c 2 -t 2 -o output-run-01

A descoberta de subdomínios só deve ser ativada quando a autorização abranger esses anfitriões. Decida se os redirecionamentos para outro anfitrião são permitidos e mantenha a saída de cada alvo separada. Da mesma forma, as expressões da lista branca e da lista negra devem restringir os pedidos a caminhos e tipos de ficheiros úteis. Um padrão como /catalogue/ pode manter as páginas de produtos, enquanto os recursos podem ser removidos durante o pós-processamento.

Não presuma que a filtragem altere o que é apresentado. Em versões documentadas, um URL na lista negra pode continuar a aparecer como um link descoberto, mesmo que não seja obtido. Valide tanto o comportamento da solicitação como a saída emitida num pequeno ambiente de teste.

Controle a profundidade, a simultaneidade, os threads, os atrasos e os tempos de espera

A profundidade é o número de níveis de links seguidos a partir de cada URL inicial. -d 1 é uma amostra de descoberta segura. Aumente para -d 2 apenas quando os primeiros resultados mostrarem que as páginas pretendidas se encontram um nível mais à distância. Evite uma profundidade ilimitada, pois calendários, navegação facetada, parâmetros de rastreamento e rotas duplicadas podem fazer com que o rastreio cresça indefinidamente.

Os controlos de paralelismo resolvem diferentes problemas:

Controlo

Significado prático

Risco principal

-c

Pedidos simultâneos a um domínio correspondente

Carga excessiva num único site

-t

Trabalhadores-alvo ao processar uma lista de locais

Demasiados locais ativos em simultâneo

atraso

Pausa entre pedidos

Tempo de execução mais longo

tempo de espera

Tempo máximo de espera por uma solicitação

Falhas falsas em páginas lentas

Para três sites autorizados, -t 2 -c 2 é possível ativar dois alvos, permitindo até duas solicitações por domínio correspondente. Isto não significa apenas duas solicitações no total. Utilize um atraso e um tempo de espera moderado para que os servidores lentos não provoquem uma enxurrada de tentativas:

gospider -S sites.txt -d 1 -t 2 -c 2 -k 1 -m 20 -o output

A -c, -t, o atraso, o tempo limite e a semântica de profundidade zero dependem da versão nos dados fornecidos. Registe a sua versão binária e teste com um ambiente local ou controlado antes de uma execução em grande escala. Monitorize a taxa de pedidos no servidor quando o controlar. As definições de concorrência do lado do cliente são limites úteis, mas redirecionamentos, novas tentativas e hosts recém-descobertos podem fazer com que o tráfego observado difira de uma simples -c × -t estimativa.

Expanda a descoberta com scripts, robôs, mapas do site, subdomínios e fontes externas

Cada modo de expansão adiciona uma fonte de semente diferente:

  • A inspeção de JavaScript procura no texto do script descarregado por cadeias de caracteres semelhantes a URLs. Não executa a aplicação.
  • O processamento de robôs e mapas do site pode revelar caminhos declarados que a navegação normal não detecta.
  • A descoberta de subdomínios pode adicionar novos anfitriões, o que também amplia as preocupações relacionadas com a autorização e a carga.
  • As fontes externas podem devolver URLs históricos provenientes de arquivos ou de índices de inteligência sobre ameaças.

Uma receita delimitada pode combinar estes modos com profundidade reduzida, baixa simultaneidade e uma lista branca de hosts:

gospider   -s https://example.com/   -d 1 -c 1 -k 2 -m 20   --js --robots --sitemap   --whitelist 'https://([a-z0-9-]+\.)?example\.com/'   -o discovery

Adicione a opção de subdomínio ou --other-source opção apenas após verificar gospider -h e de que todos os hosts resultantes permaneçam dentro do âmbito. As sementes de arquivo podem revelar caminhos eliminados, redirecionados ou sensíveis, pelo que a descoberta não constitui autorização para os solicitar.

Defina agentes de utilizador, cabeçalhos, cookies, proxies, filtros e saída JSON

Os metadados de pedido personalizados são úteis quando um destino autorizado espera uma localização, uma conta de teste ou um cabeçalho específico da aplicação. Passe os cabeçalhos não confidenciais separadamente:

gospider -s https://example.com/ -d 1   -H 'Accept-Language: en-US'   -H 'X-Test-Run: inventory-01'

No caso de um cookie, leia o valor sem o exibir e apague-o após a execução:

read -s SESSION_COOKIE
gospider -s https://example.com/account/ -d 1 --cookie "$SESSION_COOKIE"
unset SESSION_COOKIE

Os argumentos da linha de comandos podem ficar visíveis para outros processos locais ou ferramentas de shell. Utilize credenciais de teste de curta duração, evite máquinas partilhadas, nunca registe comandos que contenham tokens e não permita que a autenticação alargue o âmbito de rastreio aprovado.

As versões documentadas aceitam um proxy com -p e saída estruturada com --json:

gospider -s https://example.com/ -d 1 -c 1   -p 'http://USER:PASS@proxy.example:8080'   --json > crawl.jsonl

Trate a sintaxe do proxy, os nomes dos filtros, os aliases, a análise de cabeçalhos, o tratamento de cookies e os campos JSON como sensíveis à versão. Execute um pedido controlado que repita os cabeçalhos permitidos antes de confiar na autenticação ou no comportamento de encaminhamento. Um proxy altera a rota de rede, não a sua autorização. Para uma configuração mais abrangente do projeto, um guia de web scraping em Go pode abordar a gestão de segredos e o comportamento do cliente HTTP para além desta CLI.

Recetas de comandos copiáveis

Estes comandos do GoSpider são modelos, não recomendações de permissão ou carga. Substitua os alvos, verifique os sinalizadores atuais e execute as receitas de «Como utilizar o GoSpider» num âmbito autorizado reduzido antes de aumentar a profundidade ou o paralelismo. Guarde cada comando num manual de operações, indicando a sua finalidade e o nome de anfitrião esperado. Se os resultados observados excederem qualquer um desses parâmetros, interrompa e investigue, em vez de adicionar filtros após um rastreio de grande dimensão.

Rastreios de um único site, de uma lista de sites e paralelos com vários alvos

Site único, um nível, baixa pressão:

gospider -s https://books.toscrape.com/ -d 1 -c 2 -k 1 -m 20 -o one-site

Vários sites a partir de um ficheiro:

https://docs.example.org/
https://status.example.org/
https://support.example.org/

Guarde essas linhas como sites.txt, e, em seguida, execute:

gospider -S sites.txt -d 1 -c 2 -t 2 -k 1 -m 20 -o many-sites

Aqui, -t 2 controla quantos destinos listados são processados em paralelo, enquanto -c 2 limita o trabalho simultâneo para cada domínio correspondente. Aumentar ambos multiplica a carga. Se um destino redirecionar para outro anfitrião, verifique novamente o âmbito, em vez de assumir que se aplica o mesmo intervalo de simultaneidade ou autorização. Execute primeiro um exemplo com dois alvos e verifique se o diretório de saída separa os resultados conforme esperado na sua versão. Se os ficheiros forem mesclados ou nomeados de forma inesperada, corrija a importação a jusante antes de adicionar mais alvos.

Descoberta de mapas do site, subdomínios e fontes de arquivo

Caminhos declarados em ficheiros robots e mapas do site:

gospider -s https://example.com/ --robots --sitemap   -d 1 -c 1 -k 2 -o declared-paths

Subdomínios autorizados, utilizando o sinalizador de subdomínio indicado na ajuda instalada:

gospider -s https://example.com/ --subs   -d 1 -c 1 -k 2 -o subdomain-results

Fontes históricas:

gospider -s https://example.com/ --other-source   -d 1 -c 1 -k 2 -o archive-results

As fontes de terceiros podem devolver muitos URLs desatualizados ou fora do âmbito. Trate os seus resultados como sementes não confiáveis, e não como uma fila a ser recolhida automaticamente. Filtre por host e caminho aprovados, remova URLs que contenham informações confidenciais ou identificadores de utilizador e analise os códigos de estado antes de solicitar qualquer resultado. Para todas as três receitas, mantenha a profundidade finita, pois cada caminho recém-semeado pode expor outra camada de ligações.

Limpar e validar os URLs descobertos

A saída bruta do rastreador é um registo de observação, não uma fila de extração fiável. Neste pipeline «Como utilizar o GoSpider», a limpeza é um passo separado e determinístico que preserva apenas URLs HTTP válidas que correspondam às páginas que pretende extrair. Mantenha o ficheiro bruto imutável, grave os URLs aceites num novo ficheiro e versione as regras para que cada inclusão possa ser reproduzida.

Normalize, deduplique e filtre os resultados por padrões

Um pipeline compacto em shell pode extrair cadeias de caracteres com formato de URL, remover fragmentos, reter uma família de caminhos e deduplicar:

grep -Eo 'https?://[^[:space:]]+' crawl.txt \
  | sed -E 's/#.*$//' \
  | grep -E '^https://books\.toscrape\.com/catalogue/' \
  | grep -Ev '/catalogue/category/' \
  | sort -u > urls.txt

Para um filtro Go portátil com análise explícita, guarde isto como filter.go:

package main

import (
	"bufio"
	"fmt"
	"net/url"
	"os"
	"regexp"
	"sort"
	"strings"
)

var findURL = regexp.MustCompile(`https?://[^\s"'<>()]+`)

func main() {
	seen := map[string]bool{}
	var keep []string
	s := bufio.NewScanner(os.Stdin)

	for s.Scan() {
		for _, raw := range findURL.FindAllString(s.Text(), -1) {
			raw = strings.TrimRight(raw, ".,);]")
			u, err := url.Parse(raw)
			if err != nil || u.Hostname() != "books.toscrape.com" {
				continue
			}
			if !strings.HasPrefix(u.Path, "/catalogue/") ||
				strings.HasPrefix(u.Path, "/catalogue/category/") {
				continue
			}
			u.Fragment = ""
			u.Scheme = strings.ToLower(u.Scheme)
			u.Host = strings.ToLower(u.Host)
			clean := u.String()
			if !seen[clean] {
				seen[clean] = true
				keep = append(keep, clean)
			}
		}
	}
	sort.Strings(keep)
	for _, u := range keep {
		fmt.Println(u)
	}
}

Execute-o com:

go run filter.go < crawl.txt > urls.txt

A política de normalização é específica da aplicação. Remover fragmentos é geralmente seguro para pedidos ao servidor, mas eliminar parâmetros de consulta pode fundir páginas distintas. Decida se as barras finais, as portas predefinidas, a codificação percentual e os parâmetros de rastreamento são equivalentes para o seu alvo e, em seguida, codifique essa política nos testes. Preserve o URL original ao lado da chave normalizada quando a auditabilidade for importante. Lembre-se também de que os filtros do GoSpider podem impedir uma solicitação sem suprimir o link descoberto da saída. O pós-processamento continua, portanto, a ser necessário.

Verifique uma amostra antes de escalar

Inspecione os primeiros registos e analise uma pequena amostra:

head -n 20 urls.txt

head -n 10 urls.txt | while read -r url; do
  curl -sS -o /dev/null \
    -w '%{http_code} %{content_type} %{url_effective}\n' "$url"
done

Procure por hosts inesperados, variantes de URL duplicadas, redirecionamentos, conteúdo não HTML, respostas 403 e estruturas de caminho que não correspondam aos seus seletores de extração. Abra manualmente duas ou três páginas e confirme se os campos desejados existem no HTML devolvido. Não aumente a profundidade do GoSpider nem o volume de extração até que esta amostra esteja limpa.

Transforme a lista de URLs em dados estruturados com o Colly

O GoSpider já concluiu o seu trabalho. O próximo passo do guia «Como utilizar o GoSpider» passa a lista de permissões limpa para o Colly, que solicita cada página aprovada, executa callbacks de seletores CSS, valida registos e grava em CSV. Esta separação mantém a descoberta de URLs substituível e a lógica de extração testável. Permite-lhe também reexecutar seletores no mesmo conjunto de URLs aprovadas sem ter de redescobrir o site, o que é útil quando a marcação da página muda, mas o âmbito do rastreio permanece o mesmo.

Criar um scraper compacto de URL para CSV

Inicialize um módulo Go e adicione o Colly:

go mod init gospider-pipeline
go get github.com/gocolly/colly/v2

Guarde o seguinte como scrape.go. Os seletores têm como alvo a página do produto «Books to Scrape» utilizada no guia de início rápido:

package main

import (
	"bufio"
	"encoding/csv"
	"log"
	"os"
	"strings"
	"time"

	"github.com/gocolly/colly/v2"
)

func main() {
	input, err := os.Open("urls.txt")
	if err != nil { log.Fatal(err) }
	defer input.Close()

	out, err := os.Create("books.csv")
	if err != nil { log.Fatal(err) }
	defer out.Close()

	writer := csv.NewWriter(out)
	defer writer.Flush()
	_ = writer.Write([]string{"url", "title", "price", "image"})

	c := colly.NewCollector(
		colly.AllowedDomains("books.toscrape.com"),
	)
	_ = c.Limit(&colly.LimitRule{
		DomainGlob:  "*books.toscrape.com*",
		Parallelism: 2,
		Delay:       time.Second,
	})

	written := map[string]bool{}

	c.OnHTML("article.product_page", func(e *colly.HTMLElement) {
		pageURL := e.Request.URL.String()
		if written[pageURL] { return }

		title := strings.TrimSpace(e.ChildText("div.product_main h1"))
		price := strings.TrimSpace(e.ChildText("p.price_color"))
		image := e.Request.AbsoluteURL(e.ChildAttr("div.item.active img", "src"))
		if title == "" || price == "" {
			log.Printf("missing fields: %s", pageURL)
			return
		}

		_ = writer.Write([]string{pageURL, title, price, image})
		written[pageURL] = true
	})

	c.OnError(func(r *colly.Response, err error) {
		log.Printf("request failed: %s status=%d err=%v",
			r.Request.URL, r.StatusCode, err)
	})

	scanner := bufio.NewScanner(input)
	count := 0
	for scanner.Scan() && count < 20 {
		u := strings.TrimSpace(scanner.Text())
		if u == "" { continue }
		if err := c.Visit(u); err != nil {
			log.Printf("visit skipped: %s err=%v", u, err)
		}
		count++
	}
	if err := scanner.Err(); err != nil { log.Fatal(err) }
}

Execute go run scrape.goe, em seguida, inspecione books.csv. Neste exemplo compacto, o coletor processa o ficheiro de forma síncrona, enquanto a regra de limite introduz um ritmo de acesso e deixa margem para adotar a recolha assíncrona mais tarde. Se ativares visitas assíncronas, protege os mapas partilhados e as gravações em CSV ou canaliza os registos através de uma única goroutine de gravação. O OnHTML é acionada para elementos correspondentes, pelo que um ficheiro vazio significa normalmente que o seletor, o conteúdo da resposta ou o filtro de URL estão incorretos. Se o seu alvo real for tabular, um guia para extrair tabelas HTML em Golang com o Colly é a próxima referência natural.

Teste, limite a taxa e fortaleça a etapa de extração

Mantenha o limite inicial em 20 URLs. Valide cabeçalhos, contagem de linhas, codificação, campos obrigatórios, comportamento em caso de duplicados e URLs de imagens antes de remover o limite. Registe os códigos de estado e a URL com falha, mas nunca registe cookies ou cabeçalhos de autorização.

Utilize AllowedDomainsum atraso e um baixo paralelismo, mesmo que a entrada já tenha sido filtrada. Adicione novas tentativas apenas para falhas transitórias, como tempos de espera esgotados ou respostas 5xx selecionadas, com um limite rigoroso de tentativas e um intervalo de espera. Não repita tentativas para respostas 403 ou 404 cegamente. Em produção, grave num ficheiro CSV temporário e renomeie-o apenas depois de a execução passar na validação, para que a saída parcial não seja confundida com um conjunto de dados completo. Adicione um manifesto de execução contendo o hash da entrada, a versão do seletor, a hora de início, a contagem de sucessos e a contagem de falhas. Isso torna uma reexecução mensurável, em vez de depender dos registos do terminal.

Resolva as falhas e escolha a próxima ferramenta

Um bom diagnóstico do «Como utilizar o GoSpider» começa por classificar a falha. Verifique primeiro a instalação e o âmbito do rastreio, depois o acesso HTTP e, por fim, a renderização. Mudar de ferramenta antes de identificar a camada em causa muitas vezes aumenta a complexidade sem resolver a causa. Registe um URL com falha, o comando exato, o código de estado, o tipo de resposta e se o item em falta existe no HTML bruto. Essas evidências geralmente apontam para o ramo correto em poucos minutos.

Diagnosticar problemas comuns do GoSpider

Sintoma

Verifique primeiro

Ação corretiva

gospider: command not found

go env GOBIN, go env GOPATH, e PATH

Adicione o diretório do binário Go atual e, em seguida, execute novamente gospider -h

Resultados vazios

URL inicial, redirecionamentos, profundidade, HTML devolvido

Desative o modo silencioso, reduza os filtros e teste uma página pública

Saída excessivamente ruidosa

Links para recursos, navegação, variantes de consulta

Normalizar e filtrar por padrões após o rastreio

Timeouts frequentes

Latência do servidor, tempo de espera, pressão de pedidos

Reduzir -c, adicionar atraso, aumentar o tempo de espera com cautela

O rastreamento continua a aumentar

Profundidade zero, calendários, facetas, subdomínios

Interrompa a execução, utilize profundidade finita e restrinja o âmbito do host/caminho

URLs que parecem duplicados

Fragmentos, maiúsculas e minúsculas, ordem da consulta, redirecionamentos

Aplique uma política de normalização explícita

Os links na lista negra continuam a ser apresentados

Diferença entre descoberta e recuperação

Verificar os registos de pedidos e filtrar os resultados emitidos separadamente

Os resultados diferem entre máquinas

Versão binária, sinalizadores, caminho de rede

Captura gospider -h, informações de versão e um dispositivo de teste

Depure com um URL e saída marcada antes de alterar vários sinalizadores. Se uma página simples renderizada pelo servidor funcionar, a instalação provavelmente está correta. Compare um URL que se sabe que funciona com um URL com falha, utilizando os mesmos parâmetros, para que altere apenas uma variável de cada vez. Se forem encontrados URLs, mas os caminhos errados forem predominantes, corrija o âmbito ou faça uma limpeza. Se os pedidos devolverem um erro 403, investigue o acesso. Se o HTML não apresentar conteúdo visível num navegador, investigue a renderização.

Lide com respostas 403 sem adivinhar

Uma resposta HTTP 403 significa que o servidor compreendeu o pedido, mas recusou-o. Pode indicar falta de permissão, uma sessão autenticada obrigatória, uma regra de política, limitação de taxa ou controlos anti-bot. Não é prova de que um proxy seja a solução correta.

Siga esta ordem:

  1. Confirme se o rastreio está autorizado e se o URL está dentro do âmbito.
  2. Solicite um URL com saída marcada ou curl e inspecione os redirecionamentos e os cabeçalhos de resposta.
  3. Verifique se o site requer um login, um cookie, um referer, uma localização ou um agente de utilizador documentado.
  4. Reduza a simultaneidade e adicione um atraso. Um rastreio em picos pode ativar controlos que uma solicitação manual não ativa.
  5. Se a reputação do IP ou a localização geográfica forem o problema confirmado, utilize um proxy aprovado com credenciais de curta duração.
  6. Se a gestão de novas tentativas, a rotação de proxies e o tratamento de CAPTCHAs estiverem fora do âmbito do projeto, avalie uma API genérica de scraping.

Não tente contornar permissões de conta, paywalls ou controlos de acesso explícitos. Um guia detalhado sobre como fazer web scraping sem ser bloqueado pode ajudar na higiene das solicitações, mas a autorização continua a ser o primeiro requisito.

Saiba quando a renderização de JavaScript requer um navegador ou uma API

Encontrar um URL dentro de um pacote de JavaScript é uma análise de texto. Renderizar uma página significa executar scripts, manter o estado do navegador, aguardar a atividade de rede e, por vezes, clicar ou percorrer a página. A opção de deteção de JavaScript do GoSpider aborda a primeira tarefa, não a segunda.

Utilize um teste em três partes:

  • Se o link e os dados pretendidos estiverem presentes na resposta HTTP original, o GoSpider juntamente com o Colly é suficiente.
  • Se o HTML for principalmente um invólucro de aplicação, mas um ponto final JSON público fornecer os dados, rastreie os pontos finais aprovados e extraia a partir das respetivas respostas.
  • Se o conteúdo só aparecer após a execução ou interação do navegador, utilize automação do navegador ou um serviço de navegador hospedado.
  • Se a página for estática, mas estiver consistentemente bloqueada na camada de pedidos, considere uma API de pedidos gerida em vez da automação do navegador.

Compare a opção «ver código-fonte» com o DOM do navegador e inspecione o painel de rede num teste autorizado. Escolha a ferramenta menos complexa que reproduza a resposta necessária. Os navegadores resolvem a renderização e a interação, mas consomem mais memória e exigem gestão do ciclo de vida, do tempo de espera e da sessão.

GoSpider vs. hakrawler, Colly e rastreadores baseados em navegador

A nível de categoria, o GoSpider e o hakrawler são ferramentas de descoberta de URLs orientadas para a CLI, o Colly é um framework Go programável para rastreamento e extração, e os rastreadores baseados em navegador executam código do lado do cliente. A escolha certa depende do tipo de transferência de que necessita:

Categoria da ferramenta

Descoberta de URLs

Extração estruturada

Renderização de JavaScript

Adequação operacional

GoSpider

Descoberta abrangente, orientada por indicadores

Requer um passo separado

Sem execução no navegador

Inventário rápido pré-extração

hakrawler

Descoberta de ligações via CLI

Requer um passo separado

Sem execução no navegador

Fluxos de trabalho de descoberta leves

Colly

Percurso definido por código

Callbacks CSS e lógica Go

Sem execução no navegador por si só

Scrapers Go personalizados e testáveis

Rastreador de navegador

Orientado pelo DOM e pela interação

Seletores DOM ou scripts de página

Sim

SPAs, formulários, deslocamento e sessões

Para decidir como utilizar o GoSpider, opte por ele quando a amplitude da descoberta e a composição da linha de comandos forem importantes. Opte pelo Colly quando as regras de extração e a validação de registos forem predominantes. Utilize um navegador apenas quando o alvo exigir genuinamente execução ou interação.

Lista de verificação para um rastreamento responsável

Antes de cada execução:

  • Obtenha autorização e defina os hosts, percursos, contas e campos permitidos.
  • Utilize profundidade finita, baixa simultaneidade, atrasos, tempos de espera e um limite reduzido de URLs.
  • Revise os termos e o Protocolo de Exclusão de Robôs. As regras dos robôs orientam os rastreadores, mas não concedem autorização legal.
  • Interrompa a operação quando ocorrerem erros, latência ou um aumento inesperado da carga do servidor.
  • Mantenha cookies, tokens e credenciais de proxy fora do código e dos registos.
  • Não recolha dados sensíveis apenas porque um URL é detetável.
  • Registe a versão, o comando, a hora e a política de saída para fins de auditoria.

Um quadro jurídico e de conformidade para a extração de dados da Web pode transformar estas verificações numa revisão repetível.

Perguntas frequentes

O comportamento do GoSpider depende da versão instalada, do alvo e dos modos de descoberta ativados. Antes da produção, guarde gospider -h, anote a versão ou o commit do módulo e guarde um pequeno rastreio de teste com a saída esperada. A secção final de perguntas frequentes centra-se em limites conceptuais que continuam a ser úteis mesmo quando aliases individuais, valores predefinidos, etiquetas ou campos JSON se alteram. Evita também apresentar valores predefinidos específicos de uma versão como orientações intemporais.

Pontos-chave

  • Utilize o GoSpider para descobrir URLs e, em seguida, realize a normalização, a validação e a extração estruturada como etapas separadas.
  • Comece com uma profundidade finita, baixa simultaneidade por domínio, um atraso e um pequeno conjunto de destinos autorizados.
  • -c controla a concorrência de pedidos ao nível do domínio, enquanto -t controla o processamento paralelo entre alvos numa lista de sites, sujeito à verificação da versão.
  • Considere os modos «quiet», «JSON», «filters», «discovery» e os sinalizadores de proxy como sensíveis à versão. Teste-os contra um ambiente de teste controlado.
  • Diagnostique o âmbito, o acesso HTTP e a renderização do navegador separadamente antes de mudar de ferramentas.

Perguntas frequentes

O GoSpider é um rastreador da Web ou um extrator de dados da Web?

O GoSpider é, principalmente, um rastreador da Web. Descobre e segue URLs, mapeia a estrutura do site e pode revelar links de várias fontes. Geralmente, não converte páginas arbitrárias em registos validados de produtos, artigos ou tabelas. Essa etapa de extração estruturada pertence ao código do analisador, a uma estrutura de extração de dados ou a outra camada de extração de dados.

Qual é a diferença entre as opções -c e -t do GoSpider?

-c controla os pedidos simultâneos associados a um domínio correspondente, enquanto -t controla quantos sites de destino de uma lista podem ser processados em paralelo nas versões documentadas. A combinação destas opções multiplica as possibilidades de atividade. Como a semântica e os valores predefinidos podem mudar, verifique ambas as opções com a ajuda integrada e um teste controlado em vários sites.

A opção JavaScript do GoSpider executa código do lado do cliente?

Não. A funcionalidade JavaScript documentada inspeciona scripts à procura de cadeias de caracteres semelhantes a URLs, em vez de executar um motor de navegador. Pode revelar pontos finais ou rotas incorporados em pacotes, mas não reproduz atualizações do DOM, cliques, deslocamento infinito ou o estado da aplicação criado pela execução de JavaScript.

Por que razão um URL excluído ou colocado na lista negra ainda pode aparecer na saída?

Um filtro pode impedir o GoSpider de solicitar uma URL correspondente sem apagar o facto de o link ter sido descoberto em HTML ou noutra fonte. Como resultado, a URL pode ainda ser emitida como um registo de descoberta. Confirme o comportamento na sua versão e, em seguida, aplique um filtro de saída separado antes da extração.

Quando é que o GoSpider deve ser utilizado em conjunto com o Colly, um proxy, uma API de scraping ou um navegador?

Combine-o com o Colly para uma extração estruturada a partir de HTML acessível, com um proxy aprovado quando a localização da rede ou a reputação do IP constituírem um obstáculo confirmado, com uma API de pedidos quando o tratamento de bloqueios for operacionalmente dispendioso e com um navegador quando o conteúdo exigir a execução de JavaScript ou interação. As verificações de autorização e âmbito devem ser efetuadas antes de qualquer outra opção.

Conclusão

A resposta fiável sobre como utilizar o GoSpider é tratá-lo como a fase de descoberta de um pipeline. Instale-o através da cadeia de ferramentas Go, verifique a saída de ajuda atual e comece com um rastreio superficial e gradual. Utilize -S, -ce -t de forma deliberada ao expandir para vários alvos, e ative mapas do site, ficheiros robots, scripts, subdomínios ou fontes externas apenas quando essas fontes se mantiverem dentro do âmbito aprovado.

A saída do rastreador ainda requer trabalho de engenharia. Normalize os URLs, remova duplicados, aplique regras de host e caminho e analise os códigos de estado antes de enviar a lista para o Colly. Na fase de extração, utilize listas de domínios permitidos, baixo paralelismo, validação de campos e tratamento atómico dos resultados. Quando uma execução falhar, classifique-a como um problema de âmbito, um problema de acesso HTTP ou um problema de renderização antes de recorrer a outra ferramenta.

Se estiverem autorizadas, as páginas renderizadas pelo servidor são consistentemente bloqueadas e, caso pretenda manter o pipeline focado em HTML bruto e na análise do Colly, a API Scraper da WebScrapingAPI pode gerir a rotação de proxies, CAPTCHAs e o bloqueio de pedidos por trás de um único ponto de extremidade. Utilize essa transferência apenas após confirmar que o problema se situa na camada de pedidos, e não na falta de interação do navegador ou em permissões insuficientes.

Sobre o autor

Suciu Dan, Co-fundador @ WebScrapingAPI

Suciu Dan

Co-fundador

Suciu Dan é cofundador da WebScrapingAPI e escreve guias práticos, voltados para programadores, sobre web scraping em Python, web scraping em Ruby e infraestruturas de proxy.

Comece a construir

Pronto para expandir a sua recolha de dados?

Junte-se a mais de 2.000 empresas que utilizam a WebScrapingAPI para extrair dados da Web à escala empresarial, sem quaisquer custos de infraestrutura.