[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"blog-post-it-guida-got-scraping-nodejs-proxy":3},{"success":4,"payload":5,"related":59,"errors":124},true,{"id":6,"slug":7,"title":8,"excerpt":9,"body_html":10,"meta_title":11,"meta_description":12,"canonical_url":13,"canonical_override":14,"og_title":11,"og_description":12,"og_image_url":15,"faq_json":16,"key_takeaways":14,"allow_index":4,"noindex_google_only":26,"allow_follow":4,"published_at":27,"updated_at":27,"content_updated_at":28,"featured_image_url":29,"featured_image_alt":30,"card_image_url":31,"reading_time_minutes":32,"author":33,"categories":37,"tags":44,"alternates":45,"locale_paths":53,"views":58},176,"guida-got-scraping-nodejs-proxy","Guida a got-scraping in Node.js: proxy residenziali e header generator","Una guida pratica per sviluppatori Node.js su got-scraping, il client HTTP di Apify basato su got, con header generator coerenti, proxy residenziali su gate.proxyhat.com:8080 e pattern di produzione per scraping a scala.","\u003Cp>Se hai provato a fare got-scraping in Node.js con il solo modulo \u003Ccode>got\u003C\u002Fcode> o \u003Ccode>axios\u003C\u002Fcode>, probabilmente hai visto risposte 403, sfide CAPTCHA o TLS fingerprinting che bloccano le tue richieste. La causa raramente è un singolo header mancante: è la \u003Cem>coerenza\u003C\u002Fem> dell'intera firma del client, dall'ordine degli header al fingerprint TLS, fino all'indirizzo IP di origine. \u003Cstrong>got-scraping\u003C\u002Fstrong>, il client HTTP sviluppato da Apify sopra \u003Ccode>got\u003C\u002Fcode>, affronta esattamente questo problema generando set di header coerenti per browser reali e supportando HTTP\u002F2 nativo.\u003C\u002Fp>\n\u003Cp>In questa guida vedremo come usare got-scraping in Node.js con un got-scraping \u003Ca href=\"\u002Fit\u002Fproxy\u002Fresidential\">proxy residenziale\u003C\u002Fa>, integrando la rotazione IP come middleware idiomatiko e coprendo i pattern di produzione: retry hooks, concorrenza limitata, cookie jar e passaggio a Crawlee quando serve un parser.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Nota legale.\u003C\u002Fstrong> Raccolta solo di dati pubblici. Verifica i termini di servizio del sito, onora \u003Ccode>robots.txt\u003C\u002Fcode> e i limiti di frequenza, e considera il \u003Ca href=\"https:\u002F\u002Fgdpr.eu\u002F\" rel=\"noopener noreferrer\">GDPR\u003C\u002Fa> per dati personali. Preferisci sempre API ufficiali quando disponibili. Questo articolo è a scopo educativo e non costituisce consulenza legale.\u003C\u002Fp>\n\n\u003Ch2>Cos'è got-scraping in Node.js e perché esiste\u003C\u002Fh2>\n\u003Cp>got-scraping è un wrapper attorno a \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fsindresorhus\u002Fgot\" rel=\"noopener noreferrer\">got\u003C\u002Fa>, il popolare client HTTP per Node.js, pensato specificamente per lo scraping. Il suo vantaggio principale è l'integrazione di \u003Cstrong>header-generator\u003C\u002Fstrong>, una libreria che produce set di header coerenti con browser reali (Chrome, Firefox, Safari) su sistemi operativi e dispositivi realistici. Inoltre, supporta HTTP\u002F2 out-of-the-box, riducendo la latenza e rendendo il fingerprint TLS più simile a quello di un browser moderno.\u003C\u002Fp>\n\u003Cp>Il problema che risolve è concreto: i server anti-bot come Akamai, Cloudflare e Datadome non guardano solo il valore di \u003Ccode>User-Agent\u003C\u002Fcode>. Confrontano l'intero set di header, l'ordine in cui appaiono, i valori \u003Ccode>sec-ch-ua\u003C\u002Fcode>, \u003Ccode>accept-language\u003C\u002Fcode>, e il fingerprint TLS (JA3\u002FJA4). Un client Node.js con un \u003Ccode>User-Agent\u003C\u002Fcode> Chrome ma header \u003Ccode>accept-encoding\u003C\u002Fcode> mancanti, o con un ordine anomalo, viene identificato come bot in millisecondi.\u003C\u002Fp>\n\n\u003Ch3>Perché got o axios non bastano\u003C\u002Fh3>\n\u003Cp>Con \u003Ccode>got\u003C\u002Fcode> puro devi costruire manualmente ogni header e mantenerli coerenti. Se aggiorni il \u003Ccode>User-Agent\u003C\u002Fcode> a Chrome 120, devi aggiornare anche \u003Ccode>sec-ch-ua\u003C\u002Fcode>, \u003Ccode>sec-ch-ua-platform\u003C\u002Fcode> e l'ordine. È fragile. got-scraping automatizza questo: genera un set completo e coerente a partire da un profilo browser, così ogni richiesta sembra provenire da un browser reale.\u003C\u002Fp>\n\n\u003Ch2>La superficie idiomatika: got.extend, useHeaderGenerator e proxyUrl\u003C\u002Fh2>\n\u003Cp>got-scraping espone una API idiomatika basata su \u003Ccode>got.extend()\u003C\u002Fcode>, il pattern standard di got per creare istanze personalizzate con opzioni predefinite. L'estensione avviene tramite middleware di hook, non con hack.\u003C\u002Fp>\n\n\u003Ch3>useHeaderGenerator e headerGeneratorOptions\u003C\u002Fh3>\n\u003Cp>Il middleware \u003Ccode>useHeaderGenerator\u003C\u002Fcode> inietta gli header generati in ogni richiesta. Le opzioni chiave sono \u003Ccode>browsers\u003C\u002Fcode>, \u003Ccode>devices\u003C\u002Fcode> e \u003Ccode>operatingSystems\u003C\u002Fcode>, che controllano il profilo del browser simulato.\u003C\u002Fp>\n\n\u003Cpre>\u003Ccode>import { gotScraping } from &apos;got-scraping&apos;;\nimport { useHeaderGenerator } from &apos;got-scraping&apos;;\nimport { HeaderGenerator } from &apos;header-generator&apos;;\n\nconst headerGenerator = new HeaderGenerator({\n  browsers: [&apos;chrome&apos;],\n  devices: [&apos;desktop&apos;],\n  operatingSystems: [&apos;windows&apos;, &apos;macos&apos;],\n  locales: [&apos;en-US&apos;, &apos;en&apos;],\n});\n\nconst client = gotScraping.extend({\n  http2: true,\n  hooks: {\n    beforeRequest: [useHeaderGenerator(headerGenerator)],\n  },\n});\n\u003C\u002Fcode>\u003C\u002Fpre>\n\n\u003Cp>Ogni richiesta riceve un set di header coerente: \u003Ccode>user-agent\u003C\u002Fcode>, \u003Ccode>sec-ch-ua\u003C\u002Fcode>, \u003Ccode>sec-ch-ua-platform\u003C\u002Fcode>, \u003Ccode>accept\u003C\u002Fcode>, \u003Ccode>accept-language\u003C\u002Fcode>, \u003Ccode>accept-encoding\u003C\u002Fcode> e altri, nell'ordine atteso dal browser scelto. Questo risolve il problema del \u003Cstrong>got scraping header generator\u003C\u002Fstrong> che molti sviluppatori cercano di reinventare manualmente.\u003C\u002Fp>\n\n\u003Ch3>L'opzione proxyUrl per HTTP\u002F1 e HTTP\u002F2\u003C\u002Fh3>\n\u003Cp>got-scraping accetta \u003Ccode>proxyUrl\u003C\u002Fcode> come opzione per-request o come default nell'estensione. Supporta sia proxy HTTP\u002F1 che HTTP\u002F2, e SOCKS5 con il prefisso \u003Ccode>socks5:\u002F\u002F\u003C\u002Fcode>. Questo rende l'integrazione di un \u003Cstrong>nodejs scraping proxy\u003C\u002Fstrong> una riga di configurazione.\u003C\u002Fp>\n\n\u003Cpre>\u003Ccode>const res = await client(&apos;https:\u002F\u002Fexample.com&apos;, {\n  proxyUrl: &apos;http:\u002F\u002Fuser-country-US-sid-abc123:pass@gate.proxyhat.com:8080&apos;,\n});\nconsole.log(res.statusCode);\n\u003C\u002Fcode>\u003C\u002Fpre>\n\n\u003Ch2>Routing tramite proxy residenziali su gate.proxyhat.com:8080\u003C\u002Fh2>\n\u003Cp>Una volta che header e TLS sembrano reali, il punto debole rimane l'IP. Un datacenter IP è facilmente identificabile come hosting (AWS, DigitalOcean, OVH). I proxy residenziali usano IP assegnati a ISP reali, quindi il traffico risulta provenire da un utente domestico. Questo è il motivo per cui un got-scraping proxy residenziale è spesso la differenza tra successo e blocchi.\u003C\u002Fp>\n\u003Cp>Con ProxyHat, il gateway HTTP è \u003Ccode>gate.proxyhat.com:8080\u003C\u002Fcode>. La geo-targeting e la sessione vanno nel \u003Cem>username\u003C\u002Fem>, non nella query string:\u003C\u002Fp>\n\n\u003Cul>\n  \u003Cli>\u003Ccode>user-country-US\u003C\u002Fcode> — IP statunitensi\u003C\u002Fli>\n  \u003Cli>\u003Ccode>user-country-DE-region-state_of_berlin-city-berlin\u003C\u002Fcode> — IP di Berlino\u003C\u002Fli>\n  \u003Cli>\u003Ccode>user-sid-abc123\u003C\u002Fcode> — sessione sticky per mantenere lo stesso IP\u003C\u002Fli>\n\u003C\u002Ful>\n\n\u003Cp>Per SOCKS5, la porta è \u003Ccode>1080\u003C\u002Fcode>:\u003C\u002Fp>\n\n\u003Cpre>\u003Ccode>const res = await client(&apos;https:\u002F\u002Fexample.com&apos;, {\n  proxyUrl: &apos;socks5:\u002F\u002Fuser-country-US-sid-abc123:pass@gate.proxyhat.com:1080&apos;,\n});\n\u003C\u002Fcode>\u003C\u002Fpre>\n\n\u003Ch3>Perché le sessioni sticky importano\u003C\u002Fh3>\n\u003Cp>Molti siti mantengono stato in cookie e token CSRF legati all'IP. Se ruoti IP a ogni richiesta, perdi la sessione e scateni sfide anti-bot. Con \u003Ccode>user-sid-abc123\u003C\u002Fcode> ProxyHat mantiene lo stesso IP residenziale per una finestra configurabile, permettendo login, navigazione multi-pagina e carrelli e-commerce senza perdere lo stato.\u003C\u002Fp>\n\n\u003Ch2>Esempio Node.js con rotazione e retry hooks\u003C\u002Fh2>\n\u003Cp>Vediamo un esempio completo: rotazione di sessioni residenziali con retry automatico su 403\u002F429, usando un middleware ProxyHat che genera username per-request.\u003C\u002Fp>\n\n\u003Cpre>\u003Ccode>import { gotScraping } from &apos;got-scraping&apos;;\nimport { useHeaderGenerator } from &apos;got-scraping&apos;;\nimport { HeaderGenerator } from &apos;header-generator&apos;;\nimport { randomBytes } from &apos;crypto&apos;;\n\nconst PROXYHAT_USER = process.env.PROXYHAT_USER;\nconst PROXYHAT_PASS = process.env.PROXYHAT_PASS;\nconst GATE = &apos;gate.proxyhat.com&apos;;\n\nconst headerGenerator = new HeaderGenerator({\n  browsers: [&apos;chrome&apos;],\n  devices: [&apos;desktop&apos;],\n  operatingSystems: [&apos;windows&apos;],\n  locales: [&apos;en-US&apos;, &apos;en&apos;],\n});\n\nfunction proxyUrl(country = &apos;US&apos;, session = null) {\n  const sid = session ?? randomBytes(6).toString(&apos;hex&apos;);\n  const user = `user-country-${country}-sid-${sid}`;\n  return `http:\u002F\u002F${user}:${PROXYHAT_PASS}@${GATE}:8080`;\n}\n\nconst client = gotScraping.extend({\n  http2: true,\n  timeout: { request: 20000 },\n  retry: { limit: 3, statusCodes: [403, 429, 500, 502, 503] },\n  hooks: {\n    beforeRequest: [\n      useHeaderGenerator(headerGenerator),\n      (options) =&gt; {\n        \u002F\u002F rotazione per-request: nuova sessione se non già impostata\n        if (!options.context?.keepSession) {\n          options.proxyUrl = proxyUrl(&apos;US&apos;);\n        }\n      },\n    ],\n    beforeRetry: [\n      (error, retryCount) =&gt; {\n        console.warn(`Retry ${retryCount} after ${error.response?.statusCode}`);\n      },\n    ],\n    afterResponse: [\n      (response, retryWithMergedOptions) =&gt; {\n        if (response.statusCode === 403) {\n          \u002F\u002F ruota sessione e riproca\n          return retryWithMergedOptions({\n            proxyUrl: proxyUrl(&apos;US&apos;),\n          });\n        }\n        return response;\n      },\n    ],\n  },\n});\n\n\u002F\u002F uso\nconst res = await client(&apos;https:\u002F\u002Fexample.com\u002Fapi\u002Fproducts&apos;, {\n  responseType: &apos;json&apos;,\n});\nconsole.log(res.body.length);\n\u003C\u002Fcode>\u003C\u002Fpre>\n\n\u003Cp>Il pattern chiave: \u003Ccode>afterResponse\u003C\u002Fcode> intercetta i 403 e chiama \u003Ccode>retryWithMergedOptions\u003C\u002Fcode> con un nuovo \u003Ccode>proxyUrl\u003C\u002Fcode> generato da \u003Ccode>proxyUrl('US')\u003C\u002Fcode>. Questo è un \u003Cem>middleware\u003C\u002Fem> idiomatiko di got, non un wrapper esterno.\u003C\u002Fp>\n\n\u003Ch3>ProxyHat SDK per username per-request\u003C\u002Fh3>\n\u003Cp>Per progetti più grandi, puoi astrarre la generazione dell'username in un piccolo helper o SDK interno che gestisce pool di sessioni, rate limiting per-country e fallback. Consulta la \u003Ca href=\"https:\u002F\u002Fdocs.proxyhat.com\u002F\" rel=\"noopener noreferrer\">documentazione ProxyHat\u003C\u002Fa> per i parametri supportati e le best practice.\u003C\u002Fp>\n\n\u003Ch2>Pattern di produzione: concorrenza, cookie jar e Crawlee\u003C\u002Fh2>\n\u003Cp>Lo scraping a scala richiede più di una singola richiesta. Ecco i pattern essenziali.\u003C\u002Fp>\n\n\u003Ch3>Concorrenza limitata con p-limit\u003C\u002Fh3>\n\u003Cp>Senza un limite, apri centinaia di connessioni simultanee, saturi il pool di socket e ottieni errori di timeout. Usa \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fsindresorhus\u002Fp-limit\" rel=\"noopener noreferrer\">p-limit\u003C\u002Fa> per vincolare la concorrenza.\u003C\u002Fp>\n\n\u003Cpre>\u003Ccode>import pLimit from &apos;p-limit&apos;;\n\nconst limit = pLimit(20); \u002F\u002F 20 richieste concorrenti\n\nconst urls = [&apos;https:\u002F\u002Fexample.com\u002Fa&apos;, &apos;https:\u002F\u002Fexample.com\u002Fb&apos;, \u002F* ... *\u002F];\nconst results = await Promise.all(\n  urls.map((url) =&gt; limit(() =&gt; client(url, { responseType: &apos;json&apos; })))\n);\n\u003C\u002Fcode>\u003C\u002Fpre>\n\n\u003Cp>Con 20 connessioni concorrenti e ~200ms per richiesta, puoi processare circa 100 richieste al secondo per worker. Scala orizzontalmente con container separati per superare i limiti di un singolo nodo.\u003C\u002Fp>\n\n\u003Ch3>Cookie jar per sessioni autenticate\u003C\u002Fh3>\n\u003Cp>got supporta \u003Ccode>tough-cookie\u003C\u002Fcode> nativamente. Usa un cookie jar per mantenere la sessione tra richieste consecutive con lo stesso IP sticky.\u003C\u002Fp>\n\n\u003Cpre>\u003Ccode>import { CookieJar } from &apos;tough-cookie&apos;;\n\nconst jar = new CookieJar();\nconst sessionClient = client.extend({\n  cookieJar: jar,\n  context: { keepSession: true },\n  proxyUrl: proxyUrl(&apos;US&apos;, &apos;persistent-sid-1&apos;),\n});\n\nawait sessionClient(&apos;https:\u002F\u002Fexample.com\u002Flogin&apos;, { method: &apos;POST&apos;, json: { user, pass } });\nconst dashboard = await sessionClient(&apos;https:\u002F\u002Fexample.com\u002Fdashboard&apos;);\n\u003C\u002Fcode>\u003C\u002Fpre>\n\n\u003Ch3>Passare a Crawlee CheerioCrawler\u003C\u002Fh3>\n\u003Cp>Quando hai bisogno di parsing HTML strutturato, code di URL e gestione degli errori, Crawlee è il framework di Apify che usa got-scraping sotto il cofano. \u003Ccode>CheerioCrawler\u003C\u002Fcode> è ideale per HTML statico.\u003C\u002Fp>\n\n\u003Cpre>\u003Ccode>import { CheerioCrawler } from &apos;crawlee&apos;;\n\nconst crawler = new CheerioCrawler({\n  async requestHandler({ $, request }) {\n    const titles = $(&apos;h2.product-title&apos;).text();\n    console.log(request.url, titles);\n  },\n  maxConcurrency: 20,\n  proxyConfiguration: {\n    proxyUrls: [proxyUrl(&apos;US&apos;)],\n  },\n});\n\nawait crawler.run([&apos;https:\u002F\u002Fexample.com\u002Fproducts&apos;]);\n\u003C\u002Fcode>\u003C\u002Fpre>\n\n\u003Cp>Crawlee gestisce automaticamente retry, rotazione proxy e code. È il livello di astrazione successivo quando got-scraping da solo diventa troppo manuale.\u003C\u002Fp>\n\n\u003Ch2>Confronto: got-scraping vs got vs axios per scraping\u003C\u002Fh2>\n\n\u003Ctable>\n  \u003Cthead>\n    \u003Ctr>\n      \u003Cth>Feature\u003C\u002Fth>\n      \u003Cth>got-scraping\u003C\u002Fth>\n      \u003Cth>got\u003C\u002Fth>\n      \u003Cth>axios\u003C\u002Fth>\n    \u003C\u002Ftr>\n  \u003C\u002Fthead>\n  \u003Ctbody>\n    \u003Ctr>\n      \u003Ctd>Header generator integrato\u003C\u002Ftd>\n      \u003Ctd>Sì\u003C\u002Ftd>\n      \u003Ctd>No (manuale)\u003C\u002Ftd>\n      \u003Ctd>No (manuale)\u003C\u002Ftd>\n    \u003C\u002Ftr>\n    \u003Ctr>\n      \u003Ctd>HTTP\u002F2 nativo\u003C\u002Ftd>\n      \u003Ctd>Sì\u003C\u002Ftd>\n      \u003Ctd>Sì (v12+)\u003C\u002Ftd>\n      \u003Ctd>Limitato\u003C\u002Ftd>\n    \u003C\u002Ftr>\n    \u003Ctr>\n      \u003Ctd>Supporto SOCKS5 proxy\u003C\u002Ftd>\n      \u003Ctd>Sì\u003C\u002Ftd>\n      \u003Ctd>Tramite agent\u003C\u002Ftd>\n      \u003Ctd>Tramite agent\u003C\u002Ftd>\n    \u003C\u002Ftr>\n    \u003Ctr>\n      \u003Ctd>Retry hooks idiomatiki\u003C\u002Ftd>\n      \u003Ctd>Sì\u003C\u002Ftd>\n      \u003Ctd>Sì\u003C\u002Ftd>\n      \u003Ctd>No (manuale)\u003C\u002Ftd>\n    \u003C\u002Ftr>\n    \u003Ctr>\n      \u003Ctd>Integrazione Crawlee\u003C\u002Ftd>\n      \u003Ctd>Nativa\u003C\u002Ftd>\n      \u003Ctd>Indiretta\u003C\u002Ftd>\n      \u003Ctd>No\u003C\u002Ftd>\n    \u003C\u002Ftr>\n    \u003Ctr>\n      \u003Ctd>Footprint browser-like\u003C\u002Ftd>\n      \u003Ctd>Alto\u003C\u002Ftd>\n      \u003Ctd>Basso\u003C\u002Ftd>\n      \u003Ctd>Basso\u003C\u002Ftd>\n    \u003C\u002Ftr>\n  \u003C\u002Ftbody>\n\u003C\u002Ftable>\n\n\u003Ch2>Quando serve un browser headless\u003C\u002Fh2>\n\u003Cp>got-scraping è potente per HTML statico e API JSON, ma non esegue JavaScript. Se il sito renderizza contenuti client-side (React, Vue, Next.js SSR dinamico) o usa sfide Cloudflare\u002FDatadome basate su esecuzione JS, serve un browser headless: Playwright o Puppeteer. Crawlee offre \u003Ccode>PlaywrightCrawler\u003C\u002Fcode> che combina il controllo browser con la rotazione proxy di got-scraping.\u003C\u002Fp>\n\u003Cp>Regola pratica: se \u003Ccode>curl\u003C\u002Fcode> o got-scraping restituiscono HTML senza i dati cercati, il sito sta renderizzando lato client. A quel punto, passa a Playwright con lo stesso setup proxy.\u003C\u002Fp>\n\n\u003Ch2>Etica, conformità e limiti\u003C\u002Fh2>\n\u003Cp>Lo scraping responsabile non è opzionale. Alcuni principi:\u003C\u002Fp>\n\u003Cul>\n  \u003Cli>Dati pubblici solo. Non accedere ad aree autenticate senza permesso esplicito.\u003C\u002Fli>\n  \u003Cli>Onora robots.txt. Verifica \u003Ccode>\u002Frobots.txt\u003C\u002Fcode> prima di avviare una raccolta su larga scala.\u003C\u002Fli>\n  \u003Cli>Rate limiting. Mantieni una concorrenza ragionevole (es. 20 richieste concorrenti) e aggiungi delay tra le richieste per non impattare il server target.\u003C\u002Fli>\n  \u003Cli>GDPR e CCPA. Dati personali (nomi, email, IP) sono regolamentati. Se raccogli dati personali di utenti UE, applica i principi del GDPR.\u003C\u002Fli>\n  \u003Cli>Preferisci API ufficiali. Se il sito offre un'API pubblica o a pagamento, usala. È più stabile e legalmente più sicura.\u003C\u002Fli>\n  \u003Cli>CFAA. Negli USA, il Computer Fraud and Abuse Act può applicarsi ad accessi non autorizzati. Consulta un avvocato per casi complessi.\u003C\u002Fli>\n\u003C\u002Ful>\n\n\u003Ch2>Pattern di scaling: container e headless fleet\u003C\u002Fh2>\n\u003Cp>Per scala oltre un singolo worker, containerizza con Docker e scala orizzontalmente. Ogni container esegue un worker con il proprio pool di sessioni ProxyHat. Con 10 container a 20 connessioni ciascuno, raggiungi 200 sessioni concorrenti, sufficienti per la maggior parte dei job di monitoraggio prezzi o SERP.\u003C\u002Fp>\n\u003Cp>Per browser headless, usa un'orchestrazione come \u003Ccode>browserless\u003C\u002Fcode> o un pool Playwright gestito. Mantieni i proxy residenziali per evitare che l'IP del container venga bloccato dopo poche richieste.\u003C\u002Fp>\n\n\u003Ch2>Key Takeaways\u003C\u002Fh2>\n\u003Cblockquote>\n  \u003Cul>\n    \u003Cli>got-scraping risolve il problema degli header coerenti con \u003Ccode>header-generator\u003C\u002Fcode> e supporta HTTP\u002F2 nativo.\u003C\u002Fli>\n    \u003Cli>Usa \u003Ccode>got.extend()\u003C\u002Fcode> con \u003Ccode>useHeaderGenerator\u003C\u002Fcode> come middleware idiomatiko, non hack manuali.\u003C\u002Fli>\n    \u003Cli>Proxy residenziali su \u003Ccode>gate.proxyhat.com:8080\u003C\u002Fcode> (HTTP) o \u003Ccode>:1080\u003C\u002Fcode> (SOCKS5) sono essenziali una volta che header e TLS sono realistici.\u003C\u002Fli>\n    \u003Cli>Sessioni sticky (\u003Ccode>user-sid-xxx\u003C\u002Fcode>) per mantenere stato tra richieste; rotazione per-request per distribuire il carico.\u003C\u002Fli>\n    \u003Cli>\u003Ccode>afterResponse\u003C\u002Fcode> e \u003Ccode>beforeRetry\u003C\u002Fcode> hooks per rotazione automatica su 403\u002F429.\u003C\u002Fli>\n    \u003Cli>Limita concorrenza con \u003Ccode>p-limit\u003C\u002Fcode> (es. 20), usa cookie jar per sessioni autenticate, passa a Crawlee per parsing complesso.\u003C\u002Fli>\n    \u003Cli>Per contenuti renderizzati lato client, usa Playwright con gli stessi proxy.\u003C\u002Fli>\n    \u003Cli>Etica: dati pubblici, robots.txt, rate limit, GDPR, API ufficiali quando disponibili.\u003C\u002Fli>\n  \u003C\u002Ful>\n\u003C\u002Fblockquote>\n\n\u003Cp>Pronto a iniziare? Esplora i \u003Ca href=\"\u002Fit\u002Fpricing\">piani ProxyHat\u003C\u002Fa>, le \u003Ca href=\"\u002Fit\u002Flocations\">locazioni disponibili\u003C\u002Fa> e i casi d'uso per \u003Ca href=\"\u002Fit\u002Fuse-cases\u002Fweb-scraping\">web scraping\u003C\u002Fa> e \u003Ca href=\"\u002Fit\u002Fuse-cases\u002Fserp-tracking\">SERP tracking\u003C\u002Fa>. Per i dettagli tecnici del gateway, consulta la \u003Ca href=\"https:\u002F\u002Fdocs.proxyhat.com\u002F\" rel=\"noopener noreferrer\">documentazione ufficiale\u003C\u002Fa>.\u003C\u002Fp>","got-scraping in Node.js con proxy residenziali | ProxyHat","Guida pratica a got-scraping in Node.js: header generator, proxy residenziali su gate.proxyhat.com:8080, retry hooks e pattern di produzione per scraping a scala.","\u002Fit\u002Fblog\u002Fguida-got-scraping-nodejs-proxy",null,"https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Fit\u002Fguida-got-scraping-nodejs-proxy-og.webp",[17,20,23],{"question":18,"answer":19},"Perché got-scraping in Node.js è importante per chi usa proxy?","Anche con un proxy residenziale perfetto, se gli header HTTP non sono coerenti con il browser dichiarato nel User-Agent, i sistemi anti-bot come Cloudflare e Datadome bloccano la richiesta. got-scraping risolve questo generando set di header completi e nell'ordine corretto, permettendo al proxy residenziale di funzionare davvero. Senza header coerenti, il proxy da solo non basta.",{"question":21,"answer":22},"Quale tipo di proxy funziona meglio con got-scraping in Node.js?","I proxy residenziali sono la scelta migliore per got-scraping, perché usano IP assegnati a ISP reali e risultano indistinguibili da traffico domestico. I proxy datacenter vengono identificati facilmente come hosting. Con ProxyHat, il gateway HTTP è gate.proxyhat.com:8080 e SOCKS5 è sulla porta 1080, con geo-targeting e sessioni sticky nel username.",{"question":24,"answer":25},"Come evitare i blocchi quando si implementa got-scraping in Node.js?","Usa header-generator per header coerenti, proxy residenziali per IP realistici, sessioni sticky per mantenere stato, retry hooks per ruotare automaticamente su 403\u002F429, e limita la concorrenza con p-limit (es. 20 richieste). Aggiungi delay tra le richieste, onora robots.txt e preferisci API ufficiali quando disponibili. Per siti con rendering client-side, passa a Playwright con gli stessi proxy.",false,"2026-08-04T16:05:06+00:00","2026-10-03T08:29:58+00:00","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Fit\u002Fguida-got-scraping-nodejs-proxy-master.webp","got-scraping in Node.js: A Developer's Guide with Residential Proxies","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Fit\u002Fguida-got-scraping-nodejs-proxy-card.webp",12,{"name":34,"slug":35,"bio":36,"avatar_url":14,"website_url":14,"social_links":14},"ProxyHat Team","proxyhat-team","The ProxyHat editorial team covers proxies, web scraping, and data extraction.",[38],{"id":39,"slug":40,"name":41,"description":14,"meta_title":42,"meta_description":43,"parent_id":14},4,"developer-guides","Guide per sviluppatori","Guida agli sviluppatori | ProxyHat Blog","Istruzioni di codice e guide SDK per integrare i proxy nelle applicazioni.",[],{"it":13,"ru":46,"en":47,"zh":48,"fr":49,"pl":50,"ko":51,"ja":52,"x-default":47},"\u002Fru\u002Fblog\u002Fgot-scraping-nodejs-residential-proxies","\u002Fblog\u002Fgot-scraping-nodejs-residential-proxies","\u002Fcn\u002Fblog\u002Fgot-scraping-nodejs-proxy-guide","\u002Ffr\u002Fblog\u002Fgot-scraping-nodejs-proxy-residentiel-1","\u002Fpl\u002Fblog\u002Fgot-scraping-nodejs-proxy","\u002Fko\u002Fblog\u002Fgot-scraping-nodejs-proxy-guide-1","\u002Fja\u002Fblog\u002Fgot-scraping-nodejs-purokishi",{"it":13,"ru":46,"de":54,"es":55,"en":47,"pt":56,"zh":48,"fr":49,"pl":50,"ko":51,"ja":52,"tr":57},"\u002Fde\u002Fblog\u002Fgot-scraping-nodejs-proxy-guide","\u002Fes\u002Fblog\u002Fguia-got-scraping-nodejs-proxy-residencial","\u002Fpt\u002Fblog\u002Fguia-got-scraping-nodejs-proxies-residenciais","\u002Ftr\u002Fblog\u002Fnodejs-got-scraping-proxy-rehberi",121,[60,76,92,108],{"id":61,"slug":62,"title":63,"excerpt":64,"featured_image_url":65,"featured_image_alt":66,"card_image_url":67,"og_image_url":68,"published_at":69,"updated_at":69,"content_updated_at":70,"reading_time_minutes":32,"is_featured":26,"indexable":26,"views":71,"author":72,"categories":73,"tags":75},175,"proxy-rotanti-in-colly-guida","Proxy Rotanti in Colly: Guida Pratica per Go Developer","Scopri come integrare proxy rotanti in Colly con un approccio idiomatico: RoundRobinProxySwitcher, sessioni sticky, geo-targeting e pattern di produzione per scraping ad alto throughput in Go.","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Fit\u002Fproxy-rotanti-in-colly-guida-master.webp","Rotating Proxies in Colly: A Framework-Idiomatic Guide for Go Developers","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Fit\u002Fproxy-rotanti-in-colly-guida-card.webp","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Fit\u002Fproxy-rotanti-in-colly-guida-og.webp","2026-08-04T10:05:34+00:00","2026-10-03T08:29:56+00:00",71,{"name":34,"slug":35,"bio":36,"avatar_url":14,"website_url":14,"social_links":14},[74],{"id":39,"slug":40,"name":41,"description":14,"meta_title":42,"meta_description":43,"parent_id":14},[],{"id":77,"slug":78,"title":79,"excerpt":80,"featured_image_url":81,"featured_image_alt":82,"card_image_url":83,"og_image_url":84,"published_at":85,"updated_at":85,"content_updated_at":86,"reading_time_minutes":32,"is_featured":26,"indexable":4,"views":87,"author":88,"categories":89,"tags":91},195,"scrape-bybit-v5-market-api-proxy","Raccogliere Dati di Mercato Crypto con Proxy Rotanti: Guida per Sviluppatori (Esempio Bybit V5)","Guida pratica per sviluppatori su come scrapeare gli endpoint pubblici \u002Fv5\u002Fmarket\u002F di Bybit con proxy rotanti ProxyHat. Esempi in Node.js e Python, gestione dei rate limit e geo-restrizioni.","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Fit\u002Fscrape-bybit-v5-market-api-proxy-master.webp","How to Scrape the Bybit V5 Market API with Rotating Proxies","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Fit\u002Fscrape-bybit-v5-market-api-proxy-card.webp","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Fit\u002Fscrape-bybit-v5-market-api-proxy-og.webp","2026-08-03T16:09:16+00:00","2026-10-04T01:29:51+00:00",87,{"name":34,"slug":35,"bio":36,"avatar_url":14,"website_url":14,"social_links":14},[90],{"id":39,"slug":40,"name":41,"description":14,"meta_title":42,"meta_description":43,"parent_id":14},[],{"id":93,"slug":94,"title":95,"excerpt":96,"featured_image_url":97,"featured_image_alt":98,"card_image_url":99,"og_image_url":100,"published_at":101,"updated_at":101,"content_updated_at":102,"reading_time_minutes":32,"is_featured":26,"indexable":26,"views":103,"author":104,"categories":105,"tags":107},194,"scraping-binance-rest-api-con-proxy","Come fare scraping della Binance REST API con proxy: guida per sviluppatori","Guida pratica per raccogliere dati di mercato pubblici da Binance tramite proxy rotanti: endpoint, pesi, rate limit, esempi in Python e Node.js con il SDK ProxyHat.","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Fit\u002Fscraping-binance-rest-api-con-proxy-master.webp","How to Scrape the Binance REST API with Proxies: A Developer Guide","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Fit\u002Fscraping-binance-rest-api-con-proxy-card.webp","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Fit\u002Fscraping-binance-rest-api-con-proxy-og.webp","2026-08-03T10:04:04+00:00","2026-10-03T08:29:51+00:00",82,{"name":34,"slug":35,"bio":36,"avatar_url":14,"website_url":14,"social_links":14},[106],{"id":39,"slug":40,"name":41,"description":14,"meta_title":42,"meta_description":43,"parent_id":14},[],{"id":109,"slug":110,"title":111,"excerpt":112,"featured_image_url":113,"featured_image_alt":114,"card_image_url":115,"og_image_url":116,"published_at":117,"updated_at":117,"content_updated_at":118,"reading_time_minutes":32,"is_featured":26,"indexable":26,"views":119,"author":120,"categories":121,"tags":123},172,"usare-proxy-in-swift-urlsession-1","Usare proxy in Swift con URLSession: guida pratica per iOS e macOS","Una guida code-first per configurare proxy residenziali in Swift tramite URLSession, con esempi su HTTP\u002FSOCKS5, autenticazione, geo-targeting, async\u002Fawait e best practice di produzione.","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Fit\u002Fusare-proxy-in-swift-urlsession-1-master.webp","Using Proxies in Swift: A Code-First Guide to URLSession, SOCKS5 & Residential IPs","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Fit\u002Fusare-proxy-in-swift-urlsession-1-card.webp","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Fit\u002Fusare-proxy-in-swift-urlsession-1-og.webp","2026-07-26T16:03:44+00:00","2026-10-03T23:53:00+00:00",234,{"name":34,"slug":35,"bio":36,"avatar_url":14,"website_url":14,"social_links":14},[122],{"id":39,"slug":40,"name":41,"description":14,"meta_title":42,"meta_description":43,"parent_id":14},[],[]]