De volta ao blog

Como Criar um Scraper para Shopify com Playwright

Daniel Kim
Daniel Kim

Lead Scraping Automation Engineer

12-Oct-2026

TL;DR:

  • Um scraper de Shopify deve descobrir URLs de produto antes de extrair campos. Links de produto de mesma origem são mais duráveis que classes de estilização do tema.
  • Dados públicos estruturados de produto podem expor variantes sem clicar em cada amostra. Verifique a resposta na loja-alvo antes de depender dela.
  • Playwright pode preservar o contexto do navegador enquanto lê dados da vitrine. Mantenha as requisições de produto e moeda dentro desse contexto.
  • O exemplo local retorna identificadores de variantes e valores de preço brutos. Conversão de moeda e correspondência entre lojas permanecem tarefas separadas.
  • Gratuito para começar. Novas contas Scrapeless incluem runtime gratuito do Scraping Browser — inscreva-se em app.scrapeless.com.

Introdução: Cards de Produto Não Descrevem Todas as Variantes

Um card de produto na vitrine geralmente resume várias variantes compráveis. Ler o preço exibido no card é útil para descoberta, mas não estabelece o preço e a disponibilidade de cada tamanho ou cor.

Este tutorial de extração de dados de produto Shopify usa Playwright para abrir uma vitrine pública, descobrir um link de produto e ler dados estruturados de variantes no contexto de navegador da página. O exemplo é deliberadamente limitado a um produto. Você pode inspecionar os campos retornados antes de criar um job de catálogo maior.

Playwright controla o navegador; seu contrato de extração decide o que significa um registro válido. O fluxo de trabalho de alerta de queda de preço explica como observações registradas podem se tornar eventos a jusante.

Escolha a Fonte de Extração Antes do Seletor

A fonte mais útil é a superfície pública mais estável que contém os campos necessários.

Surface Good fit Limitation to check
Public product response Variant IDs, option arrays, price fields Access and completeness vary by storefront
Embedded structured data Product identity and a described offer May summarize only the selected offer
Rendered product controls State after a size, market, or purchase option is selected Requires store-specific inspection
Product-link URL pattern Discovery and deduplication Headless storefronts can use another route shape

O exemplo usa um link /products/<handle> observado e, em seguida, lê a resposta pública .js do produto. A interface Ajax de produto da Shopify documenta essa rota e requisições com reconhecimento de localidade. Seu array de variantes tem um limite documentado; não declare cobertura total de um grande catálogo de variantes apenas porque a requisição foi bem-sucedida.

Quando uma vitrine precisa de interação para expor uma oferta, inspecione seus controles e espere por um marcador de estado específico do produto após a interação. Um seletor de preço genérico pode, acidentalmente, selecionar um card de recomendação, um valor de financiamento ou o preço da variante anterior.

Pré-requisitos e Instalação

O exemplo local precisa de Node.js, pnpm e do runtime Chromium do Playwright.

Use uma versão de Node.js suportada pelo pacote Playwright instalado. O ambiente verificado usou Node.js 24. A extensão em nuvem requer adicionalmente uma conta Scrapeless ativa e uma chave de API de serviço em SCRAPELESS_API_KEY; essa credencial é um pré-requisito e não é necessária para o coletor local.

Execute estes comandos em um novo diretório de trabalho:

bash Copy
pnpm add playwright @scrapeless-ai/sdk
pnpm exec playwright install chromium

A instalação da biblioteca de navegador do Playwright separa o pacote do download do navegador. Salve exemplos JavaScript como arquivos .mjs para que o Node.js os trate como módulos ES. A extensão em nuvem usa o SDK Node.js do Scrapeless.

Construa o Coletor Local de Descoberta e Extração

O coletor encontra um link de produto verificado e retorna cada variante a partir de uma resposta estruturada.

Salve isto como shopify.mjs e execute node shopify.mjs. O produto específico é um exemplo público, então verifique novamente a URL e a política da loja antes de reutilizá-lo. O script relata a ausência do link de descoberta em vez de alternar silenciosamente para outro item.

javascript Copy
import { chromium } from 'playwright';

const browser = await chromium.launch({ headless: true });
try {
  const context = await browser.newContext();
  const page = await context.newPage();
  await page.goto('https://www.taylorstitch.com/', {
    waitUntil: 'domcontentloaded', timeout: 45000
  });

  const result = await page.evaluate(async () => {
    const link = Array.from(document.querySelectorAll('a[href]'))
      .map(a => new URL(a.href))
      .find(u => u.origin === location.origin &&
        /^\/products\/jack-in-valley-plaid-waffle-2610\/?$/.test(u.pathname));
    if (!link) throw new Error('Expected product anchor is absent');

    const root = window.Shopify.routes.root;
    const productResponse = await fetch(link.pathname.replace(/\/$/, '') + '.js');
    const cartResponse = await fetch(root + 'cart.js');
    if (!productResponse.ok || !cartResponse.ok) {
      throw new Error('Product or currency response unavailable');
    }
    const product = await productResponse.json();
    const cart = await cartResponse.json();
    if (!product.id || !Array.isArray(product.variants) || !cart.currency) {
      throw new Error('Incomplete public product response');
    }
    return {
      product_id: String(product.id), title: product.title,
      source_url: link.href, currency: cart.currency,
      observed_at: new Date().toISOString(),
      variants: product.variants.map(v => ({
        variant_id: String(v.id), options: v.options,
        price_raw: v.price, compare_at_price_raw: v.compare_at_price ?? null,
        available: v.available, sku: v.sku ?? null
      }))
    };
  });
  console.log(JSON.stringify(result, null, 2));
} finally {
  await browser.close();
}

domcontentloaded é o limite de navegação, em vez de uma promessa de que todos os widgets terminaram. A página inicial verificada expõe o link do produto nesse limite. Para outro tema, aguarde o link real ou o controle de produto de que você precisa antes de extraí-lo.

A requisição de carrinho somente leitura identifica a moeda de apresentação para esse contexto de navegador. Ela não adiciona um item nem inicia o checkout. As leituras de produto e moeda ainda ocorrem em instantes diferentes; não as descreva como um snapshot atômico de inventário.

Preserve o Contrato de Variantes Retornado

O resultado é um envelope de produto com um array de variantes, não um histórico de preços de concorrentes pronto para uso.

Campo Significado Regra de validação
product_id Identificador do produto da loja, serializado como texto Deve estar presente
source_url URL pública do produto descoberta Manter o host da vitrine
currency Moeda reportada no contexto atual do navegador Deve ser conhecida antes da comparação
observed_at Momento da captura do coletor Manter junto aos campos que mudam
variant_id Identificador da variante da loja Deve permanecer vinculado ao seu pai
options Valores das opções de origem Preservar ordem e valores
price_raw Valor monetário na unidade nativa da resposta Confirmar a semântica da unidade antes da exibição
compare_at_price_raw Quantia de comparação anulável Nulo não significa zero
available Sinal público de possibilidade de compra Não é uma quantidade de inventário
sku SKU de comerciante opcional da origem Não é um identificador de produto universal

O produto verificado continha seis variantes e o contexto reportou USD. Essas observações estabelecem que esse caminho extrai dados reais de produto da fonte selecionada; elas não estabelecem que toda vitrine Shopify use o mesmo tema ou configuração de acesso.

O vocabulário de produto é útil para distinguir atributos de identidade e descritivos dos campos comerciais mutáveis de uma oferta. Preserve essa fronteira ao achatar variantes em linhas de armazém.

Comece a Fazer Scraping com o Scrapeless

Potencialize seu fluxo de trabalho de web scraping e automação com o Scrapeless!
Cadastre-se hoje e ganhe US$ 5 em crédito grátis — sem necessidade de cartão de crédito.

Solicite seu crédito gratuito agora no Scrapeless Dashboard.

A descoberta de catálogo precisa de uma regra explícita de parada e de um conjunto persistente de URLs visitadas.

Para um scraper baseado em coleção, inspecione o link real de próxima página ou o mecanismo de paginação documentado da vitrine. Mantenha a descoberta de coleções separada da extração de produtos. Desduplicate caminhos canônicos de produto para que um item que apareça em várias coleções não se torne vários produtos.

Registre se uma execução é um escopo completo aprovado ou uma amostra parcial. O exemplo de produto único é uma amostra; ele não pode estabelecer o tamanho do catálogo da loja. Um limite de array de variantes, uma coleção filtrada ou uma página inacessível devem aparecer como uma limitação de cobertura na sua saída.

Para fazer scraping de páginas dinâmicas de produtos Shopify, preserve a seleção exata de opções e o estado visível quando a fonte estruturada for insuficiente. Não copie um preço mínimo do pai para cada linha de variante. Pare quando a oferta selecionada não puder ser identificada com confiança.

A Extensão em Nuvem para Playwright

O Scrapeless Agent Browser pode executar uma sessão Playwright remotamente enquanto seu coletor mantém sua própria lógica de validação.

Use a conexão Playwright documentada quando hospedar o navegador localmente se tornar um encargo operacional. O SDK cria a sessão do navegador; o Playwright se conecta ao endpoint retornado.

Nota: A conexão em nuvem a seguir exige uma chave de API de serviço Scrapeless ativa em SCRAPELESS_API_KEY. O exemplo de coleta local é executado de forma independente. Esta etapa dependente de credencial deve ser executada na sua conta antes de implantar o caminho em nuvem.

javascript Copy
import { Scrapeless } from '@scrapeless-ai/sdk';
import { chromium } from 'playwright';

const client = new Scrapeless();
const { browserWSEndpoint } = await client.browser.create({
  sessionName: 'shopify-public-product',
  sessionTTL: 180,
  proxyCountry: 'US'
});
const browser = await chromium.connectOverCDP(browserWSEndpoint);
try {
  const page = await browser.newPage();
  await page.goto('https://www.taylorstitch.com/', {
    waitUntil: 'domcontentloaded'
  });
  console.log(await page.title());
} finally {
  await browser.close();
}

Depois de confirmar a conexão, aplique a mesma rotina de descoberta e extração dentro dessa sessão. O roteamento por país é um parâmetro do navegador; verifique a moeda e o locale da vitrine em vez de inferi-los apenas pela configuração do proxy. Avalie o Agent Browser e a precificação de runtime em relação ao seu cronograma de coleta.

Solucione Dados Ausentes na Fronteira da Fonte

Dados ausentes devem ser diagnosticados antes que se tornem um registro de produto armazenado.

Sintoma Verificação Destinação segura
Nenhuma âncora de produto Caminho canônico e associação atual à coleção Marcar descoberta incompleta
HTML em vez de JSON Desafio de acesso ou comportamento de endpoint diferente Reter extração
Variante ausente Limite de resposta e produto selecionado Marcar cobertura incompleta
Moeda alterada Locale, cookies e seleção de mercado Iniciar uma série de contexto distinta
Preço vazio Semântica de oferta selecionada e campo de origem Manter desconhecido; nunca inserir zero

Revise as regras de acesso da loja antes de agendar o trabalho. O padrão de exclusão de crawlers descreve as preferências de robôs, enquanto termos e permissões regem o limite de acesso mais amplo.

Conclusão: Mantenha Descoberta, Contexto e Saída Juntos

Um scraper de Shopify com Playwright se torna mais fácil de manter quando a descoberta de produtos usa links duráveis e a extração de variantes usa uma fonte estruturada verificada. Preserve o contexto do navegador, mantenha os campos de valores monetários explícitos e valide o resultado antes de armazená-lo. Expanda além do exemplo apenas depois de verificar paginação, limites de acesso e completude das variantes para a vitrine alvo.

Pronto para Construir seu Workflow de Coleção Shopify?

Junte-se à nossa comunidade para reivindicar um plano gratuito e se conectar com desenvolvedores que trabalham em coleta de ecommerce baseada em navegador: Discord · Telegram.

Cadastre-se em app.scrapeless.com e aplique o contrato de extração verificado às suas fontes de produtos aprovadas.

FAQ

P: Coletar dados públicos de produtos Shopify é legal?

A resposta depende da sua jurisdição, dos termos da loja, do seu método de acesso e do uso pretendido. Revise essas condições e consulte assessoria jurídica quando necessário. Mantenha o workflow em superfícies de produtos públicas e permitidas.

P: Você precisa de um proxy para construir um scraper de Shopify?

O exemplo local verificado lê uma fonte pública acessível sem proxy. A extensão em nuvem define proxyCountry para US para roteamento consistente; seleção de moeda e mercado ainda exigem validação separada.

P: Como o scraper deve lidar com uma página de WAF ou Access Denied?

Trate o resultado como uma coleta não confirmada, não como dados de produto. Para um workflow em nuvem autorizado, abra a página inicial primeiro na mesma sessão e então aguarde um marcador de produto real. Pare quando a vitrine não permitir o acesso solicitado.

P: O que muda quando um tema Shopify rotaciona suas classes de DOM?

Reinspecione o markup ao vivo e preserve a URL estável do produto ou a fonte estruturada sempre que possível. Atualize os seletores somente depois de confirmar que eles apontam para o produto e variante selecionados.

P: Isso pode rodar sem um agente de IA?

Sim. O script local roda diretamente com Node.js. Um agente pode ajudar a inspecionar outra vitrine, mas não é necessário para executar o coletor.

P: Como devem ser tratados a concorrência e as URLs de produtos?

Comece com um worker por loja e a URL canônica descoberta a partir de seus links públicos. Se a loja permitir coleta paralela, use um teto inicial de três workers por host ou seu limite mais restritivo. Mantenha a seleção de variantes separada da identidade canônica do produto.

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