[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"blog-post-fr-got-scraping-nodejs-proxy-residentiel-1":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,"got-scraping-nodejs-proxy-residentiel-1","Guide got-scraping avec Node.js : proxies résidentiels et header generator","Apprenez à utiliser got-scraping avec Node.js pour des requêtes HTTP qui ressemblent à un vrai navigateur, avec rotation de proxies résidentiels ProxyHat, hooks de retry et patterns de production.","\u003Ch2>Pourquoi got-scraping avec Node.js change la donne\u003C\u002Fh2>\n\u003Cp>Si vous avez déjà écrit un scraper en Node.js avec \u003Ccode>axios\u003C\u002Fcode> ou \u003Ccode>got\u003C\u002Fcode> brut, vous connaissez le scénario : 50 requêtes passent, puis soudain vous recevez des \u003Ccode>403 Forbidden\u003C\u002Fcode> ou des challenges Cloudflare. Le problème n'est pas votre logique de scraping — c'est que votre client HTTP trahit son identité à plusieurs niveaux. got-scraping avec Node.js résout précisément cela en générant des ensembles d'en-têtes cohérents qui imitent un vrai navigateur, avec support HTTP\u002F2 natif.\u003C\u002Fp>\n\u003Cp>got-scraping est un wrapper construit par Apify au-dessus de \u003Ccode>got\u003C\u002Fcode>, le client HTTP populaire pour Node.js. Il intègre \u003Ccode>header-generator\u003C\u002Fcode>, une bibliothèque qui produit des en-têtes dans le bon ordre, avec les bonnes valeurs \u003Ccode>sec-ch-ua\u003C\u002Fcode>, \u003Ccode>accept-language\u003C\u002Fcode>, et tous les en-têtes que Chrome, Firefox ou Safari envoient réellement. Combiné à un \u003Cstrong>got-scraping proxy\u003C\u002Fstrong> résidentiel, vous obtenez un niveau de furtivité que \u003Ccode>axios.get()\u003C\u002Fcode> ne pourra jamais atteindre seul.\u003C\u002Fp>\n\u003Cblockquote>\u003Cstrong>Avertissement légal :\u003C\u002Fstrong> ce guide couvre la collecte de données publiques uniquement. Aux États-Unis, le \u003Ca href=\"https:\u002F\u002Fwww.law.cornell.edu\u002Fuscode\u002Ftext\u002F18\u002F1030\" rel=\"noopener noreferrer\">CFAA\u003C\u002Fa> criminalise l'accès non autorisé à des systèmes informatiques. En Europe, le \u003Ca href=\"https:\u002F\u002Fgdpr-info.eu\u002F\" rel=\"noopener noreferrer\">RGPD\u003C\u002Fa> régule le traitement des données personnelles. Respectez le \u003Ccode>robots.txt\u003C\u002Fcode>, les conditions d'utilisation des sites, et préférez toujours une API officielle quand elle existe.\u003C\u002Fblockquote>\n\u003Ch2>Pourquoi les requêtes got\u002Faxios brutes se font repérer\u003C\u002Fh2>\n\u003Cp>Les systèmes anti-bot modernes comme Cloudflare, Datadome et PerimeterX ne se contentent plus de vérifier un seul signal. Ils croisent plusieurs couches :\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Cstrong>Empreinte TLS (JA3\u002FJA4)\u003C\u002Fstrong> — la négociation TLS de Node.js diffère de celle de Chrome. Le JA3 fingerprint de Node 20 ne correspond à aucun navigateur connu.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Ordre des en-têtes\u003C\u002Fstrong> — Chrome envoie toujours \u003Ccode>sec-ch-ua\u003C\u002Fcode> avant \u003Ccode>user-agent\u003C\u002Fcode>, puis \u003Ccode>accept\u003C\u002Fcode>. got et axios envoient les en-têtes dans l'ordre d'insertion, ce qui est immédiatement détectable.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>En-têtes manquants\u003C\u002Fstrong> — un vrai navigateur envoie 15–25 en-têtes, dont \u003Ccode>sec-fetch-dest\u003C\u002Fcode>, \u003Ccode>sec-fetch-mode\u003C\u002Fcode>, \u003Ccode>sec-fetch-site\u003C\u002Fcode>, \u003Ccode>priority\u003C\u002Fcode>. La plupart des clients HTTP n'en envoient que 4 ou 5.\u003C\u002Fli>\n\u003Cli>HTTP\u002F2 — Chrome utilise HTTP\u002F2 par défaut avec HPACK et des paramètres SETTINGS spécifiques. Node.js en HTTP\u002F1.1 se distingue immédiatement.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>Le \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fapify\u002Fgot-scraping\" rel=\"noopener noreferrer\">dépôt got-scraping\u003C\u002Fa> d'Apify a été conçu spécifiquement pour résoudre ces problèmes. Il s'appuie sur \u003Ccode>header-generator\u003C\u002Fcode> pour produire des ensembles d'en-têtes cohérents — pas seulement un User-Agent aléatoire, mais toute la suite d'en-têtes que le navigateur choisi enverrait réellement, dans le bon ordre.\u003C\u002Fp>\n\u003Ch2>La surface idiomatique de got-scraping\u003C\u002Fh2>\n\u003Cp>got-scraping expose une API qui étend \u003Ccode>got\u003C\u002Fcode> de manière transparente. Vous pouvez l'utiliser comme un drop-in replacement, puis le configurer via \u003Ccode>got.extend()\u003C\u002Fcode>.\u003C\u002Fp>\n\u003Ch3>got.extend, useHeaderGenerator et headerGeneratorOptions\u003C\u002Fh3>\n\u003Cp>Le pattern idiomatique consiste à créer une instance personnalisée avec \u003Ccode>got.extend()\u003C\u002Fcode>, en passant \u003Ccode>useHeaderGenerator: true\u003C\u002Fcode> et des \u003Ccode>headerGeneratorOptions\u003C\u002Fcode> qui contrôlent quels profils de navigateurs sont émis :\u003C\u002Fp>\n\u003Cpre>\u003Ccode>const { gotScraping } = require(&apos;got-scraping&apos;);\n\nconst client = gotScraping.extend({\n  useHeaderGenerator: true,\n  headerGeneratorOptions: {\n    browsers: [&apos;chrome&apos;, &apos;firefox&apos;],\n    devices: [&apos;desktop&apos;],\n    operatingSystems: [&apos;windows&apos;, &apos;macos&apos;],\n    locales: [&apos;fr-FR&apos;, &apos;en-US&apos;],\n  },\n  http2: true,\n});\n\n\u002F\u002F Chaque requête reçoit un ensemble d&apos;en-têtes cohérent\nconst res = await client.get(&apos;https:\u002F\u002Fexample.com&apos;);\nconsole.log(res.headers);\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Ici, got scraping header generator garantit que si le User-Agent dit Chrome 120 sur Windows, les en-têtes \u003Ccode>sec-ch-ua\u003C\u002Fcode>, \u003Ccode>sec-ch-ua-platform\u003C\u002Fcode> et \u003Ccode>accept\u003C\u002Fcode> seront cohérents avec cette signature. C'est cette cohérence qui manque à la plupart des scrapers DIY.\u003C\u002Fp>\n\u003Ch3>L'option proxyUrl pour HTTP\u002F1 et HTTP\u002F2\u003C\u002Fh3>\n\u003Cp>got-scraping accepte une option \u003Ccode>proxyUrl\u003C\u002Fcode> qui fonctionne aussi bien avec des proxies HTTP\u002F1.1 qu'avec des proxies HTTP\u002F2. Pour un nodejs scraping \u003Ca href=\"\u002Ffr\u002Fproxy\u002Fresidential\">proxy résidentiel\u003C\u002Fa>, vous passez simplement l'URL complète :\u003C\u002Fp>\n\u003Cpre>\u003Ccode>const res = await client.get(&apos;https:\u002F\u002Fhttpbin.org\u002Fheaders&apos;, {\n  proxyUrl: &apos;http:\u002F\u002Fuser-country-US-sid-abc123:pass@gate.proxyhat.com:8080&apos;,\n});\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Le proxy résidentiel de ProxyHat supporte le tunneling HTTPS via \u003Ccode>CONNECT\u003C\u002Fcode>, ce qui signifie que votre trafic TLS reste chiffré de bout en bout — le proxy ne voit que la destination, pas le contenu.\u003C\u002Fp>\n\u003Ch2>Routage via proxies résidentiels ProxyHat\u003C\u002Fh2>\n\u003Cp>Une fois que vos en-têtes et votre empreinte TLS ressemblent à un vrai navigateur, la dernière couche de détection est l'adresse IP. Un datacenter IP (OVH, AWS, DigitalOcean) est immédiatement flagué par la plupart des bases de données IP reputation. C'est là que les proxies résidentiels deviennent essentiels.\u003C\u002Fp>\n\u003Cp>Les proxies résidentiels de ProxyHat routent votre trafic via des adresses IP attribuées par des FAI réels (AT&amp;T, Orange, Deutsche Telekom). Pour les sites anti-bot, votre requête ressemble à celle d'un utilisateur domestique normal, pas à celle d'un bot dans un datacenter.\u003C\u002Fp>\n\u003Ch3>ProxyHat HTTP sur le port 8080\u003C\u002Fh3>\n\u003Cp>Le endpoint HTTP par défaut est \u003Ccode>gate.proxyhat.com:8080\u003C\u002Fcode>. Le geo-targeting et les sessions sticky se configurent directement dans le nom d'utilisateur :\u003C\u002Fp>\n\u003Cpre>\u003Ccode>\u002F\u002F Proxy résidentiel US avec session sticky\nconst proxyUrl = &apos;http:\u002F\u002Fuser-country-US-sid-abc123:PASSWORD@gate.proxyhat.com:8080&apos;;\n\n\u002F\u002F Proxy résidentiel allemand ciblant Berlin\nconst proxyDe = &apos;http:\u002F\u002Fuser-country-DE-region-state_of_berlin-city-berlin-sid-def456:PASSWORD@gate.proxyhat.com:8080&apos;;\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3>SOCKS5 sur le port 1080\u003C\u002Fh3>\n\u003Cp>Pour les cas où SOCKS5 est préférable (par exemple, certains clients HTTP ne supportent que SOCKS5, ou vous voulez éviter le tunnel CONNECT), ProxyHat expose aussi SOCKS5 sur le port 1080 :\u003C\u002Fp>\n\u003Cpre>\u003Ccode>const proxySocks5 = &apos;socks5:\u002F\u002Fuser-country-GB-sid-ghi789:PASSWORD@gate.proxyhat.com:1080&apos;;\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Consultez la \u003Ca href=\"https:\u002F\u002Fdocs.proxyhat.com\u002F\" rel=\"noopener noreferrer\">documentation ProxyHat\u003C\u002Fa> pour la liste complète des paramètres de géo-ciblage disponibles.\u003C\u002Fp>\n\u003Ch2>Exemple Node.js complet : rotation de sessions résidentielles avec retry\u003C\u002Fh2>\n\u003Cp>Voici un exemple runnable qui combine got-scraping, la rotation de proxies résidentiels ProxyHat, et des hooks de retry. Le pattern clé : générer un identifiant de session unique par requête pour obtenir une nouvelle IP résidentielle à chaque appel.\u003C\u002Fp>\n\u003Cpre>\u003Ccode>const { gotScraping } = require(&apos;got-scraping&apos;);\nconst crypto = require(&apos;crypto&apos;);\n\nconst PROXYHAT_USER = &apos;user&apos;;\nconst PROXYHAT_PASS = &apos;pass&apos;;\n\nfunction buildProxyUrl(country = &apos;US&apos;) {\n  const session = crypto.randomBytes(8).toString(&apos;hex&apos;);\n  return `http:\u002F\u002F${PROXYHAT_USER}-country-${country}-sid-${session}:${PROXYHAT_PASS}@gate.proxyhat.com:8080`;\n}\n\nconst client = gotScraping.extend({\n  useHeaderGenerator: true,\n  headerGeneratorOptions: {\n    browsers: [&apos;chrome&apos;],\n    devices: [&apos;desktop&apos;],\n    operatingSystems: [&apos;windows&apos;],\n    locales: [&apos;en-US&apos;],\n  },\n  http2: true,\n  retry: {\n    limit: 3,\n    statusCodes: [403, 429, 500, 502, 503],\n    backoffLimit: 5000,\n  },\n  hooks: {\n    beforeRequest: [\n      (options) =&gt; {\n        \u002F\u002F Nouvelle IP résidentielle à chaque requête\n        options.proxyUrl = buildProxyUrl(&apos;US&apos;);\n      },\n    ],\n    afterResponse: [\n      (response, retryWithMergedOptions) =&gt; {\n        if (response.statusCode === 403 || response.statusCode === 429) {\n          \u002F\u002F Rotation d&apos;IP et retry\n          return retryWithMergedOptions({\n            proxyUrl: buildProxyUrl(&apos;US&apos;),\n          });\n        }\n        return response;\n      },\n    ],\n  },\n});\n\nasync function scrape(urls) {\n  const results = [];\n  for (const url of urls) {\n    try {\n      const res = await client.get(url, { timeout: { request: 15000 } });\n      results.push({ url, status: res.statusCode, length: res.body.length });\n    } catch (err) {\n      results.push({ url, error: err.message });\n    }\n  }\n  return results;\n}\n\nscrape([\n  &apos;https:\u002F\u002Fhttpbin.org\u002Fip&apos;,\n  &apos;https:\u002F\u002Fhttpbin.org\u002Fheaders&apos;,\n  &apos;https:\u002F\u002Fhttpbin.org\u002Fuser-agent&apos;,\n]).then(console.log);\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Avec ce pattern, chaque requête obtient une IP résidentielle US différente. Si une IP se fait bloquer (403\u002F429), le hook \u003Ccode>afterResponse\u003C\u002Fcode> déclenche un retry avec une nouvelle session — donc une nouvelle IP. Le \u003Ccode>retry.limit\u003C\u002Fcode> de 3 signifie jusqu'à 3 tentatives avec backoff exponentiel jusqu'à 5 secondes.\u003C\u002Fp>\n\u003Ch2>Patterns de production\u003C\u002Fh2>\n\u003Ch3>Concurrency bornée avec p-limit\u003C\u002Fh3>\n\u003Cp>Scrapper 10 000 URLs en parallèle va saturer votre machine et probablement déclencher des rate limits côté serveur. Utilisez \u003Ccode>p-limit\u003C\u002Fcode> pour borner la concurrence :\u003C\u002Fp>\n\u003Cpre>\u003Ccode>const pLimit = require(&apos;p-limit&apos;);\nconst limit = pLimit(20); \u002F\u002F 20 requêtes simultanées max\n\nconst tasks = urls.map((url) =&gt; limit(() =&gt; client.get(url)));\nconst results = await Promise.allSettled(tasks);\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>20 requêtes concurrentes est un bon point de départ. Au-delà, ajoutez un délai de 200–500ms entre les batches pour lisser la charge.\u003C\u002Fp>\n\u003Ch3>Cookie jars pour les sessions persistantes\u003C\u002Fh3>\n\u003Cp>Certains sites nécessitent une session cookie cohérente à travers plusieurs pages. got-scraping supporte \u003Ccode>tough-cookie\u003C\u002Fcode> via l'option \u003Ccode>cookieJar\u003C\u002Fcode> :\u003C\u002Fp>\n\u003Cpre>\u003Ccode>const { CookieJar } = require(&apos;tough-cookie&apos;);\nconst jar = new CookieJar();\n\nconst sessionClient = client.extend({\n  cookieJar: jar,\n  hooks: {\n    beforeRequest: [\n      (options) =&gt; {\n        options.proxyUrl = buildProxyUrl(&apos;US&apos;);\n      },\n    ],\n  },\n});\n\n\u002F\u002F La session cookie est maintenue à travers les requêtes\nawait sessionClient.get(&apos;https:\u002F\u002Fexample.com\u002Flogin&apos;);\nawait sessionClient.get(&apos;https:\u002F\u002Fexample.com\u002Fdashboard&apos;);\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Astuce : si vous voulez une session sticky (même IP + même cookies), gardez le même identifiant de session dans le nom d'utilisateur ProxyHat. Changez de session pour obtenir une nouvelle IP.\u003C\u002Fp>\n\u003Ch3>Passage à Crawlee et CheerioCrawler\u003C\u002Fh3>\n\u003Cp>Quand votre scraper grandit au-delà de quelques centaines d'URLs, il devient pertinent de passer à \u003Ca href=\"https:\u002F\u002Fcrawlee.dev\u002F\" rel=\"noopener noreferrer\">Crawlee\u003C\u002Fa>, le framework d'Apify qui encapsule got-scraping. \u003Ccode>CheerioCrawler\u003C\u002Fcode> utilise got-scraping en interne et ajoute la gestion automatique des retries, du rate limiting, et du routing :\u003C\u002Fp>\n\u003Cpre>\u003Ccode>const { CheerioCrawler } = require(&apos;crawlee&apos;);\n\nconst crawler = new CheerioCrawler({\n  requestHandler: async ({ $, request }) =&gt; {\n    const title = $(&apos;title&apos;).text();\n    console.log(request.url, title);\n  },\n  proxyConfiguration: {\n    proxyUrls: [\n      &apos;http:\u002F\u002Fuser-country-US-sid-s1:pass@gate.proxyhat.com:8080&apos;,\n      &apos;http:\u002F\u002Fuser-country-US-sid-s2:pass@gate.proxyhat.com:8080&apos;,\n      &apos;http:\u002F\u002Fuser-country-US-sid-s3:pass@gate.proxyhat.com:8080&apos;,\n    ],\n  },\n  maxRequestsPerMinute: 60,\n  autoscaledPoolOptions: { maxConcurrency: 20 },\n});\n\nawait crawler.run([&apos;https:\u002F\u002Fexample.com\u002Fpage1&apos;, &apos;https:\u002F\u002Fexample.com\u002Fpage2&apos;]);\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Crawlee gère automatiquement le pool de proxies, le scaling, et les retries. C'est le chemin naturel quand got-scraping seul ne suffit plus.\u003C\u002Fp>\n\u003Ch2>Quand un navigateur headless devient inévitable\u003C\u002Fh2>\n\u003Cp>got-scraping est excellent pour le contenu HTML statique et les API JSON. Mais certains sites nécessitent une exécution JavaScript réelle : rendu SPA (React\u002FVue), challenges Cloudflare Turnstile, ou détéction active du canvas WebGL. Dans ces cas, passez à Playwright ou Puppeteer via Crawlee's \u003Ccode>PlaywrightCrawler\u003C\u002Fcode>. Le coût est réel : un navigateur headless consomme 150–300 MB de RAM par instance, contre ~2 MB pour got-scraping. Réservez cette approche pour les sites qui le justifient vraiment.\u003C\u002Fp>\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Approche\u003C\u002Fth>\n\u003Cth>Consommation RAM\u003C\u002Fth>\n\u003Cth>Vitesse\u003C\u002Fth>\n\u003Cth>Furtivité\u003C\u002Fth>\n\u003Cth>Cas d'usage\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>axios + proxy datacenter\u003C\u002Ftd>\n\u003Ctd>~2 MB\u003C\u002Ftd>\n\u003Ctd>Très rapide\u003C\u002Ftd>\n\u003Ctd>Faible\u003C\u002Ftd>\n\u003Ctd>Sites sans protection\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>got-scraping + proxy résidentiel\u003C\u002Ftd>\n\u003Ctd>~5 MB\u003C\u002Ftd>\n\u003Ctd>Rapide\u003C\u002Ftd>\n\u003Ctd>Élevée\u003C\u002Ftd>\n\u003Ctd>HTML statique, API JSON\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Playwright + proxy résidentiel\u003C\u002Ftd>\n\u003Ctd>150–300 MB\u003C\u002Ftd>\n\u003Ctd>Lent\u003C\u002Ftd>\n\u003Ctd>Très élevée\u003C\u002Ftd>\n\u003Ctd>SPA, challenges JS\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Ch2>Éthique et bonnes pratiques\u003C\u002Fh2>\n\u003Cul>\n\u003Cli>Respectez \u003Ccode>robots.txt\u003C\u002Fcode> — vérifiez \u003Ccode>\u002Frobots.txt\u003C\u002Fcode> avant de scrapper. C'est une signal, pas une loi, mais l'ignorer vous expose à des risques.\u003C\u002Fli>\n\u003Cli>Préférez les APIs officielles — si un site propose une API publique (même payante), c'est presque toujours plus fiable et plus rapide que le scraping.\u003C\u002Fli>\n\u003Cli>Limitez votre taux — 1–5 requêtes\u002Fseconde par domaine est raisonnable. Au-delà, vous stresserez l'infrastructure cible.\u003C\u002Fli>\n\u003Cli>Données publiques uniquement — ne contournez pas de paywalls, d'authentification, ou de restrictions d'accès. Le \u003Ca href=\"https:\u002F\u002Fwww.law.cornell.edu\u002Fuscode\u002Ftext\u002F18\u002F1030\" rel=\"noopener noreferrer\">CFAA\u003C\u002Fa> et le \u003Ca href=\"https:\u002F\u002Fgdpr-info.eu\u002F\" rel=\"noopener noreferrer\">RGPD\u003C\u002Fa> s'appliquent.\u003C\u002Fli>\n\u003Cli>Identifiez-vous quand c'est approprié — pour la recherche académique ou le monitoring légitime, un User-Agent informatif peut être préférable à l'imitation.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2>Points clés à retenir\u003C\u002Fh2>\n\u003Cblockquote>\n\u003Cul>\n\u003Cli>got-scraping avec Node.js génère des en-têtes de navigateur cohérents via \u003Ccode>header-generator\u003C\u002Fcode>, résolvant le problème de l'ordre et des en-têtes manquants.\u003C\u002Fli>\n\u003Cli>Le support HTTP\u002F2 natif réduit l'écart d'empreinte TLS entre votre client et un vrai navigateur Chrome.\u003C\u002Fli>\n\u003Cli>Un got-scraping proxy résidentiel via \u003Ccode>gate.proxyhat.com:8080\u003C\u002Fcode> est essentiel une fois les en-têtes couverts — les IP datacenter restent le signal le plus facile à détecter.\u003C\u002Fli>\n\u003Cli>La rotation de sessions (identifiant unique par requête) donne une nouvelle IP résidentielle à chaque appel, avec retry automatique sur 403\u002F429.\u003C\u002Fli>\n\u003Cli>Bornez votre concurrence avec \u003Ccode>p-limit\u003C\u002Fcode> (20 concurrent max), utilisez des cookie jars pour les sessions persistantes, et passez à Crawlee pour le scraping à grande échelle.\u003C\u002Fli>\n\u003Cli>Un navigateur headless (Playwright) n'est nécessaire que pour les SPA et les challenges JS actifs — le coût RAM est 30–60x supérieur.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003C\u002Fblockquote>\n\u003Cp>Pour explorer les options de proxies résidentiels disponibles et leur tarification, consultez la page \u003Ca href=\"\u002Ffr\u002Fpricing\">tarification ProxyHat\u003C\u002Fa>. Pour voir la couverture géographique par pays et ville, visitez la page des \u003Ca href=\"\u002Ffr\u002Flocations\">locations ProxyHat\u003C\u002Fa>. Des cas d'usage détaillés sont disponibles sur \u003Ca href=\"\u002Ffr\u002Fuse-cases\u002Fweb-scraping\">web scraping\u003C\u002Fa> et \u003Ca href=\"\u002Ffr\u002Fuse-cases\u002Fserp-tracking\">SERP tracking\u003C\u002Fa>.\u003C\u002Fp>","got-scraping Node.js : proxy résidentiel et header generator | ProxyHa","Guide développeur pour got-scraping avec Node.js : header generator, proxies résidentiels ProxyHat, rotation de sessions, retry hooks et patterns de production.","\u002Ffr\u002Fblog\u002Fgot-scraping-nodejs-proxy-residentiel-1",null,"https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Ffr\u002Fgot-scraping-nodejs-proxy-residentiel-1-og.webp",[17,20,23],{"question":18,"answer":19},"Pourquoi got-scraping avec Node.js est-il important pour les utilisateurs de proxies ?","Les systèmes anti-bot modernes comme Cloudflare et Datadome croisent plusieurs signaux : empreinte TLS, ordre des en-têtes, en-têtes manquants et adresse IP. Même avec un proxy résidentiel, des en-têtes incohérents trahissent un bot. got-scraping résout la couche en-têtes et HTTP\u002F2, tandis qu'un proxy résidentiel comme ProxyHat résout la couche IP. Combinés, ils offrent un niveau de furtivité qu'aucun des deux ne peut atteindre seul.",{"question":21,"answer":22},"Quel type de proxy fonctionne le mieux avec got-scraping en Node.js ?","Les proxies résidentiels sont le meilleur choix pour got-scraping. Une fois que les en-têtes et l'empreinte TLS ressemblent à un vrai navigateur, l'adresse IP reste le signal le plus facile à détecter. Les IP datacenter (AWS, OVH, DigitalOcean) sont immédiatement flaguées par les bases de données de réputation IP. Les proxies résidentiels de ProxyHat routent le trafic via des IP attribuées par des FAI réels, rendant votre requête indiscernable de celle d'un utilisateur domestique normal.",{"question":24,"answer":25},"Comment éviter les blocages en implémentant got-scraping avec Node.js ?","Pour éviter les blocages : utilisez header-generator avec des profils de navigateurs cohérents, routez chaque requête via un proxy résidentiel avec un identifiant de session unique pour obtenir une nouvelle IP à chaque appel, implémentez des hooks afterResponse pour retry automatique sur 403\u002F429, bornez la concurrence avec p-limit (20 requêtes max), ajoutez des délais de 200-500ms entre les batches, et respectez le robots.txt ainsi que les limites de taux du site cible.",false,"2026-08-04T16:05:06+00:00","2026-10-03T08:29:58+00:00","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Ffr\u002Fgot-scraping-nodejs-proxy-residentiel-1-master.webp","got-scraping in Node.js: A Developer's Guide with Residential Proxies","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Ffr\u002Fgot-scraping-nodejs-proxy-residentiel-1-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,"guides-developpeurs","Guides Développeurs","Guides Développeurs | Blog ProxyHat","Tutoriels de code et guides SDK pour intégrer des proxies dans vos applications.",[],{"it":46,"ru":47,"en":48,"zh":49,"fr":13,"pl":50,"ko":51,"ja":52,"x-default":48},"\u002Fit\u002Fblog\u002Fguida-got-scraping-nodejs-proxy","\u002Fru\u002Fblog\u002Fgot-scraping-nodejs-residential-proxies","\u002Fblog\u002Fgot-scraping-nodejs-residential-proxies","\u002Fcn\u002Fblog\u002Fgot-scraping-nodejs-proxy-guide","\u002Fpl\u002Fblog\u002Fgot-scraping-nodejs-proxy","\u002Fko\u002Fblog\u002Fgot-scraping-nodejs-proxy-guide-1","\u002Fja\u002Fblog\u002Fgot-scraping-nodejs-purokishi",{"it":46,"ru":47,"de":54,"es":55,"en":48,"pt":56,"zh":49,"fr":13,"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,"rotation-proxies-colly-golang-1","Rotation de proxies dans Colly : guide complet pour le web scraping en Go","Apprenez à implémenter une rotation de proxies dans Colly avec des proxies résidentiels ProxyHat. Couvre proxy.RoundRobinProxySwitcher, SetProxyFunc, sessions collantes, et patterns de production pour le scraping à grande échelle.","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Ffr\u002Frotation-proxies-colly-golang-1-master.webp","Rotating Proxies in Colly: A Framework-Idiomatic Guide for Go Developers","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Ffr\u002Frotation-proxies-colly-golang-1-card.webp","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Ffr\u002Frotation-proxies-colly-golang-1-og.webp","2026-08-04T10:05:34+00:00","2026-10-03T23:53:00+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,"scraper-api-bybit-v5-proxys-rotatifs","Collecter des données de marché crypto avec des proxys rotatifs : rate limits, géoblocages et pagination (exemple Bybit V5)","Guide développeur pour scraper les endpoints \u002Fv5\u002Fmarket\u002F de Bybit avec proxys rotatifs : orderbook, tickers, kline. Code Node.js et Python, gestion des rate limits et sessions sticky.","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Ffr\u002Fscraper-api-bybit-v5-proxys-rotatifs-master.webp","How to Scrape the Bybit V5 Market API with Rotating Proxies","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Ffr\u002Fscraper-api-bybit-v5-proxys-rotatifs-card.webp","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Ffr\u002Fscraper-api-bybit-v5-proxys-rotatifs-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":4,"views":103,"author":104,"categories":105,"tags":107},194,"comment-scraper-api-rest-binance-proxies","Limites de poids des API d'exchanges crypto : collecter les données de marché avec des proxies (exemple Binance)","Guide pratique pour collecter les données de marché publiques de Binance via son API REST à grande échelle en utilisant des proxies rotatifs. Endpoints, poids, rate limiting, code Python et Node.js inclus.","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Ffr\u002Fcomment-scraper-api-rest-binance-proxies-master.webp","How to Scrape the Binance REST API with Proxies: A Developer Guide","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Ffr\u002Fcomment-scraper-api-rest-binance-proxies-card.webp","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Ffr\u002Fcomment-scraper-api-rest-binance-proxies-og.webp","2026-08-03T10:04:04+00:00","2026-10-04T01:29:50+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,"utiliser-proxy-swift-urlsession","Utiliser un proxy en Swift avec URLSession : guide développeur iOS et macOS","Guide pratique pour configurer des proxies résidentiels, datacenter et SOCKS5 dans URLSession sur iOS et macOS, avec authentification, géo-ciblage, async\u002Fawait et bonnes pratiques de production.","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Ffr\u002Futiliser-proxy-swift-urlsession-master.webp","Using Proxies in Swift: A Code-First Guide to URLSession, SOCKS5 & Residential IPs","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Ffr\u002Futiliser-proxy-swift-urlsession-card.webp","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Ffr\u002Futiliser-proxy-swift-urlsession-og.webp","2026-07-26T16:03:44+00:00","2026-10-03T08:57:48+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},[],[]]