Salta al contenuto

Scraping di applicazioni a pagina singola con Playwright: una guida approfondita

Le applicazioni a pagina singola, o SPA, sono diventate la norma per lo sviluppo web moderno. A differenza dei tradizionali siti multipagina, gli SPA aggiornano dinamicamente i contenuti ed eseguono il rendering delle pagine utilizzando JavaScript senza richiedere il ricaricamento dell'intera pagina. Ciò crea un'esperienza fluida, simile a un'app, per gli utenti.

Tuttavia, la crescente dipendenza da JavaScript lato client e dal caricamento asincrono dei dati pone sfide uniche per lo scraping dei dati da applicazioni a pagina singola. Gli strumenti di scraping tradizionali non sono all'altezza poiché sono progettati per siti statici e analisi HTML.

In questa guida completa di oltre 3200 parole, imparerai tecniche collaudate per affrontare gli ostacoli più comuni incontrati durante lo scraping delle SPA moderne utilizzando Playwright.

Perché raschiare le SPA è una sfida

Prima di immergerci nelle soluzioni, è importante capire in primo luogo cosa rende difficili le applicazioni a pagina singola.

Utilizzo intensivo di JavaScript lato client

L'HTML inizialmente servito dal server è essenzialmente una shell statica della pagina. Il contenuto effettivo viene generato dinamicamente e reso lato client tramite JavaScript. Ciò significa che gran parte dei dati esistono solo negli oggetti JavaScript e negli elementi DOM anziché nel sorgente HTML iniziale.

Caricamento dati asincrono

Le SPA recuperano spesso nuovi contenuti in modo asincrono in background e aggiornano la pagina senza un ricaricamento completo. I dati spesso non sono disponibili in anticipo al primo caricamento della pagina.

Secondo i parametri di Radware, la pagina web media effettua oltre 100 richieste a risorse esterne durante il rendering.

AnnoRichieste di pagine medie
201133
201656
2019105

Con un uso intensivo di tecnologie come AJAX, i dati di cui hai bisogno potrebbero essere ancora caricati in background quando tenti di estrarli. Ciò porta alla rimozione di dati incompleti.

Manipolazione dinamica del DOM

I componenti e gli elementi renderizzati su una SPA possono cambiare rapidamente in risposta all'input dell'utente. Il contenuto viene generato, aggiunto, rimosso o aggiornato dinamicamente mentre l'utente interagisce con l'app.

Cercare di individuare gli elementi in base alla loro posizione DOM iniziale è fragile poiché cambia così frequentemente.

Dipendenza da API e richieste AJAX

Le SPA utilizzano ampiamente API REST, GraphQL, WebSocket e richieste AJAX per recuperare dati dai server backend. Il contenuto viene quindi visualizzato sul lato client.

Questo scambio di dati tra client e server è invisibile agli approcci tradizionali di scraping che vedono solo la risposta HTML iniziale.

Sessioni autenticate e stato

Le SPA complesse spesso richiedono agli utenti di effettuare il login prima di accedere a contenuti e dati privati. Questo stato di autenticazione deve essere mantenuto correttamente negli script di scraping.

I cookie che memorizzano ID di sessione, ID utente e token devono essere gestiti per simulare una sessione utente autenticata.

La necessità dell'esecuzione di JavaScript

A differenza dei siti statici, il semplice parsing dell'HTML non è sufficiente per le SPA. La pagina deve essere renderizzata eseguendo JavaScript in un ambiente simile a un browser per generare la struttura dati finale.

I browser headless come Playwright forniscono questa capacità per produrre l'esperienza realistica dell'utente finale necessaria per raschiare le SPA.

Queste sfide rendono lo scraping SPA efficace molto diverso dal web scraping convenzionale. Vediamo ora come Playwright può aiutarti a superare questi ostacoli.

Perché utilizzare Playwright per raschiare le SPA?

Playwright è una libreria Node.js per automatizzare i browser Web più diffusi come Chromium, Firefox e WebKit. Le funzionalità chiave rilevanti per lo scraping SPA includono:

Automazione del browser senza testa

Il drammaturgo può guidare i browser senza rendere un'interfaccia utente visibile, nota come modalità headless. Ciò consente di eseguire pagine JavaScript pesanti per popolare i dati.

In attesa di Elementi e Condizioni

I meccanismi di attesa integrati intelligenti prevengono gli errori di scraping aspettando che elementi o funzioni raggiungano gli stati desiderati prima di interagire.

Richieste API beffarde

Playwright consente di intercettare richieste e rispondere con dati fittizi invece di chiamare API reali. Ciò consente lo scraping dei dati AJAX.

Test di risposta

Emula dispositivi mobili, aree geografiche e limitazioni della CPU per gestire le esigenze di testing della progettazione reattiva.

Visualizzatore di tracce

Visualizza gli script di Playwright per comprendere le esatte interazioni del browser e diagnosticare i problemi.

Gestione automatica di popup e finestre di dialogo

Playwright gestisce automaticamente avvisi, conferme, richieste, richieste di autenticazione e download semplificando la logica degli script.

Selettori e API DOM

API ricca per estrarre dati tramite selettori CSS o attraversare direttamente elementi DOM come una normale pagina web.

Queste funzionalità rendono Playwright particolarmente adatto alle sfide poste dalle applicazioni web a pagina singola. Le principali alternative come Puppeteer, Selenium e HtmlUnit, sebbene utili per i test generali del browser, mancano del robusto set di funzionalità di Playwright per un efficace scraping SPA.

Successivamente, esaminiamo alcuni esempi di codice che dimostrano i principali modelli di scraping utilizzando Playwright.

Modelli di scraping per SPA utilizzando Playwright

Di seguito esploreremo alcune tecniche comuni di raschiatura per superare le sfide specifiche della SPA.

Attendi il caricamento del contenuto

Una delle sfide fondamentali dello scraping SPA è concedere il tempo necessario per caricare il contenuto prima dell'estrazione.

Invece di tentare di estrarre i dati immediatamente, dobbiamo attendere che il rendering JavaScript asincrono finisca di popolare la pagina.

Quello del drammaturgo page.waitForSelector() Il metodo consente di attendere la visualizzazione di un selettore specifico prima di eseguire ulteriori comandi:

// 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); 

Questo attende fino all'elemento con classe content è disponibile nel DOM prima di estrarne il contenuto testuale.

Senza questa attesa, .content potrebbe non esistere ancora se il caricamento continua in modo asincrono causando errori. Questo semplice ritardo consente alla SPA di recuperare ed eseguire il rendering di nuovi dati consentendo la successiva estrazione.

WaitForFunction

In alcuni casi, potrebbe essere necessario attendere che siano vere condizioni JavaScript più complesse anziché un semplice selettore. Qui possiamo usare 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; 
});

Questo interroga la pagina fino al custom window.store.articles la condizione restituisce true prima di leggere i dati.

L'attesa intelligente di selettori e condizioni previene errori di scraping dovuti al caricamento asincrono dei dati della pagina.

Gestire gli aggiornamenti dei contenuti dinamici

Le app a pagina singola possono aggiornare il contenuto in modo dinamico in risposta all'input e agli eventi dell'utente senza ricaricare la pagina.

Un esempio comune è lo scorrimento infinito in cui vengono aggiunti nuovi elementi quando l'utente scorre verso il basso.

Per gestire gli elementi aggiunti dinamicamente, possiamo ascoltare le modifiche del DOM utilizzando gli osservatori di mutazione:

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

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

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

});

I observer verrà avvisato ogni volta che nuovi elementi vengono aggiunti al corpo della pagina. Possiamo quindi attivare la nostra logica di raschiamento in risposta a queste mutazioni.

Ciò consente di adattarsi agli aggiornamenti dei contenuti invece di gestire solo il caricamento iniziale della pagina.

Richieste API fittizie

Le SPA utilizzano ampiamente le API REST e GraphQL per recuperare i dati lato client.

Per intercettare queste richieste, possiamo definire percorsi in Playwright per simulare le risposte:

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 la SPA tenta di chiamare /api/articles, il nostro gestore risponderà con la risposta falsa definita invece di utilizzare l'API reale.

Ciò consente di recuperare i dati API senza effetti collaterali. Possiamo creare risposte solide per gestire diversi scenari che il nostro codice SPA potrebbe aspettarsi.

Autentica sessione

L'eliminazione delle aree degli account privati ​​nelle SPA richiede una corretta gestione dell'autenticazione.

Un approccio semplice consiste nell'accedere normalmente tramite l'interfaccia utente prima dello scraping:

// 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 

Ciò sfrutta le capacità di Playwright per automatizzare la compilazione dei moduli e i clic creando una sessione del browser autenticata.

Per ottenere i migliori risultati, eseguire l'accesso in a beforeAll agganciare e riutilizzare il browser ed page contesto durante i test per condividere i cookie.

Gestione della progettazione reattiva

Le SPA adattano spesso il loro layout e i loro contenuti alle diverse dimensioni dei dispositivi. Per testare questi scenari reattivi, possiamo emulare i browser mobili utilizzando page.emulate():

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

L'impostazione di un viewport e di un user agent per iPhone consente di eseguire il rendering della pagina come farebbe un dispositivo mobile.

Combina l'emulazione con waitForSelector e puoi gestire i progetti reattivi in ​​modo affidabile.

L'emulazione di ambienti diversi aiuta a garantire che il tuo scraper si adatti alla SPA su desktop e dispositivi mobili.

Librerie di supporto per raschiatore

Servizi come Apifica ed RaschiareApe fornire librerie basate su Drammaturgo che gestiscono in modo intelligente l'attesa dei contenuti, automatizzano lo scorrimento per gli aggiornamenti dinamici delle pagine, limitano le richieste e altro ancora.

Questi strumenti possono semplificare la scrittura autonoma di robusti script di scraping SPA.

Script pratico per raschiatore drammaturgo

Mettiamo ora insieme questi approcci in uno scraper del mondo reale per un'ipotetica SPA:

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();

})();

Questo script accede all'app privata, attende il caricamento del contenuto autenticato, gestisce le mutazioni dinamiche, simula la risposta API ed estrae i dati in const data.

Le tecniche possono essere adattate per sviluppare robusti raschiatori per le SPA del mondo reale.

Eliminazione delle SPA su larga scala

Per le SPA di grandi dimensioni, raschiare manualmente solo poche pagine può essere abbastanza semplice. Tuttavia, sono necessarie soluzioni intelligenti quando si esegue la scansione di migliaia o milioni di pagine.

Servizi API di scraping

API di web scraping come API raschietto gestire l'automazione del browser, i cookie, i proxy e le rotazioni su larga scala. Ciò semplifica lo scraping di siti pesanti con JavaScript, inclusi gli SPA.

Fattorie browser senza testa

Servizi come Senza browser ed Browser Sangfor Cloud fornire grandi cluster di istanze di drammaturgo e burattinaio accessibili tramite API. Queste istanze parallele consentono lo scraping distribuito di SPA su larga scala.

Crawler ospitati

Invece di gestire la propria infrastruttura di scraping, i crawler ospitati preferiscono Crawler ed Scansione proxy gestire l'orchestrazione di browser, proxy e automazione per eseguire la scansione di siti complessi.

Bot di web scraping

Strumenti come Acchiappafantasmi, Dexi.io ed ParseHub fornire la configurazione punta e clicca di raschiatori per SPA senza codifica. Questi bot rilevano automaticamente il contenuto della pagina, le attese, i clic, ecc., consentendo la configurazione senza codice.

A seconda del caso d'uso, sfruttare uno di questi servizi di livello aziendale può essere più efficace che costruire la propria infrastruttura di scraping per la scansione SPA su larga scala.

Un'alternativa più semplice: Crawlee

Crawlee fornisce un web crawler innovativo come servizio per i siti con rendering JavaScript.

Gestisce automaticamente le sfide comuni dello scraping come:

  • In attesa del caricamento di elementi o URL prima dell'estrazione
  • Autenticazione delle sessioni e memorizzazione dei cookie
  • Intercettare richieste API e gestire dati AJAX
  • Scorrere infinite pagine di scorrimento
  • Riesecuzione delle estrazioni non riuscite per migliorare la resilienza

Crawlee può eseguire la scansione di SPA complesse senza dover codificare gli script di Playwright per l'attesa, l'autenticazione, la gestione AJAX ecc.

Le funzionalità principali:

  • Configura tramite un'interfaccia visiva anziché tramite codifica
  • Attende automaticamente URL e selettori prima di estrarre i dati
  • La scansione con stato trasferisce i cookie su tutte le pagine
  • Intercettazione delle richieste API per gestire dati XHR, Fetch e JSON
  • Rendering di Chrome senza testa per impostazione predefinita
  • Strumenti visivi per ispezionare ed eseguire il debug della scansione
  • Backend crawler distribuito scalabile orizzontalmente

Ciò semplifica lo scraping anche di app Web JavaScript sofisticate senza la codifica di Playwright. Il crawler come servizio di Crawlee è l'ideale per gli utenti che non desiderano gestire la propria infrastruttura di scraper.

Le app supportate includono:

  • App React e Next.js
  • SPA angolari
  • Pagine Vue.js
  • Siti Webpack
  • Pagine pesanti AJAX
  • PWA e app Electron
  • Disegni dinamici e reattivi

Fornire supporto chiavi in ​​mano per sfide di scraping come condizioni di attesa, sessioni autenticate e modifiche dei contenuti dinamici rende Crawlee una scelta convincente per lo scraping SPA senza scrivere script complessi.

Conclusione

Lo scraping delle moderne applicazioni a pagina singola richiede l'emulazione delle interazioni dell'utente e l'attesa dell'attività JavaScript asincrona. Playwright offre eccellenti funzionalità di automazione del browser per superare queste sfide.

Le strategie chiave trattate in questa guida includono:

  • In attesa del caricamento del contenuto iniziale e degli aggiornamenti dinamici prima dell'estrazione
  • Ascolto delle modifiche DOM per rilevare il nuovo contenuto in fase di rendering
  • Intercettare le richieste API REST e GraphQL per accedere ai dati di backend
  • Emulazione di dispositivi mobili e limitazione per gestire progetti reattivi
  • Autenticazione delle sessioni e gestione dei cookie per accedere ai dati privati ​​dell'utente

Seguire questi modelli ti aiuterà a sviluppare scraper Playwright gestibili anche per SPA complesse che fanno molto affidamento su JavaScript e API lato client.

Su larga scala, sfruttare i servizi API di scraping, le browser farm headless e i crawler ospitati può essere più efficiente che costruire la propria infrastruttura Playwright.

Mentre la scrittura degli script di Playwright offre la massima flessibilità, strumenti come Crawlee forniscono un servizio di scraping chiavi in ​​mano più semplice per le SPA senza la necessità di codificare autonomamente gli script di automazione del browser.

Spero che questa guida ti abbia fornito una solida conoscenza delle tecniche per creare app impegnative a pagina singola utilizzando Playwright. Fatemi sapere se avete altre domande!

Partecipa alla conversazione

L'indirizzo email non verrà pubblicato. I campi obbligatori sono contrassegnati con *