AI Agents · Lezione

Gestione della paginazione e dei contenuti dinamici

Seguire i link alla pagina successiva e usare Playwright per le pagine renderizzate con JavaScript

Lezione 3 di 413 passaggi

Gestione della paginazione e dei contenuti dinamici è una lezione AI Agents gratuita su CoddyKit. Questa è la lezione 3 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento AI Agents, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso AI Agents include 4 lezioni in totale.

Il problema della paginazione

La maggior parte dei siti web reali non fornisce tutti i dati in un'unica pagina. I risultati sono suddivisi in più pagine per ridurre il carico. Un agente deve rilevare e seguire la paginazione per raccogliere dataset completi.

Esistono due schemi di paginazione comuni: link alla pagina successiva e schemi di URL con numeri di pagina.

Rilevare i link alla pagina successiva

Molti siti presentano un pulsante o un link a forma di freccia «Avanti». Individui il tag anchor con rel='next' o con un testo come «Next», ne estragga href e lo segua in un ciclo finché non ne esistono più.

from bs4 import BeautifulSoup
import httpx

def scrape_all_pages(start_url: str) -> list:
    results = []
    url = start_url

    while url:
        response = httpx.get(url, timeout=10.0)
        soup = BeautifulSoup(response.text, 'html.parser')

        # Collect data from this page
        for item in soup.select('.result-item'):
            results.append(item.text.strip())

        # Find the next page link
        next_link = soup.find('a', rel='next') or soup.find('a', string='Next')
        url = next_link.get('href') if next_link else None

    return results

Schemi di URL con numeri di pagina

Molte API e molti siti usano schemi di URL prevedibili: /results?page=1, /results?page=2 e così via. Un agente può scorrerli direttamente senza analizzare il DOM alla ricerca di un link successivo.

import httpx

def scrape_paginated_api(base_url: str, max_pages: int = 10) -> list:
    all_items = []

    for page in range(1, max_pages + 1):
        response = httpx.get(
            base_url,
            params={'page': page, 'per_page': 50},
            timeout=10.0
        )
        response.raise_for_status()
        data = response.json()

        items = data.get('results', [])
        if not items:
            break  # No more data

        all_items.extend(items)
        print(f'Page {page}: fetched {len(items)} items')

    return all_items

Paginazione basata su cursore

Le API moderne (GitHub, Slack, Twitter) usano la paginazione basata su cursore. Ogni risposta include un token cursore per la pagina successiva. Passi il cursore nella richiesta successiva finché non è assente o nullo.

import httpx

def fetch_with_cursor(url: str, headers: dict) -> list:
    all_data = []
    cursor = None

    while True:
        params = {'cursor': cursor} if cursor else {}
        response = httpx.get(url, headers=headers, params=params, timeout=10.0)
        response.raise_for_status()
        data = response.json()

        all_data.extend(data.get('items', []))

        cursor = data.get('next_cursor')  # None when done
        if not cursor:
            break

    return all_data

Contenuto statico e dinamico

Alcune pagine caricano i contenuti tramite JavaScript dopo la consegna dell'HTML iniziale. Un normale client HTTP riceve solo lo scheletro vuoto: i dati effettivi vengono inseriti da JS nel browser.

Per queste pagine, strumenti come Playwright eseguono un vero motore del browser e attendono l'esecuzione di JavaScript prima di estrarre il contenuto.

Installare e importare Playwright

Installi Playwright con pip install playwright, quindi esegua playwright install chromium per scaricare il browser. Usi async_playwright() nei flussi di lavoro asincroni degli agenti.

# Installation (run in terminal):
# pip install playwright
# playwright install chromium

from playwright.async_api import async_playwright
import asyncio

async def fetch_dynamic(url: str) -> str:
    async with async_playwright() as p:
        browser = await p.chromium.launch(headless=True)
        page = await browser.new_page()
        await page.goto(url)
        html = await page.content()  # Full rendered HTML
        await browser.close()
    return html

# html = asyncio.run(fetch_dynamic('https://example.com'))

Attendere il caricamento dei contenuti dinamici

Le pagine JavaScript spesso caricano i dati in modo asincrono. Indichi a Playwright di attendere la comparsa di un elemento specifico prima di estrarre il contenuto, così da assicurarsi che i dati necessari siano effettivamente presenti nel DOM.

from playwright.async_api import async_playwright

async def scrape_dynamic_table(url: str) -> list:
    async with async_playwright() as p:
        browser = await p.chromium.launch(headless=True)
        page = await browser.new_page()
        await page.goto(url)

        # Wait for the table to appear in the DOM
        await page.wait_for_selector('table.results', timeout=10000)

        html = await page.content()
        await browser.close()

    from bs4 import BeautifulSoup
    soup = BeautifulSoup(html, 'html.parser')
    return [td.text for td in soup.select('table.results td')]

Fare clic e interagire con le pagine

Playwright può simulare le interazioni dell'utente: clic, compilazione di moduli, scorrimento e input da tastiera. In questo modo un agente può gestire flussi di accesso, menu a discesa o pagine con scorrimento infinito.

from playwright.async_api import async_playwright

async def click_load_more(url: str) -> str:
    async with async_playwright() as p:
        browser = await p.chromium.launch(headless=True)
        page = await browser.new_page()
        await page.goto(url)

        # Click the 'Load More' button
        load_more = page.locator('button:text("Load More")')
        if await load_more.count() > 0:
            await load_more.click()
            await page.wait_for_timeout(2000)  # wait 2s for content

        html = await page.content()
        await browser.close()
    return html

Gestire lo scorrimento infinito

Alcuni siti caricano altri contenuti mentre si scorre verso il basso. Playwright può simulare lo scorrimento per attivare questi caricamenti. Scorra ripetutamente e verifichi ogni volta se è comparso nuovo contenuto.

from playwright.async_api import async_playwright

async def scrape_infinite_scroll(url: str, scroll_count: int = 5) -> str:
    async with async_playwright() as p:
        browser = await p.chromium.launch(headless=True)
        page = await browser.new_page()
        await page.goto(url)

        for _ in range(scroll_count):
            await page.evaluate('window.scrollTo(0, document.body.scrollHeight)')
            await page.wait_for_timeout(1500)  # wait for new content

        html = await page.content()
        await browser.close()
    return html

Combinare Playwright con BeautifulSoup

Dopo che Playwright ha eseguito il rendering della pagina e restituito l'HTML completo, lo passi a BeautifulSoup per un'estrazione semplice. In questo modo combina i punti di forza di entrambe le librerie.

from playwright.async_api import async_playwright
from bs4 import BeautifulSoup

async def extract_js_rendered_data(url: str) -> list:
    async with async_playwright() as p:
        browser = await p.chromium.launch(headless=True)
        page = await browser.new_page()
        await page.goto(url)
        await page.wait_for_selector('.product-card')
        html = await page.content()
        await browser.close()

    soup = BeautifulSoup(html, 'html.parser')
    products = []
    for card in soup.select('.product-card'):
        products.append({
            'name': card.select_one('.name').text.strip(),
            'price': card.select_one('.price').text.strip()
        })
    return products

Scegliere lo strumento giusto

Non tutte le pagine richiedono Playwright. Usi l'approccio più semplice che funzioni:

  • HTML statico: httpx + BeautifulSoup (veloce, senza il sovraccarico di un browser)
  • API JSON con paginazione: httpx con parametri di pagina/cursore
  • Contenuto sottoposto a rendering da JS: Playwright asincrono (più lento, ma più potente)

Inizi sempre dall'approccio statico e ricorra a Playwright solo quando necessario.

Verifica delle conoscenze: paginazione e contenuti dinamici

Verifichi la Sua comprensione della paginazione e della gestione dei contenuti dinamici.

Riepilogo: paginazione e contenuti dinamici

Ora i Suoi agenti possono gestire l'intero spettro dei contenuti web:

  • Seguire i link alla pagina successiva o scorrere i parametri di pagina negli URL
  • Usare i token cursore per la paginazione delle API moderne
  • Usare async_playwright() per le pagine sottoposte a rendering da JavaScript
  • Attendere gli elementi con page.wait_for_selector()
  • Combinare Playwright con BeautifulSoup per un'estrazione semplice

Inizi sempre dall'approccio più semplice e ricorra a Playwright solo quando l'approccio statico non è sufficiente.

Gratis per iniziare

Impara AI Agents con un tutor IA — gratis

Scrivi ed esegui vero codice nel tuo browser, ricevi aiuto istantaneo da un tutor IA disponibile 24/7, e riprendi da dove hai lasciato sul web o nell'app.

Corsi
60
Lezioni
239

Domande Frequenti

La lezione «Gestione della paginazione e dei contenuti dinamici» è gratuita?

Sì — il testo completo di «Gestione della paginazione e dei contenuti dinamici» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso AI Agents, passa a CoddyKit PRO. Il corso AI Agents include 4 lezioni in totale.

Cosa imparerò in «Gestione della paginazione e dei contenuti dinamici»?

Seguire i link alla pagina successiva e usare Playwright per le pagine renderizzate con JavaScript Eserciti AI Agents con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare AI Agents?

Non è richiesta alcuna esperienza precedente. AI Agents su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 3 di 4.

Quanto tempo richiede la lezione «Gestione della paginazione e dei contenuti dinamici»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione AI Agents?

Sì. Ogni lezione AI Agents include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Client HTTP per agenti: httpx e requests
  2. Parsing dell’HTML con BeautifulSoup
  3. Gestione della paginazione e dei contenuti dinamici
  4. Pratiche di scraping responsabile
← Torna a AI Agents