﻿﻿{"id":2499,"date":"2026-03-11T14:47:06","date_gmt":"2026-03-11T13:47:06","guid":{"rendered":"https:\/\/elearningsamba.com\/index.php\/cloudflare-crawl-aspirez-un-site-entier-en-un-seul-appel-api\/"},"modified":"2026-03-11T14:47:06","modified_gmt":"2026-03-11T13:47:06","slug":"cloudflare-crawl-aspirez-un-site-entier-en-un-seul-appel-api","status":"publish","type":"page","link":"https:\/\/elearningsamba.com\/index.php\/cloudflare-crawl-aspirez-un-site-entier-en-un-seul-appel-api\/","title":{"rendered":"Cloudflare \/crawl &#8211; Aspirez un site entier en un seul appel API"},"content":{"rendered":"<p>Crawler un site entier, \u00e7a devrait pas \u00eatre aussi compliqu\u00e9. Et pourtant, entre les scripts maison qui cassent tous les 2 jours et les headless browsers qui bouffent de la RAM comme pas permis, c&#8217;est assez la gal\u00e8re ! Du coup, Cloudflare, dans sa grande bont\u00e9 (lol) vient de sortir un endpoint <code>\/crawl<\/code> (en open beta) dans la section Browser Rendering qui simplifie tout \u00e7a&#8230; vous balancez une URL dessus et hop, \u00e7a ASPIRE tout le site (oui oui).<\/p>\n<p>En gros, vous envoyez une requ\u00eate POST avec l&#8217;URL de d\u00e9part, et le service se charge de d\u00e9couvrir les pages (via le sitemap, les liens internes, ou les deux), de les g\u00e9n\u00e9rer dans un navigateur headless, et de vous renvoyer le contenu en HTML, Markdown ou m\u00eame en JSON structur\u00e9 gr\u00e2ce \u00e0 Workers AI. Le tout de mani\u00e8re asynchron ! Vous, vous r\u00e9cup\u00e9rez juste un job ID et vous revenez plus tard chercher les r\u00e9sultats quand c&#8217;est pr\u00eat.<\/p>\n<h2>Cr\u00e9er votre token API<\/h2>\n<p>Avant toute chose, il vous faut un token API Cloudflare avec la permission &#8220;Browser Rendering &#8211; Edit&#8221;. Rendez-vous dans votre dashboard Cloudflare, section API Tokens, et cr\u00e9ez-en un nouveau. Notez aussi votre Account ID (visible dans l&#8217;URL du dashboard ou dans la section Overview de n&#8217;importe quel domaine).<\/p>\n<h2>Lancer un crawl<\/h2>\n<p>L\u00e0, ensuite c&#8217;est hyper simple. Un seul appel curl suffit :<\/p>\n<div class=\"highlight\">\n<pre class=\"chroma\"><code class=\"language-fallback\" data-lang=\"fallback\"><span class=\"line\"><span class=\"cl\">curl -X POST \"https:\/\/api.cloudflare.com\/client\/v4\/accounts\/VOTRE_ACCOUNT_ID\/browser-rendering\/crawl\" \n<\/span><\/span><span class=\"line\"><span class=\"cl\"> -H \"Authorization: Bearer VOTRE_TOKEN\" \n<\/span><\/span><span class=\"line\"><span class=\"cl\"> -H \"Content-Type: application\/json\" \n<\/span><\/span><span class=\"line\"><span class=\"cl\"> -d '{\"url\": \"https:\/\/example.com\"}'\n<\/span><\/span><\/code><\/pre>\n<p>Et l\u00e0, vous r\u00e9cup\u00e9rez un job ID en retour (genre <code>c7f8s2d9-a8e7-4b6e-...<\/code>). Par d\u00e9faut, le crawler va explorer 10 pages max avec une profondeur quasi illimit\u00e9e. Mais bon, 10 pages c&#8217;est vite limit\u00e9, du coup vous pouvez ajuster tout \u00e7a comme ceci :<\/p>\n<div class=\"highlight\">\n<pre class=\"chroma\"><code class=\"language-fallback\" data-lang=\"fallback\"><span class=\"line\"><span class=\"cl\">curl -X POST \"https:\/\/api.cloudflare.com\/client\/v4\/accounts\/VOTRE_ACCOUNT_ID\/browser-rendering\/crawl\" \n<\/span><\/span><span class=\"line\"><span class=\"cl\"> -H \"Authorization: Bearer VOTRE_TOKEN\" \n<\/span><\/span><span class=\"line\"><span class=\"cl\"> -H \"Content-Type: application\/json\" \n<\/span><\/span><span class=\"line\"><span class=\"cl\"> -d '{\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> \"url\": \"https:\/\/example.com\/docs\",\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> \"limit\": 50,\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> \"depth\": 3,\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> \"formats\": [\"markdown\"],\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> \"render\": false,\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> \"options\": {\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> \"includePatterns\": [\"https:\/\/example.com\/docs\/**\"],\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> \"excludePatterns\": [\"**\/changelog\/**\"]\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> }\n<\/span><\/span><span class=\"line\"><span class=\"cl\"> }'\n<\/span><\/span><\/code><\/pre>\n<p>Le param\u00e8tre <code>render: false<\/code> permet de r\u00e9cup\u00e9rer le HTML brut sans lancer de navigateur headless, c&#8217;est carr\u00e9ment plus rapide pour les sites statiques. Sachez quand m\u00eame que pendant la beta, ce mode n&#8217;est pas factur\u00e9 ! Youpi !<\/p>\n<h2>R\u00e9cup\u00e9rer les r\u00e9sultats<\/h2>\n<p>Une fois le crawl lanc\u00e9, vous interrogez le job avec un GET :<\/p>\n<div class=\"highlight\">\n<pre class=\"chroma\"><code class=\"language-fallback\" data-lang=\"fallback\"><span class=\"line\"><span class=\"cl\">curl \"https:\/\/api.cloudflare.com\/client\/v4\/accounts\/VOTRE_ACCOUNT_ID\/browser-rendering\/crawl\/VOTRE_JOB_ID\" \n<\/span><\/span><span class=\"line\"><span class=\"cl\"> -H \"Authorization: Bearer VOTRE_TOKEN\"\n<\/span><\/span><\/code><\/pre>\n<p>Vous obtenez alors le statut (<code>running<\/code>, <code>completed<\/code>, <code>errored<\/code>&#8230;) et la liste des pages crawl\u00e9es avec leur contenu dans le format demand\u00e9. Si le r\u00e9sultat d\u00e9passe 10 Mo, un curseur de pagination est inclus pour r\u00e9cup\u00e9rer la suite.<\/p>\n<h2>Les options qui tuent<\/h2>\n<p>Y&#8217;a quelques param\u00e8tres bien pens\u00e9s pour les cas plus avanc\u00e9s :<\/p>\n<ul>\n<li><code>modifiedSince<\/code> et <code>maxAge<\/code> pour du crawling incr\u00e9mental (ne re-crawler que les pages modifi\u00e9es r\u00e9cemment)<\/li>\n<li><code>source: \"sitemaps\"<\/code> pour ne suivre que le sitemap au lieu de parser tous les liens<\/li>\n<li><code>jsonOptions<\/code> avec un prompt Workers AI pour extraire des donn\u00e9es structur\u00e9es automatiquement (genre r\u00e9cup\u00e9rer le nom, le prix et le stock de 500 fiches produit d&#8217;un e-commerce en une seule passe)<\/li>\n<li><code>rejectResourceTypes<\/code> pour bloquer images, fonts et CSS et acc\u00e9l\u00e9rer le crawl<\/li>\n<li><code>authenticate<\/code> pour les sites prot\u00e9g\u00e9s par une auth HTTP basique<\/li>\n<\/ul>\n<p>Attention quand m\u00eame, y&#8217;a quelques subtilit\u00e9s \u00e0 savoir. Un job peut tourner 7 jours max et les r\u00e9sultats sont conserv\u00e9s 14 jours seulement, du coup pensez \u00e0 les r\u00e9cup\u00e9rer vite. Le crawler respecte le <code>robots.txt<\/code> (y compris le <code>crawl-delay<\/code>), et si un site vous bloque, les URLs apparaissent comme &#8220;disallowed&#8221; dans les r\u00e9sultats. Sauf que \u00e7a ne vous dit pas pourquoi, faudra aller checker le robots.txt vous-m\u00eame.<\/p>\n<p>Voil\u00e0, cette &#8220;merveille&#8221; pour les scrappeurs fous est dispo sur les plans Free et Paid de<br \/>\n<a href=\"https:\/\/developers.cloudflare.com\/browser-rendering\/rest-api\/crawl-endpoint\/\">Workers<\/a><br \/>\n, et si vous voulez aller plus loin, Cloudflare propose aussi des endpoints pour les<br \/>\n<a href=\"https:\/\/korben.info\/cloudflare-bloque-ia-pay-per-crawl.html\">screenshots, les PDF et le scraping cibl\u00e9<\/a><br \/>\n.<\/p>\n<p>Voil\u00e0, un petit crawler inclus dans le plan Free de Workers, qui respecte le robots.txt et qui sort du Markdown ou du JSON structur\u00e9&#8230; je vais surveiller \u00e7a de pr\u00e8s !<\/p>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Crawler un site entier, \u00e7a devrait pas \u00eatre aussi compliqu\u00e9. Et pourtant, entre les scripts maison qui cassent tous les 2 jours et les headless browsers qui bouffent de la RAM comme pas permis, c&#8217;est assez la gal\u00e8re ! Du coup, Cloudflare, dans sa grande bont\u00e9 (lol) vient de sortir un endpoint \/crawl (en open beta) dans la section Browser Rendering qui simplifie tout \u00e7a&#8230; vous balancez une URL dessus et hop, \u00e7a ASPIRE tout le site (oui oui). En gros, vous envoyez une requ\u00eate POST avec l&#8217;URL de d\u00e9part, et le service se charge de d\u00e9couvrir les pages (via le sitemap, les liens internes, ou les deux), de les g\u00e9n\u00e9rer dans un navigateur headless, et de vous renvoyer le contenu en HTML, Markdown ou m\u00eame en JSON structur\u00e9 gr\u00e2ce \u00e0 Workers AI. Le tout de mani\u00e8re asynchron ! Vous, vous r\u00e9cup\u00e9rez juste un job ID et vous revenez plus tard chercher les r\u00e9sultats quand c&#8217;est pr\u00eat. Cr\u00e9er votre token API Avant toute chose, il vous faut un token API Cloudflare avec la permission &#8220;Browser Rendering &#8211; Edit&#8221;. Rendez-vous dans votre dashboard Cloudflare, section API Tokens, et cr\u00e9ez-en un nouveau. Notez aussi votre Account ID (visible dans l&#8217;URL du dashboard ou dans la section Overview de n&#8217;importe quel domaine). Lancer un crawl L\u00e0, ensuite c&#8217;est hyper simple. Un seul appel curl suffit : curl -X POST &#8220;https:\/\/api.cloudflare.com\/client\/v4\/accounts\/VOTRE_ACCOUNT_ID\/browser-rendering\/crawl&#8221; -H &#8220;Authorization: Bearer VOTRE_TOKEN&#8221; -H &#8220;Content-Type: application\/json&#8221; -d &#8216;{&#8220;url&#8221;: &#8220;https:\/\/example.com&#8221;}&#8217; Et l\u00e0, vous r\u00e9cup\u00e9rez un job ID en retour (genre c7f8s2d9-a8e7-4b6e-&#8230;). Par d\u00e9faut, le crawler va explorer 10 pages max avec une profondeur quasi illimit\u00e9e. Mais bon, 10 pages c&#8217;est vite limit\u00e9, du coup vous pouvez ajuster tout \u00e7a comme ceci : curl -X POST &#8220;https:\/\/api.cloudflare.com\/client\/v4\/accounts\/VOTRE_ACCOUNT_ID\/browser-rendering\/crawl&#8221; -H &#8220;Authorization: Bearer VOTRE_TOKEN&#8221; -H &#8220;Content-Type: application\/json&#8221; -d &#8216;{ &#8220;url&#8221;: &#8220;https:\/\/example.com\/docs&#8221;, &#8220;limit&#8221;: 50, &#8220;depth&#8221;: 3, &#8220;formats&#8221;: [&#8220;markdown&#8221;], &#8220;render&#8221;: false, &#8220;options&#8221;: { &#8220;includePatterns&#8221;: [&#8220;https:\/\/example.com\/docs\/**&#8221;], &#8220;excludePatterns&#8221;: [&#8220;**\/changelog\/**&#8221;] } }&#8217; Le param\u00e8tre render: false permet de r\u00e9cup\u00e9rer le HTML brut sans lancer de navigateur headless, c&#8217;est carr\u00e9ment plus rapide pour les sites statiques. Sachez quand m\u00eame que pendant la beta, ce mode n&#8217;est pas factur\u00e9 ! Youpi ! R\u00e9cup\u00e9rer les r\u00e9sultats Une fois le crawl lanc\u00e9, vous interrogez le job avec un GET : curl &#8220;https:\/\/api.cloudflare.com\/client\/v4\/accounts\/VOTRE_ACCOUNT_ID\/browser-rendering\/crawl\/VOTRE_JOB_ID&#8221; -H &#8220;Authorization: Bearer VOTRE_TOKEN&#8221; Vous obtenez alors le statut (running, completed, errored&#8230;) et la liste des pages crawl\u00e9es avec leur contenu dans le format demand\u00e9. Si le r\u00e9sultat d\u00e9passe 10 Mo, un curseur de pagination est inclus pour r\u00e9cup\u00e9rer la suite. Les options qui tuent Y&#8217;a quelques param\u00e8tres bien pens\u00e9s pour les cas plus avanc\u00e9s : modifiedSince et maxAge pour du crawling incr\u00e9mental (ne re-crawler que les pages modifi\u00e9es r\u00e9cemment) source: &#8220;sitemaps&#8221; pour ne suivre que le sitemap au lieu de parser tous les liens jsonOptions avec un prompt Workers AI pour extraire des donn\u00e9es structur\u00e9es automatiquement (genre r\u00e9cup\u00e9rer le nom, le prix et le stock de 500 fiches produit d&#8217;un e-commerce en une seule passe) rejectResourceTypes pour bloquer images, fonts et CSS et acc\u00e9l\u00e9rer le crawl authenticate pour les sites prot\u00e9g\u00e9s par une auth HTTP basique Attention quand m\u00eame, y&#8217;a quelques subtilit\u00e9s \u00e0 savoir. Un job peut tourner 7 jours max et les r\u00e9sultats sont conserv\u00e9s 14 jours seulement, du coup pensez \u00e0 les r\u00e9cup\u00e9rer vite. Le crawler respecte le robots.txt (y compris le crawl-delay), et si un site vous bloque, les URLs apparaissent comme &#8220;disallowed&#8221; dans les r\u00e9sultats. Sauf que \u00e7a ne vous dit pas pourquoi, faudra aller checker le robots.txt vous-m\u00eame. Voil\u00e0, cette &#8220;merveille&#8221; pour les scrappeurs fous est dispo sur les plans Free et Paid de Workers , et si vous voulez aller plus loin, Cloudflare propose aussi des endpoints pour les screenshots, les PDF et le scraping cibl\u00e9 . Voil\u00e0, un petit crawler inclus dans le plan Free de Workers, qui respecte le robots.txt et qui sort du Markdown ou du JSON structur\u00e9&#8230; je vais surveiller \u00e7a de pr\u00e8s !<\/p>\n","protected":false},"author":1,"featured_media":2500,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"give_campaign_id":0,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_kadence_starter_templates_imported_post":false,"footnotes":""},"class_list":["post-2499","page","type-page","status-publish","has-post-thumbnail","hentry"],"campaignId":"","_links":{"self":[{"href":"https:\/\/elearningsamba.com\/index.php\/wp-json\/wp\/v2\/pages\/2499","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/elearningsamba.com\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/elearningsamba.com\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/elearningsamba.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/elearningsamba.com\/index.php\/wp-json\/wp\/v2\/comments?post=2499"}],"version-history":[{"count":0,"href":"https:\/\/elearningsamba.com\/index.php\/wp-json\/wp\/v2\/pages\/2499\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/elearningsamba.com\/index.php\/wp-json\/wp\/v2\/media\/2500"}],"wp:attachment":[{"href":"https:\/\/elearningsamba.com\/index.php\/wp-json\/wp\/v2\/media?parent=2499"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}