Vai al contenuto

Cosa costruiscono le persone con un'API di web scraping

Cinque lavori che coprono gran parte del traffico che serviamo. Ognuno descrive la cosa precisa che si rompe quando fai scraping di un sito da solo, i parametri che la risolvono e quanto costa in unità di richiesta. L'API è una primitiva senza stato — un URL in ingresso, un risultato in uscita — quindi tutti e cinque sono schemi che componi, non prodotti che accendi.

Monitoraggio di prezzi e disponibilità

Seguire i prezzi dei concorrenti, le giacenze o le condizioni di spedizione su un insieme di pagine prodotto, secondo una pianificazione. La parte difficile non è quasi mai analizzare un prezzo — è che lo stesso URL mostra un prezzo diverso a seconda di dove è partita la richiesta, che le pagine di e-commerce sono le più aggressivamente protette dai bot sul web e che un monitoraggio che inizia in silenzio a restituire null sembra identico a un prodotto esaurito.

Il targeting per paese qui fa un lavoro reale, non è decorazione: "country": "de" e "country": "us" sullo stesso URL di prodotto sono due risposte diverse, e quale intendevi è una domanda di business. Le pagine retail sono anche la cosa più pesante che serviamo, il che rende block_resources il flag migliore per questo lavoro — una pagina prodotto renderizzata senza immagini si estrae in modo identico, torna più in fretta e si fattura 1 unità invece di 5.

Per il problema del null, usa i selettori e leggi field_errors. Un campo prezzo che torna null senza field_errors significa che la pagina davvero non ha un elemento prezzo; lo stesso null con una voce in field_errors significa che il sito ha cambiato markup e il tuo selettore non si compila più. Allertare sul secondo caso è il modo in cui un monitoraggio ti dice che si è rotto, invece di riferire tranquillamente che è tutto gratis.

Una forma pratica: POST /v1/batch con fino a 20 URL di prodotto, una mappa fields condivisa, "country" impostato sul mercato che stai monitorando e "block_resources": true se le pagine richiedono rendering. Ogni URL si fattura come una propria richiesta consegnata. I tentativi bloccati non costano nulla, cosa che conta molto proprio in questo lavoro, perché il tasso di ritentativi sui siti di e-commerce è il più alto di tutti quelli elencati qui.

Dati su aziende e contatti

Arricchire un elenco di aziende partendo dai loro stessi siti: cosa fa l'azienda, dove si trova, quali tecnologie o ruoli cita, se sta assumendo. L'ingresso di solito è un dominio e l'uscita è una riga in un CRM.

Questo è il lavoro in cui i selettori sono lo strumento sbagliato, e vale la pena dire chiaramente perché. Diecimila siti aziendali hanno diecimila layout diversi. Non c'è una convenzione per l'h1, non c'è una classe .about, non c'è nulla su cui selezionare — scrivere un parser per ogni sito è l'intero costo del progetto. Un prompt che descrive i campi che vuoi funziona su tutti senza conoscere il markup di nessuno, che è esattamente il caso per cui esiste l'estrazione AI. Richiede il piano Scale o superiore e si fattura con 2 unità di richiesta in più sul livello fast.

Invia uno schema insieme al prompt per fissare la forma dell'output, così ogni riga ha le stesse chiavi e l'inserimento nel tuo database non deve difendersi. Per i profili di persone e aziende, extract_type: "profile" applica un prompt e uno schema già pronti senza che tu scriva né l'uno né l'altro. Se il sito di un'azienda è un'applicazione JavaScript — e sempre più lo sono tutti — aggiungi "render": true con "block_resources": true, che mantiene il rendering a 1 unità.

Due limiti attorno a cui progettare. L'API è senza stato e non fa crawling: recupera l'URL che le dai e nient'altro, quindi trovare la pagina "Chi siamo" di un'azienda è compito tuo — "links": true restituisce ogni link della homepage risolto in URL assoluto, il che di solito basta per scegliere il recupero successivo. E i dati personali comportano obblighi indipendenti da come li hai raccolti; leggi la nostra Politica di uso accettabile e i Termini prima di costruirci sopra una pipeline.

Risultati di ricerca

Scoprire quali pagine esistono per una query, seguire nel tempo come si risolve un insieme di termini, o alimentare un passaggio di scoperta che decide cosa recuperare dopo.

POST /v1/search riceve una query e restituisce risultati organici — titolo, l'URL di destinazione reale con l'involucro di redirect del motore già rimosso, e uno snippet. Si fattura come una sola richiesta consegnata. Tieni presente la sua forma prima di pianificarci sopra: count ha un tetto di 10, perché è una pagina di risultati del motore, e chiederne di più restituisce comunque 10. Non c'è un parametro di paginazione, e aggiungerne uno non sarebbe una modifica piccola — sarebbe un altro prodotto.

Dove è davvero utile è la scoperta all'interno di una pipeline più ampia: risolvi una query in dieci URL, poi recuperi ed estrai ciascuno come si deve con il resto dell'API. Quello che non è: un prodotto di rank tracking. Se ti servono pagine di risultati profonde, parità tra motori o il monitoraggio della posizione su centinaia di parole chiave, questo endpoint non è quello, e preferiamo dirlo qui piuttosto che fartelo scoprire dopo l'integrazione.

Ricerca di mercato e sulla concorrenza

Rilevazioni una tantum o periodiche che rispondono a una domanda invece di riempire una tabella: come si posiziona un segmento, quali funzionalità pubblicizzano i concorrenti, come sono cambiate le pagine dei prezzi, cosa lasciano intendere gli annunci di lavoro di una categoria su dove si sta investendo.

Il tratto distintivo di questo lavoro è che spesso non conosci lo schema in anticipo. Non stai estraendo un campo noto da una pagina nota — stai facendo una domanda a una pagina che non hai visto. "structured": false è fatto proprio per questo: invii un prompt come "cosa vende questa azienda e a chi?" e ricevi una answer in linguaggio naturale, senza chiave data e senza nomi di campo inventati da indovinare. Costa quanto l'estrazione strutturata, perché è la stessa pagina e la stessa chiamata al modello.

Quando conosci la forma, i preset coprono quasi tutto senza schema: article per contenuti editoriali e stampa, job per segnali di assunzione, event, real_estate, discussion per discussioni di forum e community. "metadata": true è sottovalutato in questo lavoro — restituisce JSON-LD schema.org già analizzato, tag OpenGraph, canonical e date di pubblicazione, senza selettori e senza alcuna chiamata al modello, a una unità di richiesta. Una quantità sorprendente di ciò per cui la gente scrive prompt è già nei dati strutturati della pagina stessa.

Le rilevazioni di ricerca sono per natura a raffiche: nulla per una settimana, poi diverse migliaia di pagine in un pomeriggio. Il riporto si adatta a questo schema — le richieste non usate passano al periodo successivo invece di andare perse — e una raffica che supera il tuo limite di frequenza riceve un 429 con Retry-After anziché un errore, quindi basta un ciclo di backoff.

Dati di addestramento e di grounding per gli LLM

Costruire un corpus per il fine-tuning, o un indice di retrieval da cui un modello legge al momento della query. Il volume è alto, il valore per pagina è basso e l'asticella della qualità dipende interamente da come appare il testo dopo la pulizia.

"format": "markdown" è la scelta per questo. Navigazione, intestazioni, piè di pagina, colonne laterali, script e stili vengono rimossi; titoli, elenchi, link, blocchi di codice e tabelle sopravvivono; e link e immagini relativi vengono risolti in URL assoluti, il dettaglio che conta quando un frammento viene separato dalla pagina da cui proviene e nessuno può più dire a cosa si riferiva /img/3.png. Costa una unità di richiesta — come l'HTML grezzo, senza sovrapprezzo per Markdown o AI — e mandare tag HTML in una finestra di contesto significa pagarli come token due volte, una a noi e una al tuo fornitore di modelli.

Su scala di corpus, tre cose smettono di contare in teoria e iniziano a contare in fattura. Il fatto che le richieste bloccate siano gratis cambia l'economia della scansione di code lunghe di domini sconosciuti, dove il tasso di blocco è alto e imprevedibile. block_resources mantiene le pagine renderizzate a 1 unità, che su un milione di pagine è la differenza tra una fattura e cinque. E il tetto sulla dimensione della risposta è una protezione più che un limite — la risposta mediana che serviamo è di 40,6 KB, quindi quello che intercetta davvero è il recupero accidentale di un video o di un archivio che comunque non avrebbe aggiunto nulla a un corpus di testo.

Per la portata, POST /v1/batch accetta 20 URL per chiamata e POST /v1/jobs esegue il lavoro in modo asincrono con callback webhook, così una rilevazione ampia non ti costringe a tenere migliaia di connessioni aperte. I limiti di frequenza crescono con il piano, fino a 1.000 richieste al secondo. Ciò che l'API deliberatamente non fa è il crawling al posto tuo: non ha frontiera, né coda, né scheduler di cortesia, perché sono decisioni sul tuo corpus che potremmo solo sbagliare. Tu porti l'elenco di URL; noi trasformiamo ogni URL in testo pulito.

Qualcos'altro

Tutti e cinque gli schemi sono la stessa primitiva con parametri diversi, il che significa che gran parte dei lavori che non sono in questo elenco sono anch'essi solo un'altra combinazione. Il piano gratuito è di 1.000 richieste senza carta, abbastanza per scoprire se il tuo lo è.

Inizia gratis con 1.000 richieste Guarda come funziona una richiesta