Ir para o conteúdo

Raspando aplicativos de página única com Playwright: um guia detalhado

Aplicativos de página única, ou SPAs, tornaram-se a norma para o desenvolvimento web moderno. Ao contrário dos sites tradicionais de várias páginas, os SPAs atualizam dinamicamente o conteúdo e renderizam páginas usando JavaScript sem exigir recarregamentos completos da página. Isso cria uma experiência tranquila, semelhante a um aplicativo, para os usuários.

No entanto, a maior dependência do JavaScript do lado do cliente e do carregamento assíncrono de dados apresenta desafios únicos para a extração de dados de aplicativos de página única. As ferramentas tradicionais de scraping são insuficientes, pois são projetadas para sites estáticos e análise de HTML.

Neste guia abrangente com mais de 3200 palavras, você aprenderá técnicas comprovadas para enfrentar os obstáculos comuns enfrentados ao destruir SPAs modernos usando o Playwright.

Por que raspar SPAs é desafiador

Antes de mergulharmos nas soluções, é importante entender o que torna os aplicativos de página única difíceis de serem eliminados.

Uso pesado de JavaScript do lado do cliente

O HTML inicialmente servido pelo servidor é essencialmente um shell estático da página. O conteúdo real é gerado dinamicamente e renderizado no lado do cliente via JavaScript. Isso significa que muitos dos dados existem apenas em objetos JavaScript e elementos DOM, e não na fonte HTML inicial.

Carregamento de dados assíncronos

Os SPAs frequentemente buscam novo conteúdo de forma assíncrona em segundo plano e atualizam a página sem recarregar completamente. Muitas vezes, os dados não estão disponíveis antecipadamente quando a página é carregada pela primeira vez.

De acordo com métricas da Radware, uma página da web média faz mais de 100 solicitações a recursos externos durante a renderização.

AnoMédia de solicitações de página
201133
201656
2019105

Com o uso intenso de tecnologias como AJAX, os dados necessários ainda podem estar sendo carregados em segundo plano quando você tenta extraí-los. Isso faz com que dados incompletos sejam extraídos.

Manipulação Dinâmica de DOM

Os componentes e elementos renderizados em um SPA podem mudar rapidamente em resposta à entrada do usuário. O conteúdo é gerado, adicionado, removido ou atualizado dinamicamente conforme o usuário interage com o aplicativo.

Tentar direcionar os elementos pela sua posição inicial no DOM é frágil, pois muda com muita frequência.

Confiança em APIs e solicitações AJAX

Os SPAs usam extensivamente APIs REST, GraphQL, WebSockets e solicitações AJAX para buscar dados de servidores back-end. O conteúdo é então renderizado no lado do cliente.

Essa troca de dados entre cliente e servidor é invisível para abordagens tradicionais de scraping que veem apenas a resposta HTML inicial.

Sessões e estado autenticados

SPAs complexos frequentemente exigem que os usuários façam login antes de acessar conteúdo e dados privados. Este estado de autenticação precisa ser mantido adequadamente nos scripts de extração.

Os cookies que armazenam IDs de sessão, IDs de usuário e tokens devem ser manipulados para imitar uma sessão de usuário autenticada.

A necessidade de execução de JavaScript

Ao contrário dos sites estáticos, a análise pura de HTML não é suficiente para SPAs. A página deve ser renderizada executando JavaScript em um ambiente semelhante ao de um navegador para gerar a estrutura de dados final.

Navegadores headless como o Playwright fornecem esse recurso para produzir a experiência realista do usuário final necessária para raspar SPAs.

Esses desafios tornam a raspagem de SPA eficaz bastante diferente da raspagem de web convencional. Vamos agora ver como o Playwright pode ajudá-lo a superar esses obstáculos.

Por que usar o Playwright para raspar SPAs?

Playwright é uma biblioteca Node.js para automatizar navegadores populares como Chromium, Firefox e WebKit. Os principais recursos relevantes para raspagem de SPA incluem:

Automação de navegador sem cabeça

O Playwright pode controlar os navegadores sem renderizar uma IU visível, conhecido como modo headless. Isso permite a execução de páginas pesadas em JavaScript para preencher dados.

Aguardando Elementos e Condições

Mecanismos de espera integrados inteligentes evitam erros de raspagem, aguardando que os elementos ou funções atinjam os estados desejados antes de interagir.

Simulação de solicitações de API

O Playwright permite interceptar solicitações e responder com dados simulados em vez de chamar APIs reais. Isso permite a extração de dados AJAX.

Teste Responsivo

Emule dispositivos móveis, regiões geográficas e otimização de CPU para lidar com necessidades de testes de design responsivos.

Visualizador de rastreamento

Visualize scripts do Playwright para entender as interações exatas do navegador e diagnosticar problemas.

Tratamento automático de pop-ups e caixas de diálogo

O Playwright lida automaticamente com alertas, confirmações, prompts, solicitações de autenticação e downloads, simplificando a lógica do script.

Seletores e API DOM

API rica para extrair dados por meio de seletores CSS ou percorrer diretamente elementos DOM como uma página da web normal.

Esses recursos tornam o Playwright adequado para os desafios apresentados por aplicativos da web de página única. As principais alternativas como Puppeteer, Selenium e HtmlUnit, embora úteis para testes gerais de navegador, não possuem o conjunto robusto de recursos do Playwright para uma raspagem de SPA eficaz.

A seguir, vamos examinar alguns exemplos de código que demonstram padrões de extração de chaves usando o Playwright.

Raspando padrões para SPAs usando Playwright

Abaixo exploraremos algumas técnicas comuns de scraping para superar desafios específicos de SPA.

Aguarde o carregamento do conteúdo

Um dos desafios mais fundamentais da raspagem de SPA é permitir que o conteúdo carregue antes da extração.

Em vez de tentar extrair os dados imediatamente, precisamos aguardar que a renderização assíncrona do JavaScript termine de preencher a página.

Dramaturgo page.waitForSelector() O método permite esperar que um seletor específico apareça antes de executar comandos adicionais:

// Navigate to SPA
await page.goto(‘https://spa.com‘);

// Wait for content to load
await page.waitForSelector(‘.content‘);

// Extract data now that .content exists
const data = await page.$eval(‘.content‘, elem => elem.textContent); 

Isso espera até que o elemento com classe content está disponível no DOM antes de extrair seu conteúdo de texto.

Sem essa espera, .content pode não existir ainda se ainda estiver carregando de forma assíncrona, causando erros. Esse atraso simples permite que o SPA busque e renderize novos dados, permitindo a extração subsequente.

WaitForFunction

Em alguns casos, podemos precisar esperar que condições JavaScript mais complexas sejam verdadeiras, em vez de um simples seletor. Aqui podemos usar page.waitForFunction():

// Wait for data to load
await page.waitForFunction(() => {
  return window.store.articles.length > 0 ;
});

// Store now has loaded articles
const articles = await page.evaluate(() => {
  return window.store.articles; 
});

Isso pesquisa a página até o personalizado window.store.articles condição retorna verdadeira antes de ler os dados.

A espera inteligente por seletores e condições evita falhas de extração devido ao carregamento assíncrono de dados da página.

Lidar com atualizações de conteúdo dinâmico

Os aplicativos de página única podem atualizar o conteúdo dinamicamente em resposta às entradas e eventos do usuário sem recarregar a página.

Um exemplo comum é a rolagem infinita, onde novos elementos são anexados quando o usuário rola para baixo.

Para lidar com elementos adicionados dinamicamente, podemos ouvir alterações no DOM usando observadores de mutação:

// Monitor mutations
await page.evaluate(() => {

  const observer = new MutationObserver(mutations => {
    console.log(‘Added nodes:‘, mutations[0].addedNodes);
  });

  observer.observe(document, { 
    childList: true,
    subtree: true
  });

});

A observer será notificado sempre que novos elementos forem adicionados ao corpo da página. Podemos então acionar nossa lógica de raspagem em resposta a essas mutações.

Isso permite a adaptação às atualizações de conteúdo em vez de apenas lidar com o carregamento inicial da página.

Solicitações simuladas de API

Os SPAs usam extensivamente APIs REST e GraphQL para buscar dados do lado do cliente.

Para interceptar essas solicitações, podemos definir rotas no Playwright para simular respostas:

await page.route(‘/api/articles‘, route => {
  route.fulfill({
    status: 200,
    body: JSON.stringify([
      {title: ‘Article 1‘},
      {title: ‘Article 2‘}  
    ])
  }); 
});

// Mock response will be returned from /api/articles
await page.goto(‘/page-that-calls-api‘) 

Quando o SPA tenta ligar /api/articles, nosso manipulador responderá com a resposta falsa definida em vez de acessar a API real.

Isso permite extrair dados da API sem efeitos colaterais. Podemos construir respostas robustas para lidar com diferentes cenários que nosso código SPA pode esperar.

Autenticar sessão

A extração de áreas de contas privadas em SPAs requer o tratamento adequado da autenticação.

Uma abordagem simples é fazer login normalmente por meio da IU antes de fazer a raspagem:

// Navigate to login page
await page.goto(‘/login‘);

// Enter credentials and submit form 
await page.type(‘#email‘, ‘[email protected]‘);
await page.type(‘#password‘, ‘secret‘);
await page.click(‘#submit‘);

// Session now authenticated
// Crawl member pages 

Isso aproveita os recursos do Playwright para automatizar preenchimentos de formulários e cliques, criando uma sessão de navegador autenticada.

Para melhores resultados, faça o login em um beforeAll enganche e reutilize o browser e page contexto durante os testes para compartilhar cookies.

Tratamento de design responsivo

Os SPAs frequentemente adaptam seu layout e conteúdo para diferentes tamanhos de dispositivos. Para testar esses cenários responsivos, podemos emular navegadores móveis usando page.emulate():

await page.emulate({
  viewport: {
    width: 400,  
    height: 800
  },
  userAgent: ‘...‘,
});

Definir uma janela de visualização e um agente de usuário para iPhone permite renderizar a página como um dispositivo móvel faria.

Combine emulação com waitForSelector e você pode lidar com designs responsivos de maneira confiável.

A emulação de diferentes ambientes ajuda a garantir que seu scraper se adapte ao SPA em desktops e dispositivos móveis.

Bibliotecas auxiliares de raspador

Serviços como Apificar e RaspagemBee fornece bibliotecas baseadas em Playwright que lidam de forma inteligente com a espera por conteúdo, automatizam a rolagem para atualizações dinâmicas de páginas, aceleram solicitações e muito mais.

Essas ferramentas podem simplificar a escrita de scripts robustos de raspagem de SPA.

Roteiro prático de raspador de dramaturgo

Vamos agora reunir essas abordagens em um scraper do mundo real para um SPA hipotético:

const { chromium } = require(‘playwright‘);

(async () => {

  const browser = await chromium.launch();
  const page = await browser.newPage();  

  // Login to scrape private content
  await page.goto(‘/login‘);
  await page.type(‘#email‘, ‘[email protected]‘);
  await page.type(‘#password‘, ‘secret‘); 
  await page.click(‘#submit‘);

  await page.waitForNavigation();

  // Navigate to SPA
  await page.goto(‘/app‘);

  // Wait for content to load
  await page.waitForSelector(‘.content‘);

  // Monitor mutations
  page.evaluate(() => {
    new MutationObserver().observe(document, {
      childList: true 
    });    
  });

  // Mock API response
  page.route(‘/api/articles‘, route => {
    route.fulfill({ /*...mock response...*/ }); 
  });

  // Extract content 
  const data = await page.evaluate(() => {
    const content = document.querySelector(‘.content‘);
    return content.innerText;
  });

  console.log(data);

  await browser.close();

})();

Este script faz login no aplicativo privado, aguarda o carregamento do conteúdo autenticado, lida com mutações dinâmicas, simula a resposta da API e extrai os dados para const data.

As técnicas podem ser adaptadas para desenvolver raspadores robustos para SPAs do mundo real.

Raspando SPAs em escala

Para SPAs grandes, copiar apenas algumas páginas manualmente pode ser bastante fácil. No entanto, são necessárias soluções inteligentes ao rastrear milhares ou milhões de páginas.

Raspagem de serviços de API

APIs de web scraping como RaspadorAPI lidar com a automação do navegador, cookies, proxies e rotações em grande escala. Isso simplifica a remoção de sites com muito JavaScript, incluindo SPAs.

Fazendas de navegadores sem cabeça

Serviços como Sem navegador e Navegador em nuvem Sangfor fornecem grandes clusters de instâncias de Playwright e Puppeteer acessíveis por meio de APIs. Essas instâncias paralelas permitem a raspagem distribuída de SPAs em escala.

Rastreadores hospedados

Em vez de executar sua própria infraestrutura de scraping, rastreadores hospedados como Crawler e ProxyCrawlName lidar com a orquestração de navegadores, proxies e automação para rastrear sites complexos.

Bots de raspagem da Web

Ferramentas como Caçador Fantasma, Dexi.io e Analisar Hub fornece configuração de apontar e clicar de raspadores para SPAs sem codificação. Esses bots detectam automaticamente o conteúdo da página, esperas, cliques, etc., permitindo configuração sem código.

Dependendo do seu caso de uso, aproveitar um desses serviços de nível empresarial pode ser mais eficaz do que construir sua própria infraestrutura de scraping para rastreamento de SPA em larga escala.

Uma alternativa mais fácil: Crawlee

Rastejante fornece um rastreador da web inovador como serviço para sites renderizados em JavaScript.

Ele lida automaticamente com desafios comuns de raspagem, como:

  • Aguardando o carregamento de elementos ou URLs antes da extração
  • Autenticando sessões e armazenando cookies
  • Interceptando solicitações de API e manipulando dados AJAX
  • Percorrendo páginas de rolagem infinitas
  • Executando novamente extrações com falha para melhorar a resiliência

O Crawlee pode rastrear SPAs complexos prontos para uso, sem a necessidade de codificar scripts Playwright para espera, autenticação, manipulação de AJAX, etc.

Principais recursos:

  • Configure por meio de uma interface visual em vez de codificação
  • Espera automaticamente por URLs e seletores antes de extrair dados
  • O rastreamento com estado transporta cookies entre as páginas
  • Interceptação de solicitação de API para lidar com dados XHR, Fetch e JSON
  • Renderização sem cabeça do Chrome por padrão
  • Ferramentas visuais para inspecionar e depurar rastreamento
  • Back-end do rastreador distribuído horizontalmente escalável

Isso simplifica a extração até mesmo de aplicativos da web JavaScript sofisticados sem a codificação Playwright. O rastreador como serviço do Crawlee é ideal para usuários que não desejam gerenciar sua própria infraestrutura de scraper.

Os aplicativos suportados incluem:

  • Aplicativos React e Next.js
  • SPAs angulares
  • Páginas Vue.js
  • Sites de pacotes da Web
  • Páginas pesadas AJAX
  • PWAs e aplicativos Electron
  • Projetos dinâmicos e responsivos

Fornecer suporte pronto para uso para desafios de raspagem, como condições de espera, sessões autenticadas e alterações dinâmicas de conteúdo, torna o Crawlee uma escolha atraente para raspagem de SPA sem escrever scripts complexos.

Conclusão

A raspagem de aplicativos modernos de página única requer a emulação de interações do usuário e a espera por atividades assíncronas de JavaScript. O Playwright oferece excelentes recursos de automação de navegador para superar esses desafios.

As principais estratégias abordadas neste guia incluem:

  • Aguardando o carregamento do conteúdo inicial e das atualizações dinâmicas antes de extrair
  • Ouvindo alterações no DOM para detectar novo conteúdo sendo renderizado
  • Interceptando solicitações de API REST e GraphQL para acessar dados de back-end
  • Emulação de dispositivos móveis e otimização para lidar com designs responsivos
  • Autenticação de sessões e gerenciamento de cookies para acessar dados privados do usuário

Seguir esses padrões o ajudará a desenvolver scrapers Playwright sustentáveis, até mesmo para SPAs complexos que dependem fortemente de JavaScript e APIs do lado do cliente.

Em escala, aproveitar serviços de API de scraping, farms de navegadores headless e rastreadores hospedados pode ser mais eficiente do que construir sua própria infraestrutura Playwright.

Embora escrever scripts Playwright forneça flexibilidade máxima, ferramentas como Crawlee fornecem um serviço de scraping pronto para uso mais fácil para SPAs, sem a necessidade de codificar scripts de automação do navegador você mesmo.

Espero que este guia tenha lhe dado uma compreensão sólida das técnicas para eliminar aplicativos desafiadores de página única usando o Playwright. Deixe-me saber se você tem alguma dúvida!

Junte-se à conversa

O seu endereço de e-mail não será publicado. Os campos obrigatórios são marcados com *