Grok Web Scraping: Um Guia Prático de Python
Lead Scraping Automation Engineer
Resumo:
- A API do Grok fala fluentemente OpenAI, o que a torna um mecanismo de extração direto. Aponte o SDK Python oficial da OpenAI para
https://api.x.ai/v1e o modelo transforma o texto da página em registros JSON comtemperature=0eresponse_format={"type": "json_object"}. - O que o Grok não faz é buscar. O modelo não possui navegador e nem sessão; a ferramenta de busca na web do servidor da xAI fundamenta as respostas com resultados ao vivo, e a extração em massa de páginas continua sendo sua responsabilidade.
- A diferença é visível em um script. Um GET simples em uma página de demonstração renderizada em JavaScript contém 0 elementos de citação; a mesma URL através da API de Extração Universal Scrapeless com
js_rendercontém todos os 10 — e esse HTML renderizado é de onde o Grok extrai. - A extração é real neste guia, não hipotética. Uma execução ao vivo contra a página renderizada retornou todas as 10 citações com autores e arrays de tags intactas — 3.211 tokens para toda a chamada.
- Ainda não tem chave da xAI? O pedido idêntico passa pelo OpenRouter. Mesmo SDK da OpenAI,
base_urle string de modelo diferentes; este guia mostra ambos os caminhos. - Gratuito para começar do lado da busca. Crie sua chave da API Scrapeless em app.scrapeless.com.
O Grok pode raspar websites?
O Grok pode ler uma página que você lhe der e retornar exatamente os campos que você pedir; ele não pode acessar essa página em volume de raspagem. Essas são as duas metades de toda configuração de "raspagem web do Grok", e confundi-las é como projetos estagnam. A API xAI expõe um modelo de linguagem - um que, por acaso, é incomumente fácil de configurar, porque o endpoint aceita a mesma forma de solicitação que a da OpenAI - mas a busca HTTP, a renderização em JavaScript, o estado da sessão e os desafios de acesso vivem fora dela.
A xAI realmente oferece uma ferramenta de busca na web do lado do servidor, e merece uma frase honesta: ela permite que o Grok pesquise e leia a web ao vivo para fundamentar uma resposta. Isso é recuperação para questionamento e resposta. Ela não dá a você controle sobre quais páginas são buscadas, como elas são renderizadas ou quantas você pode processar - as três coisas sobre as quais um pipeline de raspagem é construído.
Portanto, a arquitetura funcional é composta por duas camadas: uma camada de busca que retorna HTML renderizado fielmente e o Grok como a camada de extração que o transforma em registros. Mais uma desambiguação antes do código: este guia aponta o Grok para a web. Apontar um raspador para o Grok - capturando suas respostas como dados - é a tarefa oposta, coberta pelo guia da API do Raspador Grok e pela explicação do raspador LLM.
Instalar
Todo o conjunto de ferramentas é o SDK da OpenAI mais requests — as versões contra as quais este guia foi escrito são openai 2.34.0 e a atual requests:
bash
pip install "openai==2.34.0" requests
Configurar
As chaves ficam no ambiente, nunca no código-fonte:
bash
export XAI_API_KEY="xai-sua_chave"
export SCRAPELESS_API_KEY="sk_sua_chave_scrapeless"
Obter uma página que o Grok possa realmente ler
A qualidade da extração é limitada pela fidelidade da busca, portanto, comece onde a maioria dos tutoriais do Grok termina. Em páginas renderizadas em JavaScript, o documento que um cliente HTTP simples recebe não é o documento que um leitor vê — o conteúdo chega apenas depois que os scripts constroem o DOM, um ciclo de vida definido pela especificação de script HTML. Um script mostra a diferença e salva a versão que vale a pena extrair:
python
# fetch_rendered.py — GET simples vs renderização do lado do servidor, mesma URL
import os
import requests
URL = "https://quotes.toscrape.com/js/"
MARKER = '<span class="text"'
plain = requests.get(URL, timeout=60).text
print(f"GET simples: {len(plain):,} caracteres | elementos de citação: {plain.count(MARKER)}")
resp = requests.post(
"https://api.scrapeless.com/api/v1/unlocker/request",
headers={
"Content-Type": "application/json",
"x-api-token": os.environ["SCRAPELESS_API_KEY"],
},
json={
"actor": "unlocker.webunlocker",
"input": {"url": URL, "method": "GET", "js_render": True},
},
timeout=120,
)
resp.raise_for_status()
rendered = resp.json().get("data", "")
print(f"renderizado: {len(rendered):,} caracteres | elementos de citação: {rendered.count(MARKER)}")
with open("page.html", "w", encoding="utf-8") as f:
f.write(rendered)
A execução imprime elementos de citação: 0 para a busca simples e elementos de citação: 10 para a renderizada. Renderização, desbloqueio e roteamento de proxy ocorrem todos no lado do servidor em um único POST — a API Universal Scraping é a camada de busca, e page.html agora é algo de onde um modelo pode extrair.
Implementação básica: Grok como o extrator
O endpoint xAI recebe a solicitação padrão de chat-completions do OpenAI. Dois parâmetros garantem a confiabilidade: temperature=0 mantém a saída estável entre as execuções, e o modo JSON a mantém analisável. Nomeie as chaves exatas que você deseja na mensagem do sistema e diga ao modelo o que fazer com valores ausentes.
Nota: Este bloco precisa de uma
XAI_API_KEYcom crédito — a única pré-condição que este guia não assume. A próxima seção executa a extração idêntica ao vivo através do OpenRouter, com a saída capturada.
python
# extract_grok.py — Extração Grok via a API xAI (requer XAI_API_KEY)
import json
import os
from openai import OpenAI
client = OpenAI(
base_url="https://api.x.ai/v1",
api_key=os.environ["XAI_API_KEY"],
)
page_html = open("page.html", encoding="utf-8").read()
completion = client.chat.completions.create(
model="grok-4.5",
temperature=0,
response_format={"type": "json_object"},
messages=[
{
"role": "system",
"content": 'Extraia todas as citações. Responda SOMENTE com JSON: '
'{"quotes":[{"text":str,"author":str,"tags":[str]}]}. Use null para valores ausentes.',
},
{"role": "user", "content": page_html},
],
)
data = json.loads(completion.choices[0].message.content)
print(f"extraídas {len(data['quotes'])} citações")
grok-4.5 é o modelo no qual a documentação atual da xAI se centra; troque pelo nível que sua conta utiliza. A forma da solicitação não muda.
Sem chave xAI? Execute a mesma solicitação via OpenRouter
Como a solicitação é moldada no formato OpenAI de ponta a ponta, uma chave de agregador funciona com duas edições: a base_url e a string do modelo. Esta é a variante que este guia executou de fato — busca e extração em um único script autocontido:
python
# extract_openrouter.py — a mesma extração, executada via OpenRouter
import json
import os
import requests
from openai import OpenAI
resp = requests.post(
"https://api.scrapeless.com/api/v1/unlocker/request",
headers={
"Content-Type": "application/json",
"x-api-token": os.environ["SCRAPELESS_API_KEY"],
},
json={
"actor": "unlocker.webunlocker",
"input": {"url": "https://quotes.toscrape.com/js/", "method": "GET", "js_render": True},
},
timeout=120,
)
resp.raise_for_status()
page_html = resp.json().get("data", "")
client = OpenAI(
base_url="https://openrouter.ai/api/v1",
api_key=os.environ["OPENROUTER_API_KEY"],
)
completion = client.chat.completions.create(
model="x-ai/grok-4.20",
temperature=0,
response_format={"type": "json_object"},
messages=[
{
"role": "system",
"content": 'Extraia todas as citações. Responda SOMENTE com JSON: '
'{"quotes":[{"text":str,"author":str,"tags":[str]}]}. Use null para valores ausentes.',
},
{"role": "user", "content": page_html},
],
)
data = json.loads(completion.choices[0].message.content)
print(f"extraídas {len(data['quotes'])} citações da página renderizada")
print(json.dumps(data["quotes"][0], ensure_ascii=False))
A execução ao vivo extraiu todas as 10 citações e imprimiu a primeira:
text
extraídas 10 citações da página renderizada
{"text": "“O mundo como o criamos é um processo do nosso pensamento. Ele não pode ser mudado sem mudar nosso pensamento.”", "author": "Albert Einstein", "tags": ["mudança", "pensamentos profundos", "pensamento", "mundo"]}
Autores e arrays de tags vieram intactos, e toda a chamada custou 3.211 tokens. Isso é o scraper inteiro: um POST para buscar, uma conclusão para extrair, sem seletores em nenhum lugar.
Obtenha sua chave de API no plano gratuito: app.scrapeless.com
Padrões avançados
- Fixe o esquema na mensagem do sistema, não no prompt do usuário. O HTML da página vai na vez do usuário; o contrato permanece na vez do sistema, onde sobrevive a loops de página para página.
- Loop em Python, não no prompt. Uma página por conclusão mantém registros de não se misturarem e torna falhas atribuíveis a uma URL específica.
- Envie menos página quando puder. Grok lê todo o documento que você envia, chrome e tudo. Isolar o contêiner de conteúdo — ou buscar markdown em vez de HTML — reduz o gasto de tokens aproximadamente na proporção.
- Trate tags e listas de forma explícita. Nomear
tags:[str]no esquema é o que produz arrays limpos na execução acima; deixe os campos de lista sem descrição e os modelos os achatam em strings.
Resolução de Problemas
- Prosa em vez de JSON. Você removeu
response_format={"type": "json_object"}— com isso, o endpoint restringe a saída; sem isso, você está interpretando boa vontade. - Esperados dez registros, três retornados. Verifique o que você buscou antes de culpar o modelo: conte um elemento conhecido no HTML da maneira que o script de busca faz. Uma busca quase vazia significa um problema de renderização, corrigido na camada de busca com
js_render. - Saída diferente com entrada idêntica. Defina
temperature=0; a extração não é uma tarefa de criatividade. - Custos aumentam. O gasto em tokens acompanha o tamanho da entrada. Corte a página, não realize lotes, e fique de olho na contagem de tokens por página da maneira que a execução acima os relata.
Conclusão
O Grok ganha seu lugar em um scraper como a camada que nunca vê a rede: pedidos moldados pela OpenAI, configurações determinísticas, uma página por vez, um objeto JSON por vez. A camada que decide se tudo isso é possível é a busca — o print de 0 versus 10 do primeiro script resolve essa questão — e um POST renderizado pelo servidor fecha a lacuna. Conecte os dois e as dez citações da página de demonstração chegam como registros validados, tags e tudo mais.
Pronto para Alimentar o Grok com Páginas Reais?
A camada de busca neste guia é um POST por página na API Universais de Scraping — planos e volumes estão na página de preços, e a documentação do desenvolvedor cobre os parâmetros unlocker.webunlocker. Crie uma chave no plano gratuito em app.scrapeless.com e reexecute ambos os scripts conforme escrito.
FAQ
Q: O Grok pode raspar sites por conta própria?
Não. A API Grok extrai do texto que você fornece; não pode emitir pedidos, renderizar JavaScript ou manter sessões. Sua ferramenta de busca na web lê a web ao vivo para fundamentar respostas, mas a seleção de páginas, a fidelidade de renderização e o volume permanecem fora do seu controle — uma pipeline de scraping precisa de sua própria camada de busca.
Q: A pesquisa na web incorporada do Grok é a mesma coisa que raspagem da web?
Trabalhos diferentes. A ferramenta de busca recupera contexto para que o modelo possa responder a uma pergunta; raspagem recupera páginas específicas para que você possa extrair campos específicos em um volume que você escolher. Use a ferramenta quando você quiser respostas, e a pipeline de duas camadas deste guia quando você quiser dados.
Q: Como isso difere de um scraper do Grok?
Direção. Aqui, o Grok é o analisador e a web é o alvo. Um scraper do Grok inverte isso — ele captura as próprias respostas do Grok como dados estruturados, que o Scrapeless envia como um ator; o guia da API do Scraper Grok vinculado na introdução cobre esse trabalho.
Q: Qual modelo do Grok devo usar para extração?
O mais barato que mantém seu esquema. A extração com um contrato JSON rigoroso e temperature=0 não é uma tarefa que exige raciocínio pesado, então comece pequeno — a execução ao vivo neste guia usou um nível do Grok de menor preço através do OpenRouter e retornou todos os 10 registros corretamente — e avance apenas se os campos começarem a voltar errados.
Q: É legal raspar com Grok?
O modelo não altera as regras de coleta. Busque apenas páginas públicas, respeite os termos do site e as diretrizes de robôs padronizadas pelo Protocolo de Exclusão de Robôs, mantenha os volumes limitados e lide com dados pessoais sob as leis que se aplicam a você — além dos termos de uso da xAI do lado do modelo.
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.



