Data as of Aug 25, 2026 · Based on 406 AI responses from ChatGPT Search and Google AI Mode · See how Parse measures this
For developers seeking a reliable tool, Scrapy is the industry-standard framework that inherently respects robots.txt, and it can be extended with
Playwright to handle dynamic JavaScript pages. If you prefer a managed experience rather than maintaining infrastructure, platforms like
Firecrawl and offer built-in support for both requirements in an easier-to-use API format.
Brands AI recommends here
Named in 80% of answers
Named in 68% of answers
Best for coders wanting full control over large-scale crawls. It adheres to robots.txt by default; however, it requires manual setup with the Playwright plugin to successfully render dynamic JavaScript pages.
Named in 46% of answers
Named in 38% of answers
When you need a scraper that handles **heavy JavaScript rendering** without crashing *and* stays ethical by honoring **robots.txt** , your best options depend on whether you want an **open-source developer library** or a **managed cloud API**.[](https://www.olostep.com/blog/best-web-crawler)…
When you need a scraper that handles heavy JavaScript rendering without crashing and stays ethical by honoring robots.txt , your best options depend on whether you want an open-source developer library or a managed cloud API.
Top-tier tools that meet both criteria include:
robots.txt rules out of the box on standard tiers (with an enterprise option to bypass if explicitly needed). It converts dynamic pages directly into clean Markdown or structured JSON.PlaywrightCrawler and PuppeteerCrawler ) to safely parse dynamic JS apps without crashing, and includes built-in configurations/utilities (like respect_robots_txt_file=True in Python or RobotsFile utilities in JS) to check and obey site directives.robots.txt rules by default on its recursive crawl endpoints, returning clean structured data.If you tell me your preferred programming language (Python vs. Node.js) and whether you prefer an open-source library or a managed API , I can provide a code snippet tailored to your workflow.
Yes. For your requirements, I’d shortlist these: - **[crawlee.dev](https://crawlee.dev/?utm_source=chatgpt.com) — best overall for a developer-built scraper.** Its `PlaywrightCrawler` runs real browsers for JavaScript-heavy pages and has a built-in `respectRobotsTxtFile` option that skips URLs disallowed by…
Yes. For your requirements, I’d shortlist these:
PlaywrightCrawler runs real browsers for JavaScript-heavy pages and has a built-in respectRobotsTxtFile option that skips URLs disallowed by robots.txt. It also has request queues, retries, autoscaling, and concurrency controls. respectRobotsTxtFile setting. ROBOTSTXT_OBEY support, although its normal HTTP downloader doesn't execute JavaScript; for JS-heavy sites you'd pair it with a browser integration or use the site's underlying API where appropriate. If you want “it just works” with modern React/Vue/Angular sites, I'd start with Crawlee + Playwright. It gives you the browser-rendering capability without giving up crawler features such as URL queues, retries, throttling, and explicit robots.txt compliance.
If you don't want to maintain infrastructure, use Apify's Playwright Scraper instead.
One important distinction: robots.txt compliance and JavaScript rendering are separate problems. A good scraper should check robots.txt before navigating, then use a real browser only when necessary. Crawlee supports exactly that pattern.
If you tell me whether you want Python, JavaScript/TypeScript, or a no-code SaaS, I can narrow this to 2–3 concrete choices and compare price, robots.txt behavior, proxy requirements, concurrency, and reliability.
You should use **[Scrapy](https://scrapy.org/)** combined with a headless browser plugin like **Scrapy-Playwright** , as it natively respects `robots.txt` via built-in settings and handles complex JavaScript rendering without crashing. Top Recommendations - **Scrapy + Playwright**:
You should use Scrapy combined with a headless browser plugin like Scrapy-Playwright , as it natively respects robots.txt via built-in settings and handles complex JavaScript rendering without crashing.
Top Recommendations
ROBOTSTXT_OBEY = True setting that automatically parses and respects site rules. Adding Playwright lets you render dynamic JavaScript elements smoothly.robots.txt policies during crawling.Feature Comparison
| Tool | Handles Dynamic JS | Respects robots.txt | Best Use Case |
|---|---|---|---|
| Scrapy + Playwright | Yes (via browser engine) | Built-in native setting | Custom production pipelines |
| Firecrawl | Yes (real browser) | Requires manual check | AI-ready data extraction |
| Playwright (Standalone) | Yes | Manual implementation | Light automation / scripting |
If you can tell me your preferred programming language (e.g., Python, Node.js) and whether you need an API service or local code library , I can give you a precise setup guide.
If your two requirements are **(1) obey `robots.txt`** and **(2) handle JavaScript-heavy pages reliably**, I’d shortlist these: - **[crawlee.dev](https://crawlee.dev/?utm_source=chatgpt.com) + Playwright** — probably my first choice. Its `PlaywrightCrawler` uses a real headless browser for JS pages, manages browser…
If your two requirements are (1) obey robots.txt and (2) handle JavaScript-heavy pages reliably, I’d shortlist these:
PlaywrightCrawler uses a real headless browser for JS pages, manages browser concurrency, retries, queues, and can automatically enforce robots.txt with respectRobotsTxtFile. ROBOTSTXT_OBEY, while scrapy-playwright supplies browser rendering for JS pages without abandoning Scrapy's normal workflow. Crawlee + Playwright is the closest match to what you're describing. It gives you:
robots.txt enforcementOne important nuance: don't assume a headless browser is always necessary. Scrapy's documentation recommends finding the underlying API/request that supplies dynamically loaded data when possible; that's usually faster and more reliable than rendering an entire browser page.
If you tell me Python vs. Node.js and roughly how many pages/day you need to scrape, I can recommend a specific setup (including a minimal robots.txt-respecting crawler).
Finding a tool that balances **polite crawling compliance** (`robots.txt` ) with **heavy JavaScript rendering** without crashing requires a modern web scraping framework or an API-driven crawler. A breakdown of the top tools fitting these exact requirements includes: - **Crawlee (JS/TS & Python)**
Finding a tool that balances polite crawling compliance (robots.txt ) with heavy JavaScript rendering without crashing requires a modern web scraping framework or an API-driven crawler.
A breakdown of the top tools fitting these exact requirements includes:
PlaywrightCrawler and PuppeteerCrawler , natively rendering complex single-page apps (SPAs) and dynamic content.respect_robots_txt_file=True ) to automatically parse and skip URLs forbidden in a target site's robots.txt.scrapy-playwright middleware, traditional Scrapy passes requests through a headless browser engine to fully execute client-side JavaScript before scraping.ROBOTSTXT_OBEY setting that strictly adheres to standard exclusion rules.To help narrow down the best choice, let me know:
If your two hard requirements are **(1) obey `robots.txt`** and **(2) handle JavaScript-heavy pages reliably**, I’d start with **Crawlee + Playwright**. ### Best fit: Crawlee + Playwright [crawlee.dev](https://crawlee.dev/js/api/3.12/playwright-crawler?utm_source=chatgpt.com)
If your two hard requirements are (1) obey robots.txt and (2) handle JavaScript-heavy pages reliably, I’d start with Crawlee + Playwright.
It is particularly well suited because:
robots.txt: respectRobotsTxtFile: true automatically checks each domain's robots.txt and skips disallowed URLs, including preventing them from being enqueued. A basic configuration would look like:
import { PlaywrightCrawler } from 'crawlee';
const crawler = new PlaywrightCrawler({
respectRobotsTxtFile: true,
maxConcurrency: 5,
requestHandlerTimeoutSecs: 60,
async requestHandler({ page, request }) {
await page.waitForLoadState('domcontentloaded');
const title = await page.title();
const text = await page.locator('body').innerText();
console.log({ url: request.url, title, text });
},
failedRequestHandler({ request }) {
console.error(`Failed: ${request.url}`);
},
});
await crawler.run([
'https://example.com',
]);
If you're primarily a Python developer, I'd consider Scrapy with scrapy-playwright. Scrapy has mature crawling, throttling, queues, pipelines, and error handling, while Playwright supplies JavaScript rendering.
Scrapy explicitly supports ROBOTSTXT_OBEY; its current documentation says the robots middleware filters requests forbidden by robots.txt.
| Option | JS pages | robots.txt | Reliability | Best for |
|---|---|---|---|---|
| Crawlee + Playwright | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | Best overall |
| Scrapy + Playwright | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | Python/data pipelines |
| Scrapy alone | ⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | Mostly static sites |
| Playwright alone | ⭐⭐⭐⭐⭐ | Manual | ⭐⭐⭐ | Small custom scrapers |
One important distinction: respecting robots.txt is not the same as bypassing anti-bot protections. If your goal is an ethical/compliant scraper, I'd leave bot-protection bypassing disabled and honor the site's crawl rules and rate limits.
If you tell me Python vs. JavaScript/TypeScript and roughly how many pages/day you need to scrape, I can recommend a concrete stack and configuration.
Finding a web scraper that handles dynamic JavaScript (Single Page Applications, React, Vue, etc.) while cleanly respecting `robots.txt` usually requires combining a headless browser engine with a disciplined crawler framework or explicitly enabling compliance…
Finding a web scraper that handles dynamic JavaScript (Single Page Applications, React, Vue, etc.) while cleanly respecting robots.txt usually requires combining a headless browser engine with a disciplined crawler framework or explicitly enabling compliance settings.
The top options that natively support JavaScript rendering and provide mechanisms to respect robots.txt include:
check_robots_txt=True ) to efficiently check, parse, and respect robots.txt rules. You can review the setup on the Crawl4AI Documentation.robots.txt via its ROBOTSTXT_OBEY setting. By itself, it only grabs static HTML. However, integrating Scrapy-Playwright or Scrapy-Splash allows it to route requests through a headless browser instance to fully execute and render JavaScript without crashing or missing dynamic content. Learn more about the integration approach via Scrapy-Splash on PyPI.robots.txt by default across every custom script, their standard web scraping templates and SDKs allow you to easily program a pre-crawl check against a target site’s robots.txt using standard parser libraries before triggering the browser render. Explore the platform on Apify.robots.txt blocks explicitly in its error handling hooks, making it easy to filter out disallowed paths. Check out the details at Firecrawl.To help narrow down the best fit, tell me:
Yes. If your two hard requirements are **respect `robots.txt`** and **handle JavaScript-heavy pages reliably**, I’d shortlist these: - **[apify.com](https://apify.com/apify/web-scraper?utm_source=chatgpt.com) — best overall managed option.** Its Web Scraper runs pages in a browser, supports JavaScript-rendered sites,…
Yes. If your two hard requirements are respect robots.txt and handle JavaScript-heavy pages reliably, I’d shortlist these:
respectRobotsTxtFile: true setting. robots.txt directives for its crawler agent. It returns Markdown, HTML, JSON, etc., which is convenient if you're feeding scraped content into an application or LLM. scrapy-playwright for JavaScript-rendered pages. You can build your own robots handling, rate limits, retries, and persistence around it. For “give it URLs and don't babysit it”, I'd start with Apify. Its Web Scraper explicitly exposes the robots.txt switch and uses a headless browser for dynamic pages.
For a simple developer-facing API, I'd pick Firecrawl.
One caveat: “doesn't crash” is ultimately a reliability requirement rather than something any scraper can guarantee. For production, look for timeouts, retries, failed-page isolation, concurrency limits, and persistent crawl state in addition to JavaScript rendering.
If you tell me whether you want Python, Node.js, or a no-code/hosted solution, I can narrow this to the best 2–3 options and show a minimal setup.
If your two requirements are **(1) obey `robots.txt`** and **(2) reliably handle JavaScript-rendered pages**, my first choice would be **Crawlee with Playwright**. ### Best options - **[crawlee.dev](https://crawlee.dev/?utm_source=chatgpt.com) — best overall**
If your two requirements are (1) obey robots.txt and (2) reliably handle JavaScript-rendered pages, my first choice would be Crawlee with Playwright.
crawlee.dev — best overall
Uses real Chromium/Firefox/WebKit browsers, so it handles client-rendered pages and waits for dynamically appearing elements.
Has a built-in respectRobotsTxtFile option that checks robots.txt and skips disallowed URLs, including URLs discovered while crawling.
Includes retries, request limits, concurrency control, queues, and automatic resource management—useful for avoiding crashes on larger crawls.
My pick if you're comfortable with JavaScript/TypeScript.
docs.scrapy.org — best Python choice
Scrapy provides the mature crawling framework, while Playwright supplies browser-based JavaScript rendering. Scrapy's documentation specifically recommends scrapy-playwright for this integration.
A good choice if the rest of your scraping/data pipeline is Python.
playwright.dev by itself — good for small projects
Excellent browser automation, but you'll need to build the crawler infrastructure yourself: robots handling, queues, retries, throttling, persistence, etc.
I'd use it directly for a handful of sites, rather than for a serious crawler.
For a production scraper, I'd start with Crawlee + Playwright and configure roughly:
const crawler = new PlaywrightCrawler({
respectRobotsTxtFile: true,
maxConcurrency: 5,
maxRequestsPerCrawl: 10000,
maxRequestRetries: 3,
navigationTimeoutSecs: 60,
async requestHandler({ page, request }) {
// Extract data after JavaScript has rendered.
},
});
One important caveat: robots.txt compliance and avoiding crashes are separate concerns. robots.txt tells you which URLs you're permitted to crawl; it doesn't guarantee that a site will tolerate your crawl rate. Keep concurrency/rate limits conservative, set request/page timeouts, and retain failed requests for inspection.
If you tell me whether you prefer Python, JavaScript/TypeScript, or a no-code hosted scraper, I can narrow this down to the best 2–3 choices.
Finding a web scraper that handles heavy JavaScript rendering *and* respects `robots.txt` depends heavily on whether you prefer an **open-source Python library** or a **managed cloud API**. Modern headless-browser setups or dedicated AI-ready crawlers fit these exact requirements: -…
Finding a web scraper that handles heavy JavaScript rendering and respects robots.txt depends heavily on whether you prefer an open-source Python library or a managed cloud API.
Modern headless-browser setups or dedicated AI-ready crawlers fit these exact requirements:
robots.txt checking (check_robots_txt=True ) that caches rules locally for efficiency.robots.txt compliance during crawls (with ignoreRobotsTxt restricted or toggleable depending on enterprise tiers), making it a solid plug-and-play choice if you prefer an API over self-hosting.robots.txt using Apify's router utilities or standard robotexclusionparser libraries before queuing target URLs.To help narrow down the best fit, tell me: