~/utility/rag-web-crawler

RAG Web Crawler — Pages web en Markdown et fragments de texte

Explorez des pages web publiques et obtenez du Markdown propre, du texte brut et des fragments chevauchants avec URL source et positions, prêts pour le RAG.

données RAG TypeScriptMozilla ReadabilityjsdomTurndown Mondial
proooxy/rag-web-crawler — specs
catégorieutility / données RAG
langageTypeScript
stackTypeScript, Mozilla Readability, jsdom, Turndown
marchésMondial
sortieJSON propre, prêt pour le RAG

fonctionnalités clés

Du Markdown propre et du texte brut pour chaque page, avec titres, listes, liens, blocs de code et tableaux simples

Des fragments prêts pour les embeddings, qui se chevauchent et s'arrêtent sur des fins de paragraphe ou de phrase, chacun avec un id stable, son URL et son titre source et des positions de caractères exactes pour citer

Le contenu principal d'abord : menus, en-têtes, pieds de page et barres latérales sont écartés, et des sélecteurs CSS retirent tout ce que vous indiquez en plus

Suivi des liens au sein de chaque site, jusqu'à cinq niveaux, chaque page n'étant récupérée qu'une fois

Une recherche à la place des URL : chaque page de résultats d'une requête est explorée comme une URL de départ (offre Apify payante requise)

robots.txt respecté par défaut, avec un rythme poli entre les requêtes vers un même site

Les pages gardent leur langue — anglais, chinois et autres — sans traduction

Un statut et un code d'erreur pour chaque page, et pour chaque exécution un résumé avec les compteurs et le motif d'arrêt

cas d’usage

  • Constituer la base de connaissances d'un chatbot RAG à partir de documentation et de pages d'aide
  • Ancrer des agents IA dans des pages web actuelles qu'ils peuvent citer
  • Transformer une liste d'articles en embeddings pour la recherche sémantique
  • Rassembler les pages qu'une recherche trouve sur un sujet, dans leur langue d'origine
  • Rafraîchir une base vectorielle à intervalles réguliers, avec des id de fragment qui ne changent pas tant que la page ne change pas
  • Fournir des pages web en Markdown à des agents IA via le serveur MCP d'Apify

paramètres d’entrée

ParamètreTypeRequisDescription
startUrlsarrayoptionnelURL de pages publiques à explorer, jusqu'à 1 000
querystringoptionnelRequête de recherche dont les pages de résultats sont explorées (offre Apify payante requise)
queriesarrayoptionnelD'autres requêtes de recherche, fusionnées avec query
maxResultsPerQuerynumberoptionnelRésultats de recherche explorés par requête (5 par défaut, 50 au plus)
maxPagesnumberoptionnelNombre maximal de pages distinctes planifiées par exécution (20 par défaut, 1 000 au plus)
maxDepthnumberoptionnelProfondeur de liens suivie dans chaque site (0 par défaut = URL de départ seulement, 5 au plus)
maxConcurrencynumberoptionnelPages traitées en même temps (3 par défaut)
maxSearchRequestsnumberoptionnelRequêtes de recherche par exécution, nouvelles tentatives comprises (10 par défaut, 0 = pas de recherche)
maxFetchRequestsnumberoptionnelToutes les tentatives réseau par exécution, robots.txt et nouvelles tentatives compris (100 par défaut)
requestTimeoutSecsnumberoptionnelDélai d'expiration de chaque requête, en secondes (30 par défaut)
maxResponseBytesnumberoptionnelPlus grande réponse de page acceptée (2 Mio par défaut)
maxContentCharsnumberoptionnelTexte le plus long conservé par page, en caractères (50 000 par défaut)
maxOutputBytesnumberoptionnelSortie totale par exécution (20 Mio par défaut)
respectRobotsTxtbooleanoptionnelConsulter d'abord le robots.txt de chaque site (activé par défaut)
onlyMainContentbooleanoptionnelNe garder que le contenu principal de la page (activé par défaut)
removeSelectorsarrayoptionnelSélecteurs CSS des éléments à retirer avant l'extraction
chunkSizenumberoptionnelLongueur d'un fragment en caractères, pas en tokens (1 000 par défaut)
chunkOverlapnumberoptionnelCaractères partagés par deux fragments consécutifs (150 par défaut)

Exemple de sortie

Une page enregistrée lors d’une exécution réelle, texte raccourci et un seul de ses cinq fragments affiché :

 1{
 2  "schemaVersion": "1.0",
 3  "url": "https://www.w3.org/WAI/tutorials/tables/one-header/",
 4  "title": "Tables with One Header",
 5  "description": "Accessibility resources free online from the international standards organization: W3C Web Accessibility Initiative (WAI).",
 6  "languageCode": "en",
 7  "canonicalUrl": "https://www.w3.org/WAI/tutorials/tables/one-header/",
 8  "markdown": "# Tables with One Header\n\nin [Tables Tutorial](https://www.w3.org/WAI/tutorials/tables/)\n\n## Overview\n\n…",
 9  "text": "Tables with One Header\n\nin Tables Tutorial\n\nOverview\n\nThis page covers tables that have one simple header for rows or one simple header for columns. …",
10  "chunks": [
11    {
12      "id": "495cb4e58e13bbf9b5cdbe922f7ea652973ca4dfda61b952aaa021db045a450c",
13      "index": 0,
14      "text": "Tables with One Header\n\nin Tables Tutorial\n\nOverview\n\nThis page covers tables that have one simple header for rows or one simple header for columns. …",
15      "startChar": 0,
16      "endChar": 988,
17      "sourceUrl": "https://www.w3.org/WAI/tutorials/tables/one-header/",
18      "title": "Tables with One Header"
19    }
20  ],
21  "contentTruncated": false,
22  "sources": [],
23  "crawl": {
24    "depth": 0,
25    "httpStatusCode": 200,
26    "loadedAt": "2026-10-19T07:03:53.643Z",
27    "contentType": "text/html",
28    "renderingMode": "http",
29    "extractionMethod": "main"
30  }
31}

Les positions des fragments comptent les points de code Unicode de text. Chaque exécution écrit aussi REQUESTS, un résultat par page avec son statut et son code d’erreur, et OUTPUT, le résumé de l’exécution avec les compteurs, le motif d’arrêt et les événements facturés.

Conseils

  • Utilisez id comme identifiant d’enregistrement dans votre base vectorielle. Il reste le même d’une exécution à l’autre tant que la page et vos réglages de découpage ne changent pas : en écrivant les fragments par id lors d’une exécution planifiée, vous les remplacez au lieu d’ajouter des copies.
  • Commencez par quelques pages. Vérifiez le Markdown de vos pages avant d’augmenter maxPages ou maxDepth, et retirez les restes comme les blocs de liens connexes avec removeSelectors.
  • Lisez REQUESTS en même temps que le Dataset. Une exécution peut réussir alors que certaines pages ont été ignorées ou ont échoué, et chacune indique pourquoi.

faq

En quoi diffère-t-il d'un scraper web généraliste ?
Vous lui donnez des URL ou une requête de recherche, pas des sélecteurs. Il garde le contenu principal de chaque page en Markdown et en texte brut et découpe le texte en fragments prêts pour les embeddings, chacun avec l'URL, le titre et les positions de caractères exactes de la page, pour qu'une réponse puisse citer sa source.
Faut-il une clé d'API ?
Aucune clé d'API externe, ni pour explorer ni pour rechercher. Il vous faut un compte Apify ; appeler l'Actor par l'API d'Apify utilise votre token Apify.
Exécute-t-il le JavaScript ?
Non. Il lit les pages en HTTP : une page qui a besoin de JavaScript pour afficher son texte peut échouer avec NO_CONTENT ou arriver incomplète. Essayez d'abord quelques-unes de vos pages.
Quelles pages peut-il lire ?
Les pages publiques en HTML, Markdown et texte brut. Connexions, cookies, paywalls, CAPTCHA, proxys, PDF et images sont hors de son périmètre, et les adresses de réseaux privés comme les URL contenant des identifiants sont refusées.
Explorer des sites web est-il autorisé ?
Collecter des données publiques et non personnelles est en général légal, mais le contenu des pages est souvent protégé par le droit d'auteur et certains sites limitent l'exploration dans leurs conditions. Le crawler respecte robots.txt par défaut ; vous êtes responsable de l'usage de ce que vous collectez.

similaires dans ~/utility

Exécutez RAG Web Crawler — Pages web en Markdown et fragments de texte, ou obtenez un projet sur mesure

Commencez à extraire sur Apify en quelques minutes, ou engagez-moi pour construire un scraper sur mesure et un pipeline RAG adaptés exactement à votre source et à votre schéma.

exécuter sur Apify obtenir des données sur mesure