Perché lo scraping dei commenti di YouTube perde le risposte: paginazione a due livelli e verifica della completezza

I commentThreads di YouTube non includono sempre tutte le risposte. Sulla base della documentazione ufficiale, questa guida spiega comments.list, parentId, la paginazione a due livelli, la deduplicazione e le discrepanze nel conteggio dei commenti, e propone un metodo riproducibile per collaudare l'importazione.

Quando lo scraping dei commenti di YouTube perde delle risposte, il primo passo è controllare se è stato letto solo commentThreads. Le risposte incluse nell'elenco dei thread non sono necessariamente complete: i thread di un video vanno paginati, e anche le risposte sotto ogni commento di primo livello possono richiedere una paginazione separata. Arrivare alla fine del primo livello non significa aver recuperato tutte le risposte.

Non è un problema nuovo. Baskaya ha segnalato l'incongruenza tra numero di risposte e contenuti restituiti in una discussione storica su Stack Overflow. Le soluzioni proposte all'epoca contengono ipotesi legate all'integrazione con Google+ e non spiegano i problemi di oggi. Ciò che resta davvero utile è la domanda che pone: stai contando i thread, i commenti o il sottoinsieme di risposte incluso nell'output di una chiamata API?

Questo articolo spiega questa distinzione sulla base della documentazione ufficiale al 2026-9-5 e descrive i metodi per verificare i risultati dell'acquisizione. Tratta le regole ufficiali delle API di YouTube, non è un report di test di EveryInfra e non garantisce il recupero di contenuti non accessibili.

Perché le risposte in commentThreads sono incomplete

Secondo la documentazione della risorsa di YouTube, un commentThread contiene un commento di primo livello ed eventualmente le risposte allegate. I commenti di primo livello si trovano in snippet.topLevelComment e gli elenchi delle risposte in replies.comments; quest'ultimo può essere solo un sottoinsieme. snippet.totalReplyCount indica il numero di risposte di quel commento di primo livello e non può essere confrontato direttamente con la lunghezza dell'intero elenco dei thread. L'API dei commenti di YouTube di EveryInfra restituisce reply_count per ogni commento. Dopo un'esportazione, usalo per controllare quante risposte hai effettivamente ottenuto.

Supponi che un thread sintetico dichiari 12 risposte, ma che l'oggetto attuale ne alleghi solo 5. Quel 5 non è né il numero con cui lo scraper può dichiarare di aver finito né un motivo per riempire l'array restituito fino a 12 elementi. L'azione corretta è continuare a interrogare l'endpoint delle risposte per quel commento padre, invece di richiedere più volte lo stesso oggetto thread sperando che la volta successiva fornisca da solo più risposte.

Un'altra distinzione facile da trascurare è quella tra ID del thread e ID del commento di primo livello. Vanno letti e registrati separatamente dalle rispettive risorse; il fatto che in un campione le due stringhe coincidano non significa che il programma possa considerarle sempre intercambiabili. Sembrare identici in un modello di dati non significa avere lo stesso scopo nella definizione dell'API.

Gestire separatamente l'avanzamento della paginazione per commenti di primo livello e risposte

Il metodo ufficiale commentThreads.list consente di leggere i thread tramite videoId e di usare il nextPageToken della risposta per recuperare la pagina successiva. Il limite massimo di maxResults è di 100 elementi per pagina: non è una richiesta che restituisce in una volta tutti i commenti di un video, né significa che un thread abbia al massimo 100 risposte.

Per un determinato commento di primo livello, segui le regole di comments.list: passa l'ID di quel commento in parentId e gestisci il nextPageToken della sua query delle risposte. Qui il token di paginazione appartiene alla query delle risposte: non puoi riutilizzarlo nella query dei thread del video, né puoi riutilizzare un token ottenuto da un altro commento padre.

L'implementazione si può dividere in due livelli di attività: le attività sui video individuano i commenti di primo livello, mentre quelle sui commenti padre recuperano le risposte aggiuntive. Ogni commento padre conserva la propria posizione di ripresa e il proprio motivo di interruzione. In questo modo, una discussione con un numero eccezionalmente alto di risposte non costringe a ricominciare da zero anche gli altri thread già completati.

Insieme all'avanzamento vanno salvate anche le condizioni della richiesta, ad esempio se è stato usato searchTerms, quale criterio di ordinamento è stato scelto e qual è il video di destinazione. Se la ricerca è stata limitata a determinate parole chiave fin dall'inizio, qualsiasi successiva dichiarazione di completezza può riferirsi solo a quell'ambito di query: nei file di esportazione non si possono omettere i filtri per farli passare per «tutti i commenti di questo video».

Registrare le condizioni di completamento nei risultati, non solo nei log

Conviene separare il contenuto dei commenti dall'avanzamento dello scraping. I contenuti vanno deduplicati per piattaforma e ID del commento, conservando il video, l'associazione al commento padre e il momento dell'osservazione; l'avanzamento, invece, descrive a che punto si trova l'attività corrente. Si tratta di suggerimenti di progettazione lato applicazione: i campi seguenti non sono campi restituiti direttamente da YouTube o da EveryInfra.

Un record di avanzamento minimo deve poter rispondere a queste domande: se l'elenco dei thread ha raggiunto l'ultima pagina, quali commenti padre sono arrivati alla fine delle risposte, quali si sono fermati per richieste non riuscite o per esaurimento del budget dell'attività, e quando è avvenuta l'ultima conferma. Basandosi solo su success: true non è possibile esprimere che «il primo livello è completo, ma a un commento padre mancano ancora due pagine da recuperare».

La deduplicazione va fatta al momento del salvataggio dei contenuti. Se un processo termina dopo aver scritto una pagina, al ripristino la stessa pagina potrebbe essere recuperata di nuovo: aggiornare i record già visti in base all'ID è più affidabile che individuare i duplicati dal testo del commento. Due persone che scrivono la stessa frase breve producono comunque due commenti, e la modifica del testo di un singolo commento non deve trasformarlo subito in due opinioni indipendenti di utenti.

L'avanzamento va aggiornato solo dopo che i contenuti sono stati salvati correttamente. Se registri la pagina successiva prima di aver salvato quella corrente, un errore a metà può far saltare dei dati. Consentire riletture con deduplicazione è in genere più facile da verificare che permettere salti di pagina silenziosi. Quando un cursore si ripete o per molto tempo non compaiono nuovi ID, l'esecuzione deve fermarsi e segnalare un'anomalia: ripetere più volte i tentativi sulla stessa pagina non va mai considerato un avanzamento valido.

Discrepanze nel numero di commenti impossibili da correggere

Controlla prima la gerarchia degli oggetti, le condizioni di filtro e la paginazione su due livelli, poi passa ai tipi di errore. La documentazione ufficiale sull'elenco dei thread distingue tra commentsDisabled, permessi insufficienti e video inesistenti. Nessuno di questi casi va presentato come "il video al momento non ha commenti". Un array vuoto restituito da una query riuscita non ha lo stesso valore probatorio di un array vuoto restituito perché il client ha inghiottito un'eccezione.

Per le discrepanze nei conteggi, registra anche le finestre di osservazione: il numero visibile sulla pagina, i metadati del thread e i risultati della paginazione potrebbero non essere stati rilevati nello stesso istante. Una differenza nel conteggio, da sola, non basta a stabilire quali contenuti manchino, tanto meno a generarne il testo. Quando analizzi il testo leggibile, usa come campione i commenti effettivamente acquisiti e attribuibili, dichiarando apertamente gli intervalli incompleti.

Consigliamo di formulare i controlli di stato in termini verificabili, ad esempio "la paginazione dei thread per questa query è terminata e restano incompleti due task relativi alle risposte nei commenti padre". È più onesto di "tasso di completezza 98%", perché quest'ultimo richiede un denominatore totale affidabile, basato su definizioni coerenti. Senza un denominatore, non costruire una percentuale apparentemente precisa.

Per i problemi generici di HTTP o di parametri, consulta Gestione degli errori API nella documentazione. I nuovi tentativi possono risolvere alcuni errori temporanei, ma non possono ampliare i permessi né trasformare un oggetto risposta parziale in un dataset completo.

Come verificare uno scraper con quattro piccoli campioni

Verificare quattro scenari su oggetti di test accessibili o su fixture sintetiche consente di isolare gli errori più facilmente rispetto all'elaborazione, fin dall'inizio, di un grande batch di video.

  1. Un thread contiene meno risposte del numero dichiarato: il programma deve creare un task per le risposte invece di dichiarare subito il completamento.
  2. Un elenco di risposte ha una pagina successiva: il programma deve continuare a elaborare quel commento padre e non limitarsi a paginare l'elenco dei thread del video.
  3. La stessa pagina viene letta due volte: il numero finale di commenti unici non deve raddoppiare e le relazioni padre-figlio devono restare coerenti.
  4. La richiesta di un commento padre non va a buon fine: gli altri risultati possono essere conservati, ma le esportazioni devono indicare che i risultati sono parziali e non devono sovrascrivere risultati validi precedenti con risposte vuote.

Il test di accettazione deve verificare anche l'utilità dell'output. Quando si classificano i commenti per argomento, una risposta come "questo è sbagliato" perde quasi ogni interpretabilità se staccata dal suo commento padre. Conservare il legame con il commento padre aiuta persone e modelli a risalire al contesto della discussione. Anche la documentazione su Relazioni tra commenti e risposte su Douyin affronta questo problema di modellazione, ma i parametri di richiesta di piattaforme diverse non sono intercambiabili.

Quelli descritti sono test suggeriti, non esperimenti reali su video eseguiti per questo articolo. Se hai già un JSON esportato da un'API, puoi verificare offline queste strutture e questi stati prima di decidere se serve un'autorizzazione per recuperare di nuovo i dati.

Consegnare un campione di commenti con limiti dichiarati

"Quanti elementi sono stati raccolti" è solo una parte del risultato. Un'esportazione adatta all'analisi deve anche indicare target, filtri, momenti di raccolta, relazioni padre-figlio, metodi di deduplicazione ed elementi incompleti. I report di analisi devono ereditare questi limiti e non devono tralasciare lacune già note dai passaggi precedenti solo perché il processo è arrivato alla fase di sintesi.

Quando scegli API per i dati già pronte, usa il metodo di verifica del catalogo descritto in Guida introduttiva alle API per i dati unificate per confermare, voce per voce, quali campi e quali funzionalità di paginazione sono effettivamente disponibili. Non applicare direttamente i parametri ufficiali citati in questo articolo a un altro insieme di API e non dare per scontato che "supporta i commenti" significhi copertura di tutti i livelli e dei contenuti storici.

Nella raccolta dei commenti di YouTube, la chiave non è aumentare continuamente il limite per pagina, ma garantire che l'attribuzione di ogni risposta, l'avanzamento di ogni task di paginazione e ogni motivo di interruzione siano sempre ricostruibili. Solo così i risultati dello scraping possono costituire una base per l'analisi, anziché diventare un file che non consente di ricostruire ciò che non è stato acquisito.

Riferimenti BL-04

Le nostre statistiche di visita interne sono sempre attive. Google Analytics viene caricato solo se scegli «Consenti analisi». Informativa sulla privacy