{"id":4298,"date":"2026-02-12T13:53:41","date_gmt":"2026-02-12T13:53:41","guid":{"rendered":"https:\/\/rimanagency.com\/?page_id=4298"},"modified":"2026-02-12T13:53:41","modified_gmt":"2026-02-12T13:53:41","slug":"crawl-budget-audit","status":"publish","type":"page","link":"https:\/\/rimanagency.com\/fr\/crawl-budget-audit\/","title":{"rendered":"Audit budg\u00e9taire Crawl"},"content":{"rendered":"        <div class=\"cba-container\">\r\n            <div class=\"cba-header\">\r\n                <h3 style=\"margin-top:0;\">Bulk Crawl Budget Auditor<\/h3>\r\n                <p style=\"font-size:14px; color:#666;\">Checks uncompressed HTML sizes against Google's 2MB crawl limit.<\/p>\r\n            <\/div>\r\n\r\n            <div class=\"cba-tabs\">\r\n                <div class=\"cba-tab active\" data-target=\"url-input\">Sitemap URL<\/div>\r\n                <div class=\"cba-tab\" data-target=\"file-input\">Upload .xml File<\/div>\r\n            <\/div>\r\n            \r\n            <div id=\"url-input-container\">\r\n                <div class=\"cba-form-group\">\r\n                    <input type=\"url\" id=\"cba-sitemap-url\" class=\"cba-input\" placeholder=\"https:\/\/domain.com\/sitemap.xml\">\r\n                <\/div>\r\n            <\/div>\r\n\r\n            <div id=\"file-input-container\" style=\"display:none;\">\r\n                <div class=\"cba-form-group\">\r\n                    <input type=\"file\" id=\"cba-sitemap-file\" class=\"cba-input\" accept=\".xml\">\r\n                <\/div>\r\n            <\/div>\r\n\r\n            <div class=\"cba-form-group\" style=\"justify-content: flex-end;\">\r\n                <button id=\"cba-pause-btn\" class=\"cba-button cba-pause-button\">Pause Audit<\/button>\r\n                <button id=\"cba-start-btn\" class=\"cba-button\">Start Audit<\/button>\r\n            <\/div>\r\n\r\n            <div id=\"cba-progress\" class=\"cba-progress-container\">\r\n                <div class=\"cba-log\" id=\"cba-status-text\">Ready...<\/div>\r\n                <div class=\"cba-progress-bar\"><div class=\"cba-progress-fill\"><\/div><\/div>\r\n            <\/div>\r\n\r\n            <div id=\"cba-actions-row\" class=\"cba-actions\" style=\"display:none;\">\r\n                <button id=\"cba-download-csv\" class=\"cba-button cba-secondary-button\">Download CSV Report<\/button>\r\n            <\/div>\r\n\r\n            <div class=\"cba-results-wrapper\">\r\n                <table class=\"cba-results\" id=\"cba-results-table\" style=\"display:none;\">\r\n                    <thead>\r\n                        <tr>\r\n                            <th>URL<\/th>\r\n                            <th>Size (MB)<\/th>\r\n                            <th>Response<\/th>\r\n                            <th>Status<\/th>\r\n                        <\/tr>\r\n                    <\/thead>\r\n                    <tbody><\/tbody>\r\n                <\/table>\r\n            <\/div>\r\n        <\/div>\r\n\r\n        <script>\r\n        (function() {\r\n            let auditData = [];\r\n            let isPaused = false;\r\n            let currentUrlList = [];\r\n            let currentIndex = 0;\r\n            let currentInputType = 'url';\r\n\r\n            document.querySelectorAll('.cba-tab').forEach(tab => {\r\n                tab.addEventListener('click', function() {\r\n                    document.querySelectorAll('.cba-tab').forEach(t => t.classList.remove('active'));\r\n                    this.classList.add('active');\r\n                    currentInputType = this.dataset.target === 'url-input' ? 'url' : 'file';\r\n                    document.getElementById('url-input-container').style.display = currentInputType === 'url' ? 'block' : 'none';\r\n                    document.getElementById('file-input-container').style.display = currentInputType === 'file' ? 'block' : 'none';\r\n                });\r\n            });\r\n\r\n            const startBtn = document.getElementById('cba-start-btn');\r\n            const pauseBtn = document.getElementById('cba-pause-btn');\r\n\r\n            pauseBtn.addEventListener('click', function() {\r\n                isPaused = !isPaused;\r\n                this.innerText = isPaused ? \"Resume Audit\" : \"Pause Audit\";\r\n                if (!isPaused) processNextBatch();\r\n            });\r\n\r\n            startBtn.addEventListener('click', async function() {\r\n                if (startBtn.dataset.state === 'running') return;\r\n\r\n                const statusText = document.getElementById('cba-status-text');\r\n                const progressFill = document.querySelector('.cba-progress-fill');\r\n                const resultsTable = document.getElementById('cba-results-table');\r\n                const resultsBody = resultsTable.querySelector('tbody');\r\n                const actionsRow = document.getElementById('cba-actions-row');\r\n\r\n                auditData = [];\r\n                currentIndex = 0;\r\n                isPaused = false;\r\n                startBtn.disabled = true;\r\n                startBtn.dataset.state = 'running';\r\n                pauseBtn.style.display = 'inline-block';\r\n                pauseBtn.innerText = \"Pause Audit\";\r\n                document.getElementById('cba-progress').style.display = 'block';\r\n                resultsTable.style.display = 'table';\r\n                actionsRow.style.display = 'none';\r\n                resultsBody.innerHTML = '';\r\n                progressFill.style.width = '0%';\r\n\r\n                try {\r\n                    let urls = [];\r\n                    if (currentInputType === 'url') {\r\n                        const url = document.getElementById('cba-sitemap-url').value;\r\n                        if (!url) { alert('Please enter a sitemap URL'); resetUI(); return; }\r\n                        statusText.innerText = \"\ud83d\udd0d Fetching remote sitemap...\";\r\n                        const response = await fetch('https:\/\/rimanagency.com\/wp-admin\/admin-ajax.php', {\r\n                            method: 'POST',\r\n                            headers: {'Content-Type': 'application\/x-www-form-urlencoded'},\r\n                            body: `action=cba_start_scan&sitemap_url=${encodeURIComponent(url)}`\r\n                        });\r\n                        const data = await response.json();\r\n                        if (!data.success) throw new Error(data.data);\r\n                        urls = data.data;\r\n                    } else {\r\n                        const fileInput = document.getElementById('cba-sitemap-file');\r\n                        if (!fileInput.files.length) { alert('Please select a sitemap file'); resetUI(); return; }\r\n                        statusText.innerText = \"\ud83d\udd0d Parsing uploaded file...\";\r\n                        const fileContent = await fileInput.files[0].text();\r\n                        urls = parseXmlForUrls(fileContent);\r\n                    }\r\n\r\n                    if (!urls || urls.length === 0) throw new Error(\"No URLs found.\");\r\n                    currentUrlList = urls;\r\n                    processNextBatch();\r\n                } catch (err) {\r\n                    statusText.innerText = \"\u274c Error: \" + err.message;\r\n                    resetUI();\r\n                }\r\n            });\r\n\r\n            function parseXmlForUrls(xmlString) {\r\n                const parser = new DOMParser();\r\n                const xmlDoc = parser.parseFromString(xmlString, \"text\/xml\");\r\n                const locs = xmlDoc.getElementsByTagName(\"loc\");\r\n                const urls = [];\r\n                for (let i = 0; i < locs.length; i++) urls.push(locs[i].textContent.trim());\r\n                return [...new Set(urls)];\r\n            }\r\n\r\n            async function processNextBatch() {\r\n                if (isPaused || currentIndex >= currentUrlList.length) {\r\n                    if (currentIndex >= currentUrlList.length) finalizeAudit();\r\n                    return;\r\n                }\r\n\r\n                const statusText = document.getElementById('cba-status-text');\r\n                const progressFill = document.querySelector('.cba-progress-fill');\r\n                const resultsBody = document.querySelector('#cba-results-table tbody');\r\n                \r\n                \/\/ Batch of 1 for high-security environments to minimize suspicion\r\n                const batchSize = 1; \r\n                const batch = currentUrlList.slice(currentIndex, currentIndex + batchSize);\r\n                \r\n                try {\r\n                    const response = await fetch('https:\/\/rimanagency.com\/wp-admin\/admin-ajax.php', {\r\n                        method: 'POST',\r\n                        headers: {'Content-Type': 'application\/x-www-form-urlencoded'},\r\n                        body: `action=cba_process_batch&urls=${encodeURIComponent(JSON.stringify(batch))}`\r\n                    });\r\n                    const batchResults = await response.json();\r\n\r\n                    if (batchResults.success) {\r\n                        batchResults.data.forEach(res => {\r\n                            auditData.push(res);\r\n                            const row = resultsBody.insertRow();\r\n                            const sizeInBytes = parseInt(res.size);\r\n                            const code = parseInt(res.code) || 0;\r\n                            const isFail = sizeInBytes > 2000000;\r\n                            const isTiny = sizeInBytes < 5000 && code === 200; \r\n                            \r\n                            let sizeDisplay = (sizeInBytes \/ 1048576).toFixed(3) + \" MB\";\r\n                            let statusDisplay = `<span class=\"status-pass\">PASS<\/span>`;\r\n                            let resDisplay = `<span class=\"cba-badge\" style=\"background:${code === 200 ? '#e8f5e9' : '#ffebee'}\">HTTP ${code}<\/span>`;\r\n\r\n                            if (res.error) {\r\n                                sizeDisplay = `<span class=\"status-error\">Error<\/span>`;\r\n                                statusDisplay = `<span class=\"status-error\">${res.error}<\/span>`;\r\n                            } else if (code !== 200) {\r\n                                statusDisplay = `<span class=\"status-fail\">${code === 403 ? 'BLOCKED (403)' : 'FAILED REQUEST'}<\/span>`;\r\n                            } else if (isFail) {\r\n                                statusDisplay = `<span class=\"status-fail\">OVER 2MB<\/span>`;\r\n                            } else if (isTiny) {\r\n                                statusDisplay = `<span class=\"status-warning\">TOO SMALL?<\/span>`;\r\n                            }\r\n\r\n                            row.innerHTML = `\r\n                                <td style=\"word-break: break-all;\"><a href=\"${res.url}\" target=\"_blank\" rel=\"noopener\">${res.url}<\/a><\/td>\r\n                                <td>${sizeDisplay}<\/td>\r\n                                <td>${resDisplay}<\/td>\r\n                                <td>${statusDisplay}<\/td>\r\n                            `;\r\n                        });\r\n                    }\r\n\r\n                    currentIndex += batchSize;\r\n                    const progress = Math.min(100, Math.round((currentIndex \/ currentUrlList.length) * 100));\r\n                    progressFill.style.width = progress + '%';\r\n                    statusText.innerText = `Analyzing: ${Math.min(currentIndex, currentUrlList.length)} \/ ${currentUrlList.length} done...`;\r\n\r\n                    \/\/ Add a 500ms delay between requests to avoid trigger firewalls\r\n                    setTimeout(processNextBatch, 500);\r\n                } catch (e) {\r\n                    console.error(\"Batch error\", e);\r\n                    setTimeout(processNextBatch, 2000);\r\n                }\r\n            }\r\n\r\n            function finalizeAudit() {\r\n                document.getElementById('cba-status-text').innerText = \"\u2705 Audit Finished.\";\r\n                document.getElementById('cba-actions-row').style.display = 'flex';\r\n                resetUI();\r\n            }\r\n\r\n            function resetUI() {\r\n                startBtn.disabled = false;\r\n                startBtn.dataset.state = 'idle';\r\n                pauseBtn.style.display = 'none';\r\n            }\r\n\r\n            document.getElementById('cba-download-csv').addEventListener('click', function() {\r\n                let csvContent = \"URL,Size (Bytes),Size (MB),HTTP Code,Status\\n\";\r\n                auditData.forEach(row => {\r\n                    const mb = (row.size \/ 1048576).toFixed(4);\r\n                    const status = row.error ? \"ERROR\" : (row.size > 2000000 ? \"FAIL\" : \"PASS\");\r\n                    csvContent += `\"${row.url}\",${row.size},${mb},${row.code},${status}\\n`;\r\n                });\r\n                const blob = new Blob([csvContent], { type: 'text\/csv;charset=utf-8;' });\r\n                const url = URL.createObjectURL(blob);\r\n                const link = document.createElement(\"a\");\r\n                link.href = url;\r\n                link.download = \"crawl_budget_audit_report.csv\";\r\n                link.click();\r\n            });\r\n        })();\r\n        <\/script>\r\n        \n","protected":false},"excerpt":{"rendered":"","protected":false},"author":4,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-4298","page","type-page","status-publish","hentry"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Crawl Budget Audit - Riman Agency<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/rimanagency.com\/fr\/crawl-budget-audit\/\" \/>\n<meta property=\"og:locale\" content=\"fr_CA\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Crawl Budget Audit - Riman Agency\" \/>\n<meta property=\"og:url\" content=\"https:\/\/rimanagency.com\/fr\/crawl-budget-audit\/\" \/>\n<meta property=\"og:site_name\" content=\"Riman Agency\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"1 minute\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/rimanagency.com\\\/crawl-budget-audit\\\/\",\"url\":\"https:\\\/\\\/rimanagency.com\\\/crawl-budget-audit\\\/\",\"name\":\"Crawl Budget Audit - Riman Agency\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/rimanagency.com\\\/#website\"},\"datePublished\":\"2026-02-12T13:53:41+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/rimanagency.com\\\/crawl-budget-audit\\\/#breadcrumb\"},\"inLanguage\":\"fr-CA\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/rimanagency.com\\\/crawl-budget-audit\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/rimanagency.com\\\/crawl-budget-audit\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/rimanagency.com\\\/home\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Crawl Budget Audit\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/rimanagency.com\\\/#website\",\"url\":\"https:\\\/\\\/rimanagency.com\\\/\",\"name\":\"Riman Agency\",\"description\":\"A Full Service Digital Marketing Agency\",\"publisher\":{\"@id\":\"https:\\\/\\\/rimanagency.com\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/rimanagency.com\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"fr-CA\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/rimanagency.com\\\/#organization\",\"name\":\"Riman Agency\",\"url\":\"https:\\\/\\\/rimanagency.com\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-CA\",\"@id\":\"https:\\\/\\\/rimanagency.com\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/rimanagency.com\\\/wp-content\\\/uploads\\\/2022\\\/02\\\/RIMANagency-all-logos-1-2.png\",\"contentUrl\":\"https:\\\/\\\/rimanagency.com\\\/wp-content\\\/uploads\\\/2022\\\/02\\\/RIMANagency-all-logos-1-2.png\",\"width\":694,\"height\":211,\"caption\":\"Riman Agency\"},\"image\":{\"@id\":\"https:\\\/\\\/rimanagency.com\\\/#\\\/schema\\\/logo\\\/image\\\/\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Crawl Budget Audit - Riman Agency","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/rimanagency.com\/fr\/crawl-budget-audit\/","og_locale":"fr_CA","og_type":"article","og_title":"Crawl Budget Audit - Riman Agency","og_url":"https:\/\/rimanagency.com\/fr\/crawl-budget-audit\/","og_site_name":"Riman Agency","twitter_card":"summary_large_image","twitter_misc":{"Est. reading time":"1 minute"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/rimanagency.com\/crawl-budget-audit\/","url":"https:\/\/rimanagency.com\/crawl-budget-audit\/","name":"Crawl Budget Audit - Riman Agency","isPartOf":{"@id":"https:\/\/rimanagency.com\/#website"},"datePublished":"2026-02-12T13:53:41+00:00","breadcrumb":{"@id":"https:\/\/rimanagency.com\/crawl-budget-audit\/#breadcrumb"},"inLanguage":"fr-CA","potentialAction":[{"@type":"ReadAction","target":["https:\/\/rimanagency.com\/crawl-budget-audit\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/rimanagency.com\/crawl-budget-audit\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/rimanagency.com\/home\/"},{"@type":"ListItem","position":2,"name":"Crawl Budget Audit"}]},{"@type":"WebSite","@id":"https:\/\/rimanagency.com\/#website","url":"https:\/\/rimanagency.com\/","name":"Agence Riman","description":"Une agence de marketing num\u00e9rique \u00e0 service complet","publisher":{"@id":"https:\/\/rimanagency.com\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/rimanagency.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"fr-CA"},{"@type":"Organization","@id":"https:\/\/rimanagency.com\/#organization","name":"Agence Riman","url":"https:\/\/rimanagency.com\/","logo":{"@type":"ImageObject","inLanguage":"fr-CA","@id":"https:\/\/rimanagency.com\/#\/schema\/logo\/image\/","url":"https:\/\/rimanagency.com\/wp-content\/uploads\/2022\/02\/RIMANagency-all-logos-1-2.png","contentUrl":"https:\/\/rimanagency.com\/wp-content\/uploads\/2022\/02\/RIMANagency-all-logos-1-2.png","width":694,"height":211,"caption":"Riman Agency"},"image":{"@id":"https:\/\/rimanagency.com\/#\/schema\/logo\/image\/"}}]}},"_links":{"self":[{"href":"https:\/\/rimanagency.com\/fr\/wp-json\/wp\/v2\/pages\/4298","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/rimanagency.com\/fr\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/rimanagency.com\/fr\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/rimanagency.com\/fr\/wp-json\/wp\/v2\/users\/4"}],"replies":[{"embeddable":true,"href":"https:\/\/rimanagency.com\/fr\/wp-json\/wp\/v2\/comments?post=4298"}],"version-history":[{"count":0,"href":"https:\/\/rimanagency.com\/fr\/wp-json\/wp\/v2\/pages\/4298\/revisions"}],"wp:attachment":[{"href":"https:\/\/rimanagency.com\/fr\/wp-json\/wp\/v2\/media?parent=4298"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}