๐ Website Content Crawler
Pricing
from $5.00 / 1,000 row_results
๐ Website Content Crawler
Crawl any website into clean text, Markdown & rich metadata โ AI-ready output for RAG, LLMs & vector databases. Streams to your dataset in real time.
Pricing
from $5.00 / 1,000 row_results
Rating
0.0
(0)
Developer
Data Minds
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
a day ago
Last modified
Categories
Share
๐ Website Content Crawler โ Web Scraping & AI Content Extraction Actor
Website Content Crawler is a powerful Apify Actor for website crawling, web scraping, content extraction, and AI data preparation. It crawls any website starting from your seed URLs, follows internal links, extracts clean plain text, Markdown, and rich metadata (title, description, canonical URL, Open Graph, JSON-LD, language, headers), and writes structured page data to an Apify Dataset in real time โ perfect for RAG pipelines, LLM knowledge bases, vector database ingestion, semantic search, and SEO content audits.
๐ก Need a custom version, private integration, or a tailored crawler? Email hello.dataminds@gmail.com.
It is a focused alternative to the official apify/website-content-crawler: a tighter feature surface, predictable cost, and AI-first output (text + Markdown + metadata) ready for LangChain, LlamaIndex, OpenAI, Pinecone, Qdrant, and Weaviate pipelines.
๐ Table of contents
- What is Website Content Crawler?
- Main features
- Who is this Actor for?
- Built for generative AI, LLMs, and RAG
- What the crawler does
- Crawling configuration
- HTML cleaning & content extraction
- Output format (Dataset)
- Example output (JSON)
- Quick start
- Input parameters reference
- Integrations: LangChain, LlamaIndex, OpenAI, Pinecone
- Pricing & how to control cost
- Frequently asked questions (FAQ)
- Troubleshooting
- Help, support & custom builds
- Is web scraping legal?
- SEO keywords targeted
๐ What is Website Content Crawler?
Website Content Crawler is an Apify-hosted web scraping API and website crawler that turns any public website into clean, structured, AI-ready data. Unlike generic HTTP scrapers, this Actor:
- Crawls an entire site from one or more start URLs, staying on the same registrable domain.
- Renders JavaScript automatically when a page needs it, so single-page apps still yield real content.
- Cleans HTML by stripping navigation, footers, scripts, cookie banners, modals, and other noise.
- Extracts content as readable plain text and optional Markdown for token-efficient LLM ingestion.
- Captures metadata (title, description, canonical, Open Graph, JSON-LD, headers, language).
- Saves results as structured rows in an Apify Dataset, exportable to JSON, CSV, Excel, or via the Apify API.
If you need a website-to-dataset pipeline for AI agents, chatbot grounding, GPT knowledge files, RAG retrieval, or content analytics, this is the Actor.
โจ Main features
- ๐ฑ Multi-URL crawl seeds โ start from one URL or hundreds; the crawler stays on the same domain by default.
- ๐ฏ Glob-based URL filtering โ
includeUrlGlobs/excludeUrlGlobsfor surgical scope (/blog/*,/docs/**, skip/admin/**). Path-only patterns work as written;*stops at/,**crosses folders. - ๐บ๏ธ Discovery sources โ seed the queue from
sitemap.xml(useSitemaps, follows sitemap indexes) andllms.txt(useLlmsTxt) to reach pages that aren't linked, and honourrobots.txt(respectRobotsTxtFile). - ๐ก๏ธ Apify Proxy support โ datacenter or residential groups, country targeting, or your own proxy URLs, with automatic fallback.
- ๐ช Initial cookies โ
initialCookiessent on every request and loaded into the browser for session or light-login access. - ๐ฑ๏ธ Rendered-page interaction โ
maxScrollHeightPixelsauto-scroll for lazy/infinite-scroll content,clickElementsCssSelectorto expand accordions / "load more", andblockMediato skip images/fonts/video for faster, cheaper renders. - ๐ซ Ad/tracker blocking โ
blockAdsaborts known ad and tracker domains on rendered pages, on top ofblockMedia. - ๐ฑ Mobile emulation โ
mobileViewrenders with a real mobile device profile (viewport, UA, touch) instead of desktop. - ๐ต๏ธ PII redaction (best-effort) โ
redactPiimasks emails, phone numbers, card-like numbers, and SSNs intext/markdown. - ๐ Screenshot mode โ
screenshotFullPage(default on) toggles full-page vs viewport-only screenshots. - ๐ PDF text extraction โ
extractPdfTextopens discovered PDF links and extracts real text intotext, instead of only listing them as file links. - ๐ Depth & page limits โ
maxCrawlDepth,maxCrawlPages,maxResultsto keep cost and runtime predictable. - โก Async concurrency โ tune
maxConcurrencyfrom 1 to 50 parallel requests. - ๐ฅ๏ธ Three rendering modes โ
auto(render only when a page needs it),always, orneverfor the cheapest possible run. - ๐ช Smart retry โ pages that come back incomplete are automatically retried for a fuller result.
- ๐งผ HTML noise removal โ strip nav, footer, modals, ads, and cookie banners via CSS selectors before extraction.
- ๐ Markdown export โ token-efficient Markdown alongside plain text, ideal for LLM context windows.
- ๐ท๏ธ Rich metadata extraction โ title, description, canonical URL, Open Graph, Twitter Card, JSON-LD, author, keywords, publish/modified dates, language code.
- ๐งฒ Keep-only extraction โ
keepElementsCssSelectorto keep just an article body (article, main) and discard everything else before extraction. - ๐งพ Skipped-URL audit โ
storeSkippedUrlswrites every discovered-but-not-crawled URL (with a reason) toskipped-urls.json. - ๐ธ HTML snapshots & full-page screenshots stored in the run's key-value store, surfaced as direct clickable URLs on every row (original HTML, noise-removed HTML, readable HTML, PNG).
- โฑ๏ธ Politeness controls โ
rateLimitDelaySecs, retry counts, request timeouts, and dynamic-content waits. - ๐ฏ Wait-for-selector โ block extraction until a CSS selector renders (great for React/Vue/Angular SPAs).
- ๐ก๏ธ Custom HTTP headers โ User-Agent, sec-ch-ua, DNT, plus arbitrary cookies and auth headers via JSON.
- ๐ Canonical & fragment handling โ dedupe by canonical link or treat
#anchorsas distinct pages. - ๐ฆ Real-time Dataset writes โ every page lands in your Dataset the moment it is ready, not at the end of the run.
- ๐ง Verbose diagnostics โ link counts, status codes, content lengths, and snapshot links on every row.
๐ฅ Who is this Actor for?
This Apify Actor is built for:
- ๐ค AI engineers building RAG, retrieval-augmented generation, or LLM grounding pipelines.
- ๐ง Data scientists assembling training corpora, fine-tuning datasets, or embedding indexes.
- ๐ ๏ธ Backend developers integrating website-to-database ETL flows or knowledge sync jobs.
- ๐ SEO professionals auditing titles, meta descriptions, canonical URLs, Open Graph, schema.org markup, and internal linking at scale.
- ๐ Documentation teams building searchable docs portals or AI-powered help bots.
- ๐ Content strategists & competitive analysts monitoring competitor blogs, landing pages, and changelogs.
- ๐ฌ Researchers collecting public web text data for NLP, classification, or sentiment models.
If you've ever needed to "turn this whole website into a clean JSON file my LLM can read," this Actor is the answer.
๐ค Built for generative AI, LLMs, and RAG
This Actor is designed from the ground up for AI workflows:
- RAG pipelines โ crawl docs, knowledge bases, FAQs, and blogs into chunkable Markdown.
- LLM knowledge bases โ feed
text+metadatainto vector stores for grounded chatbot answers. - Semantic search engines โ index page content with embeddings for relevance-ranked retrieval.
- Vector database ingestion โ drop directly into Pinecone, Qdrant, Weaviate, Chroma, Milvus, or pgvector.
- Custom GPT knowledge files โ export Dataset JSON and upload to ChatGPT custom GPTs, Claude Projects, or Anthropic Files API.
- AI agent training & grounding โ build autonomous agents with up-to-date web context.
- Content operations โ summarization, translation, rewrite-assist, content moderation pipelines.
- Competitive intelligence โ periodic crawls feeding analytics dashboards.
Practical AI use cases
- Customer support chatbot grounding โ crawl product docs, help center, and FAQ pages; embed
text + metadatafor retrieval. - Documentation intelligence & semantic search โ turn product docs and changelogs into a searchable, embedding-indexed corpus.
- SEO and content audit automation โ analyze titles, meta descriptions, canonical links, and structured data sitewide.
- Custom GPT / Claude Project knowledge files โ generate a dataset JSON and upload to your AI assistant of choice.
- Internal LLM knowledge base โ sync intranet, wiki, or Notion-published content into a private vector store.
- Lead enrichment & company intelligence โ crawl prospect websites for descriptions, services, and contact pages.
- Compliance and content monitoring โ track changes to legal pages, terms of service, or pricing pages.
โ๏ธ What the crawler does
- Crawls from your seed URLs, follows internal links within domain scope, applies your
includeUrlGlobs/excludeUrlGlobsfilters, and respectsmaxCrawlDepth,maxCrawlPages, andmaxResults. - Handles JavaScript sites according to your
renderingModeโautorenders only the pages that need it,alwaysrenders everything,neveris the fastest and cheapest. - Cleans each page with your CSS selectors (nav, footer, cookie banners, modals) before extracting text and Markdown.
- Writes every row to the Apify Dataset the moment it is ready โ
url, flat metadata columns,crawlinfo,metadata,text,markdown, snapshot links, andscreenshotUrl. Downstream systems can consume rows while the crawl is still running. - Keeps going when a page fails โ bad URLs, non-HTML files, blocked pages, and oversized pages are handled per page, never by aborting the run.
๐งญ Crawling configuration
- Start URLs are the only required input. Add as many as you like.
- By default, the crawler stays on the same registrable domain as your seeds โ no accidental crawling of
facebook.comfrom your blog's share buttons. includeUrlGlobsโ keep only matching paths (e.g.,/blog/*,**/blog/**).excludeUrlGlobsโ skip paths (e.g.,/admin/**,**/login,**/*.pdf).- Filters apply to discovered links only โ your start URLs are always crawled, so a narrow include pattern can't accidentally produce an empty run.
useSitemapsโ also seed the queue fromrobots.txt-advertised sitemaps and/sitemap.xml(following sitemap indexes). Reaches orphan pages that aren't linked from your seeds. Your include/exclude filters still apply.useLlmsTxtโ also seed the queue from URLs listed in each start domain's/llms.txt.respectRobotsTxtFileโ skip discovered URLs disallowed by the site'srobots.txt(your explicit start URLs are always crawled).keepUrlFragmentsโ treat#anchorsas distinct URLs (off by default).ignoreCanonicalUrlโ disable canonical-based dedup if you want every URL crawled distinctly.maxCrawlDepthโ0= only seeds;1= seeds + their direct links; etc.maxCrawlPagesโ total unique pages opened (0= unlimited).maxResultsโ total successful records saved.
๐งช Test glob patterns with the DigitalOcean glob tester.
๐งผ HTML cleaning & content extraction
The Actor produces clean, readable text suitable for AI consumption:
keepElementsCssSelectorโ keep only the elements matching this selector (e.g.article, main) and discard everything else. Applied before the remove list below; empty keeps the whole page.removeElementsCssSelectorโ comma-separated CSS selectors to strip before extraction (defaults remove nav, footer, scripts, cookie banners, modals, alerts).readableTextCharThresholdโ how much text a page must have before it counts as complete.waitForSelectorโ pause until a key CSS selector appears (perfect for SPAs that mount content lazily).dynamicContentWaitSecsโ extra settle time for late-arriving dynamic content.saveMarkdownโ include a Markdown version of the page alongside plain text.
The result: token-efficient, noise-free content ready for embedding, indexing, or LLM context.
Rendered-page interaction
These apply only to rendered pages (renderingMode: auto when a page is rendered, or always):
maxScrollHeightPixelsโ auto-scroll down up to this many pixels to trigger lazy-loaded / infinite-scroll content (0= off).clickElementsCssSelectorโ best-effort click on matching elements (accordions, "show more", expanders) before extracting; e.g.[aria-expanded="false"].blockMediaโ skip downloading images, fonts, and video while rendering for faster, cheaper runs (text and links unaffected).
๐ค Output format (Dataset)
Results land in the default Apify Dataset. You can:
- Browse rows in the Apify Console with multiple prebuilt views (Quick View, Crawl Details, Metadata, Content, Storage & Debug).
- Export to JSON, CSV, Excel, XML, HTML, or RSS.
- Pull data programmatically via the Apify API.
- Stream into AI, ETL, or analytics pipelines while the run is still active.
Each row includes:
| Field | Description |
|---|---|
orderNo | 1-based order in which the row was saved during the run. |
url | The page's own URL โ its canonical URL when one exists (and ignoreCanonicalUrl is off), otherwise the loaded URL. |
loadedUrl | The URL actually fetched, after redirects. |
referrerUrl | The page that linked to this one (referrerUrl input for start URLs). |
depth | Link distance from the nearest start URL (0 for seeds). |
httpStatusCode | HTTP status of the response. |
title, description, canonicalUrl, author, keywords, datePublished, dateModified, languageCode | Flat metadata aliases so Dataset table views and CSV exports work without nesting. |
crawl | Nested loadedUrl, loadedTime, referrerUrl, depth, httpStatusCode. |
metadata | canonicalUrl, title, description, author, keywords, datePublished, dateModified, languageCode, openGraph (Open Graph + article + Twitter Card tags), jsonLd, headers. |
text | Clean, readable plain text with paragraph structure preserved. |
markdown | Real Markdown โ headings, links, bold/italic, nested lists, blockquotes, GFM tables, fenced code (when saveMarkdown is on). |
html | Cleaned readable HTML inline (when saveHtml is on). |
htmlUrl | Direct URL to the readable HTML snapshot in the key-value store. |
screenshotUrl | Direct URL to the full-page PNG (when saveScreenshots is on). |
files | Non-HTML links found on the page (PDF, DOCX, XLSX, ZIP, โฆ), or null. |
debug | Per-row diagnostics โ page/file link counts, response content type, snapshot URLs, and content byte lengths. |
debugTotalLinks, debugStatusCode | Flat debug aliases for table views. |
โน๏ธ Rows over Apify's 9 MB item limit are trimmed automatically (
htmlโmarkdownโtext) and flagged withdebug.truncated: true, so a single huge page never fails the run.
๐งพ With
storeSkippedUrls: true, discovered-but-not-crawled URLs are written toskipped-urls.jsonin the run's key-value store, each with areason(off-domain,excluded,not-included,robots-disallow,non-http).
๐งช Example output (JSON)
Real output from a run against https://docs.apify.com/ (text and Markdown abbreviated):
{"orderNo": 4,"url": "https://docs.apify.com/proxy","loadedUrl": "https://docs.apify.com/proxy","loadedTime": "2026-07-23T14:31:52.015Z","referrerUrl": "https://docs.apify.com/academy/scraping-basics-javascript","depth": 1,"httpStatusCode": 200,"title": "Proxy | Platform | Apify Documentation","description": "Learn to anonymously access websites in scraping/automation jobs.","canonicalUrl": "https://docs.apify.com/proxy","author": null,"keywords": null,"datePublished": null,"dateModified": null,"languageCode": "en","crawl": {"loadedUrl": "https://docs.apify.com/proxy","loadedTime": "2026-07-23T14:31:52.015Z","referrerUrl": "https://docs.apify.com/academy/scraping-basics-javascript","depth": 1,"httpStatusCode": 200},"metadata": {"canonicalUrl": "https://docs.apify.com/proxy","title": "Proxy | Platform | Apify Documentation","description": "Learn to anonymously access websites in scraping/automation jobs.","author": null,"keywords": null,"datePublished": null,"dateModified": null,"languageCode": "en","openGraph": [{ "property": "og:url", "content": "https://docs.apify.com/proxy" },{ "property": "og:locale", "content": "en" }],"jsonLd": null,"headers": { "content-type": "text/html; charset=utf-8", "โฆ": "โฆ" }},"text": "Proxy\n\nApify Proxy lets you rotate IP addresses when scraping to avoid geographic blocking. โฆ","markdown": "# Proxy\n\n[Apify Proxy](https://apify.com/proxy) lets you rotate IP addresses when scraping โฆ","htmlUrl": "https://api.apify.com/v2/key-value-stores/<storeId>/records/kv__bfc3652cf15f843d170b_readable.html","screenshotUrl": null,"files": null,"debug": {"totalLinks": 59,"pageLinks": 59,"fileLinks": 0,"response": { "statusCode": 200, "contentType": "text/html; charset=utf-8" },"snapshots": {"originalHtmlUrl": "https://api.apify.com/v2/key-value-stores/<storeId>/records/kv__bfc3652cf15f843d170b_original.html","removedElementsHtmlUrl": "https://api.apify.com/v2/key-value-stores/<storeId>/records/kv__bfc3652cf15f843d170b_removed.html","readableTextHtmlUrl": "https://api.apify.com/v2/key-value-stores/<storeId>/records/kv__bfc3652cf15f843d170b_readable.html"},"lengths": {"originalHtml": 75279,"readableHtml": 43168,"readableText": 10763,"markdown": 19203}}}
๐ Quick start
Run in Apify Console
- Open the Actor in Apify Console.
- Paste one or more start URLs (e.g.,
https://docs.apify.com/). - (Optional) Set
maxResults,maxCrawlDepth,maxCrawlPages, and URL filters. - Click Start and watch rows stream into your Dataset.
- Export as JSON / CSV or pull via the Apify API.
Run via API
curl -X POST "https://api.apify.com/v2/acts/<your-actor-id>/runs?token=<APIFY_TOKEN>" -H "Content-Type: application/json" -d '{"startUrls": ["https://docs.apify.com/"],"maxResults": 25,"maxCrawlDepth": 2,"renderingMode": "auto","saveMarkdown": true}'
Then read the rows from the run's dataset:
$curl "https://api.apify.com/v2/actor-runs/<runId>/dataset/items?format=json&token=<APIFY_TOKEN>"
๐ ๏ธ Input parameters reference
| Parameter | Type | Default | Description |
|---|---|---|---|
startUrls | array | โ | Required. Seed URLs. Always crawled โ URL filters apply to discovered links only. |
referrerUrl | string | "" | Value recorded as referrerUrl on rows produced from the start URLs. |
blockAds | bool | false | Abort known ad/tracker domains on rendered pages. |
mobileView | bool | false | Render with a mobile device profile (viewport, UA, touch) instead of desktop. |
redactPii | bool | false | Mask emails, phone numbers, card-like numbers, and SSNs in text/markdown (best-effort). |
screenshotFullPage | bool | true | Full-page vs viewport-only screenshots. |
extractPdfText | bool | false | Open discovered PDF links and extract real text into text instead of only listing them as files. |
proxyConfiguration | object | {} | Apify Proxy (datacenter/residential/country) or your own proxy URLs. |
includeUrlGlobs | array | [] | Keep only discovered URLs matching these globs (/blog/*, /docs/**). |
excludeUrlGlobs | array | [] | Skip discovered URLs matching these globs (/admin/**, **/*.pdf). |
useSitemaps | bool | false | Seed the queue from robots.txt-advertised sitemaps and /sitemap.xml (follows sitemap indexes). |
useLlmsTxt | bool | false | Seed the queue from URLs listed in each start domain's /llms.txt. |
respectRobotsTxtFile | bool | false | Skip discovered URLs disallowed by robots.txt (seeds always crawled). |
keepUrlFragments | bool | false | Treat #anchors as distinct URLs. |
ignoreCanonicalUrl | bool | false | Use the loaded URL as url instead of the canonical one. |
maxCrawlDepth | int | 2 | Link-following depth from seeds (0 = seeds only). |
maxCrawlPages | int | 0 | Hard cap on unique pages opened (0 = unlimited). |
maxResults | int | 10 | Cap on successful saved rows. |
maxConcurrency | int | 10 | Parallel page workers (1โ50). |
rateLimitDelaySecs | string | 0.1 | Throttle before each fetch; accepts decimals. |
maxRequestRetries | int | 3 | Total attempts per URL (backoff; honours Retry-After on 429). |
requestTimeoutSecs | int | 60 | Request / navigation timeout. |
dynamicContentWaitSecs | int | 3 | Real settle time in seconds after a rendered page loads. |
waitForSelector | string | โ | Wait for this CSS selector; a missing selector triggers a more thorough retry. |
renderingMode | enum | auto | auto (render only when a page needs it) ยท always ยท never (cheapest). |
retryFailedWithRendering | bool | true | Give a failed page one more, more thorough attempt. |
blockMedia | bool | false | Skip images/fonts/video on rendered pages for faster, cheaper runs. |
maxScrollHeightPixels | int | 0 | Auto-scroll rendered pages up to N pixels for lazy/infinite-scroll content (0 = off). |
clickElementsCssSelector | string | โ | Best-effort click on matching elements (expanders / "load more") before extracting rendered pages. |
ignoreHttpsErrors | bool | false | Accept bad certificates (dev/staging only). |
keepElementsCssSelector | string | โ | Keep only elements matching this selector (e.g. article, main); empty keeps the whole page. |
removeElementsCssSelector | string | (sensible default) | CSS selectors stripped before extraction. |
readableTextCharThreshold | int | 100 | Below this many characters a page counts as "thin" and is retried. |
kvDir | string | kv | Storage prefix for snapshots & screenshots (empty = skip storage writes). |
saveScreenshots | bool | false | Full-page PNG per row. Requires rendering every page. |
saveMarkdown | bool | true | Include Markdown in each row. |
saveHtml | bool | true | Include cleaned HTML inline; turn off for much smaller rows. |
headerAcceptLanguage | string | en-US,en;q=0.9 | Accept-Language header. |
customHttpHeaders | object | {} | Extra HTTP headers (cookies, auth, lang) โ these override everything else. |
initialCookies | array | [] | Cookies sent on every request and loaded into the browser: [{"name":"...","value":"...","domain":"...","path":"/"}]. |
debugLog | bool | true | Drops the run log to DEBUG level. |
storeSkippedUrls | bool | false | Write discovered-but-not-crawled URLs (with reasons) to skipped-urls.json in the key-value store. |
Plus browser-identity headers (headerUserAgent, headerSecChUa, headerSecChUaMobile, headerSecChUaPlatform, headerDnt, headerUpgradeInsecureRequests). The defaults give the best success rate on most sites; set a custom headerUserAgent or headerSecChUa and your values are used verbatim instead.
๐ Integrations: LangChain, LlamaIndex, OpenAI, Pinecone
This Actor's Dataset output plugs directly into the modern AI stack:
- ๐ฆ LangChain โ use
ApifyDatasetLoaderor load JSON intoDocumentobjects withtext+metadata. - ๐ฆ LlamaIndex โ feed Markdown rows into
MarkdownReaderor build aVectorStoreIndex. - ๐ง OpenAI Embeddings & Assistants โ chunk
text/markdown, embed withtext-embedding-3, and upload as OpenAI File for Assistants API or Custom GPT knowledge. - ๐ค Anthropic Claude โ upload Dataset JSON to Claude Projects, the Files API, or use as RAG context.
- ๐ Pinecone, Qdrant, Weaviate, Chroma, Milvus, pgvector โ embed and upsert with
metadatafilters. - ๐ n8n, Make.com, Zapier โ wire crawl results into automations and notifications.
- ๐ฆ Snowflake, BigQuery, PostgreSQL, MongoDB, S3 โ load Dataset JSON/CSV into your warehouse or lake.
- ๐งฐ Apify API & SDKs โ orchestrate runs from your own services in any language.
See Apify Publishing & integration docs for platform-level guidance.
๐ธ Pricing & how to control cost
Billable event
This Actor charges one pay-per-event event:
| Event | When it fires | What you get |
|---|---|---|
row_result | Once per page record written to the Dataset | A complete page row โ text, Markdown, metadata, snapshot links |
Pages that fail, are skipped (non-HTML, 404, filtered by globs), or are dropped after the maxResults cap are not charged. If the run hits its charging limit (ACTOR_MAX_TOTAL_CHARGE_USD), the crawl stops cleanly and everything collected so far stays in the Dataset.
โ๏ธ Publishing note: the
row_resultevent must exist in Apify Console โ your Actor โ Publication โ Monetization with the same name. Until pay-per-event is configured, the Actor still runs and saves data โ it just logsIgnored attempt to charge for an event.
Compute cost
Cost on Apify also scales with compute units consumed during a run. The biggest drivers are:
- ๐ Number of pages crawled (
maxResults,maxCrawlPages). - ๐ฅ๏ธ Rendering mode โ
alwaysis far heavier thanauto, andautois heavier thannever. - ๐งฎ Concurrency (
maxConcurrency) and timeout settings. - ๐ Page complexity and network conditions.
To control cost, tune:
maxResultsโ hard cap on saved rows.maxCrawlPagesโ hard cap on URLs opened.maxCrawlDepthโ keep crawls shallow when possible.maxConcurrencyโ balance speed vs. politeness.renderingMode: "never"โ the cheapest possible run.blockMedia: trueโ skip images/fonts/video on rendered pages to cut render time and bandwidth.blockAds: trueโ skip known ad/tracker requests on rendered pages.screenshotFullPage: falseโ capture only the viewport instead of the whole scrolled page.retryFailedWithRendering: falseโ skip the second attempt on pages that fail once.rateLimitDelaySecsโ throttle to avoid being rate-limited (which wastes retries).saveScreenshotsโ leave off unless you need images; enabling it renders every page.saveHtml: falseโ drops the inlinehtmlfield for much smaller (and cheaper to store) rows.
๐ก Tip: start with
maxResults: 10for testing, then scale up once your filters and selectors are dialed in.
โ Frequently asked questions (FAQ)
What is the best web scraper for AI and LLM training data?
A web scraper for AI / LLM training data must produce clean text or Markdown, preserve metadata, handle JavaScript-rendered pages, and export to a structured format (JSON, JSONL, Parquet). Website Content Crawler does all four โ it strips boilerplate HTML, outputs both plain text and Markdown, captures rich metadata, and writes directly to an Apify Dataset that exports as JSON/CSV.
How do I scrape a website for a RAG pipeline?
- Run Website Content Crawler with your docs/help/blog URLs as
startUrls. - Set
saveMarkdown: trueand tuneremoveElementsCssSelectorto strip nav/footer. - Export the Dataset as JSON.
- Chunk each
markdownfield, embed with OpenAI / Cohere / Voyage / local models, and upsert to Pinecone/Qdrant/Weaviate. - At query time, retrieve top-K chunks and pass them as LLM context.
Can this Actor scrape JavaScript-heavy single-page applications (SPAs)?
Yes. renderingMode: "auto" already handles pages that need rendering automatically; set renderingMode: "always" when every page must be rendered. Use waitForSelector for content that mounts after the initial load, and dynamicContentWaitSecs for late-arriving content โ it is a genuine wait in seconds.
How do I export the crawl results?
Open the run in Apify Console โ Dataset tab โ Export โ choose JSON, CSV, Excel, XML, HTML, or RSS. You can also pull data programmatically via the Apify Dataset API.
Does this Actor respect robots.txt?
Optionally, yes โ set respectRobotsTxtFile: true and discovered URLs disallowed by the site's robots.txt are skipped (your explicit start URLs are always crawled). It is off by default. Either way, you remain responsible for compliance with robots.txt, website terms of service, and applicable laws; you can also add excludeUrlGlobs to skip specific paths.
How do I avoid being rate-limited or blocked?
- Lower
maxConcurrency(start at 2โ5). - Increase
rateLimitDelaySecs(e.g.,1.0). - Set realistic
headerUserAgentandcustomHttpHeaders(cookies, language). - Enable
proxyConfiguration, or setrenderingMode: "always"for sites with aggressive bot detection.
Can I crawl multiple websites in one run?
Yes โ add multiple URLs to startUrls. By default the crawler stays on each seed's own domain, so you'll get multi-domain coverage.
How is this different from the official apify/website-content-crawler?
This Actor keeps the input surface small and the cost predictable: three rendering modes instead of a matrix of engines, Markdown and metadata by default, screenshots and HTML snapshots as direct links, and one billable event you can reason about. The official Apify Actor has a much larger feature surface. Choose this one when you want simpler input, predictable cost, and AI-first defaults; choose the official one when you need its full enterprise feature set.
What output formats are supported?
JSON, JSONL, CSV, Excel, XML, HTML, RSS โ all via standard Apify Dataset exports.
Does it support proxies?
Yes โ use the proxyConfiguration input to pick Apify Proxy datacenter or residential groups, a country, or your own proxy URLs. Requests are spread across several proxy sessions automatically. If the chosen proxy is unavailable, the run continues instead of failing.
Can I schedule recurring crawls?
Yes โ use Apify Schedules to run this Actor hourly, daily, or weekly, and pipe new rows into your warehouse, vector DB, or notification channel.
๐ ๏ธ Troubleshooting
| Symptom | Likely cause | Fix |
|---|---|---|
| No rows saved | Bad startUrls, over-restrictive filters, target offline | Verify startUrls, relax includeUrlGlobs / excludeUrlGlobs, check site availability |
| Crawl too slow | Rendering every page + high retries | Lower maxConcurrency, switch renderingMode to auto or never |
Missing content / empty text | JS-rendered SPA, content behind selector | Set waitForSelector, increase dynamicContentWaitSecs, set renderingMode: "always" |
| Boilerplate in output | Default removeElementsCssSelector doesn't cover site's nav | Add site-specific selectors (e.g., .sidebar, .related-posts, .ad-slot) |
| Duplicate rows | Canonical handling off, fragments treated as distinct | Enable canonical (default), set keepUrlFragments: false |
| Cert errors on staging | Self-signed / expired cert | Set ignoreHttpsErrors: true (dev only) |
| Blocked / 403 / 429 | Bot detection, rate limit | Enable proxyConfiguration (residential helps most), increase rateLimitDelaySecs, lower maxConcurrency, try renderingMode: "always" |
| No screenshots in output | saveScreenshots off, kvDir empty, or renderingMode: "never" | Set saveScreenshots: true, keep a kvDir prefix, and use auto or always |
| Only the start URL is crawled | includeUrlGlobs doesn't match any discovered link, or maxCrawlDepth: 0 | Widen the globs (/section/**) and raise maxCrawlDepth |
| Rows are huge / slow to export | html field included | Set saveHtml: false and use htmlUrl instead |
๐ฌ Help, support & custom builds
For custom solutions, private integrations, white-label crawlers, or implementation help:
๐ง hello.dataminds@gmail.com
Useful Apify documentation:
- ๐ Apify documentation
- ๐ค Actors overview
- ๐ Apify API reference
- ๐ Apify Academy โ web scraping
- ๐งฐ Apify SDKs
โ๏ธ Is web scraping legal?
Use this Actor only on pages you are allowed to access. Respect:
- โ
robots.txtdirectives, - โ website terms of service,
- โ rate limits and politeness norms,
- โ data-protection laws (GDPR, CCPA, etc.) in your jurisdiction,
- โ copyright and licensing of extracted content.
You are responsible for compliant data collection, storage, and use. When in doubt, consult a qualified attorney.
๐ SEO keywords targeted
This README is intentionally keyword-rich for discovery on Google Search, Apify Store search, and Bing. Primary and secondary terms covered include:
Primary: website content crawler ยท web scraping ยท website crawler ยท content extraction ยท web scraping API ยท Apify Actor ยท website scraper ยท site crawler
Content & format: Markdown extraction ยท plain text extraction ยท metadata extraction ยท structured data extraction ยท HTML cleaner ยท readable text extractor ยท canonical URL extraction ยท Open Graph scraper ยท JSON-LD extraction ยท schema.org scraper
AI & LLM: RAG pipeline ยท retrieval-augmented generation ยท LLM training data scraper ยท vector database ingestion ยท semantic search crawler ยท embedding pipeline ยท custom GPT knowledge file ยท Claude Projects data ยท LangChain data loader ยท LlamaIndex reader ยท AI agent grounding
Capabilities: headless rendering ยท JavaScript rendering scraper ยท SPA scraper ยท React scraper ยท dynamic content scraper ยท concurrent crawler ยท anti-blocking scraper ยท sitemap crawler ยท llms.txt crawler ยท robots.txt compliant crawler ยท infinite scroll scraper
Use cases: documentation scraper ยท blog crawler ยท SEO content audit ยท competitive intelligence crawler ยท website-to-JSON ยท website-to-database ยท website-to-Markdown ยท knowledge base scraper ยท help center crawler ยท changelog scraper
Integrations: Pinecone ingestion ยท Qdrant ingestion ยท Weaviate ยท Chroma ยท pgvector ยท Snowflake ยท BigQuery ยท n8n ยท Make.com ยท Zapier ยท OpenAI Embeddings ยท Anthropic Files API
Reference patterns for structure and section ordering:
- ๐ Public Actor: apify/website-content-crawler
- ๐ Apify publishing guidance: Publishing and monetization
- ๐ Console (access-gated): Console README