Gestione della paginazione e dei contenuti dinamici
Seguire i link alla pagina successiva e usare Playwright per le pagine renderizzate con JavaScript
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 resultsSchemi 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_itemsPaginazione 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_dataContenuto 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 htmlGestire 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 htmlCombinare 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 productsScegliere 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.
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
- Client HTTP per agenti: httpx e requests
- Parsing dell’HTML con BeautifulSoup
- Gestione della paginazione e dei contenuti dinamici
- Pratiche di scraping responsabile