Crawlee 深度解析:Node.js 生态最成熟的爬虫框架
GitHub: apify/crawlee | ⭐ 22,800+ Stars | Apache-2.0 | TypeScript
如果你在用 Node.js 做爬虫,或者打算开始做,Crawlee 大概率是你最好的选择。这不是我的主观判断,而是这个项目的定位、能力和生态综合得出的结论。
Crawlee 是什么?
Crawlee 是 Apify 开源的 Web 爬取与浏览器自动化库,用 TypeScript 编写,支持 Node.js 16+。
Apify 是一家做爬虫 SaaS 的公司,Crawlee 就是他们内部核心工具的开源版本。换句话说:这是经过生产验证的工业级框架,不是实验性项目。
一句话概括:同时支持 HTTP 直爬和浏览器自动化,内置 URL 队列管理、代理轮换、反检测、自动缩放——你需要的一切都有。
核心架构:3 个层次
1. Crawlers(爬虫器)
Crawlee 提供 5 种爬虫器,覆盖不同场景:
| 爬虫器 | 底层引擎 | 速度 | 适用场景 |
|---|---|---|---|
| CheerioCrawler | Cheerio HTML 解析 | 极快 | 静态页面、HTML 结构清晰 |
| JSDOMCrawler | JSDOM | 快 | 需要 DOM 环境但不想开浏览器 |
| PlaywrightCrawler | Playwright | 中 | SPA、React/Vue 动态渲染页面 |
| PuppeteerCrawler | Puppeteer | 中 | 动态页面,Google 技术栈 |
| BasicCrawler | 无引擎 | 可定制 | 底层基类,自定义一切 |
核心思路:同一套 API,不同的引擎。你可以从 CheerioCrawler 起步,遇到需要 JS 渲染的页面再切换到 PlaywrightCrawler,代码结构几乎不用改。
2. Storage(持久化存储)
Crawlee 内置 3 种存储,开箱即用:
- RequestQueue — URL 队列,支持 BFS/DFS 遍历,自动去重,理论上无限规模
- Dataset — 结构化数据存储,自动持久化为 JSON,支持导出 CSV/XLSX
- KeyValueStore — Key-Value 存储,存文件、截图或任意数据
数据默认存在 ./storage 目录,不需要配置数据库。
3. 内置能力(开箱即用)
- 自动代理轮换 — Session pool + proxy rotation
- 反检测 — 默认配置下绕过多数 bot 检测(TLS 指纹、浏览器级 headers)
- 自动缩放 — 根据 CPU/内存动态调节并发数
- 重试机制 — 可配置的重试策略和错误处理
- CLI 脚手架 — 一行命令生成项目
- Docker 部署 — 生产级 Dockerfile 现成的
快速开始:5 分钟上手
方法一:CLI 脚手架(推荐)
npx crawlee create my-crawler
cd my-crawler
npm start
CLI 会引导你选择爬虫器类型,生成完整项目结构,包括示例代码。
方法二:手动引入
npm install crawlee playwright
import { PlaywrightCrawler, Dataset } from 'crawlee';
const crawler = new PlaywrightCrawler({
async requestHandler({ request, page, enqueueLinks, log }) {
const title = await page.title();
log.info(`Title of ${request.loadedUrl} is '${title}'`);
// 数据自动持久化到 ./storage/datasets/default
await Dataset.pushData({ title, url: request.loadedUrl });
// 提取页面链接,自动加入爬取队列
await enqueueLinks();
},
// headless: false, // 想看浏览器窗口就取消注释
});
await crawler.run(['https://crawlee.dev']);
这段代码做了什么:
- 打开目标页面
- 提取页面标题和 URL
- 提取页面上的所有链接,加入爬取队列
- 递归爬取所有链接
- 所有数据自动保存到本地 JSON 文件
HTTP 爬取:Crawlee 真正的杀手级能力
很多人以为 Crawlee 只是一个 Playwright/Puppeteer 的封装。不是的。它真正的优势在纯 HTTP 爬取:
零配置 HTTP/2
即使通过代理,也自动支持 HTTP/2。这意味着和现代服务器的通信更高效。
自动生成浏览器级 Headers
Crawlee 会模拟真实浏览器的请求头(User-Agent、Accept、Accept-Language 等),不需要你手动拼。
TLS 指纹模拟
这是 Crawlee 的独门武器。它会模拟真实浏览器的 TLS 握手特征,让服务器认为请求来自真实浏览器,而不是爬虫脚本。
很多网站用 TLS 指纹来区分人类和 bot——普通的 HTTP 客户端(axios、fetch)一查就出来了。Crawlee 的 TLS 指纹模拟可以绕过这类检测。
内建 HTML 解析器
Cheerio 和 JSDOM 都是 Crawlee 的一等公民,不需要额外安装。解析速度是浏览器自动化方案的 10-100 倍。
和 Scrapy 的对比
Python 爬虫绕不开 Scrapy。Crawlee 和 Scrapy 不是同一个维度的对手,但值得对比:
| 维度 | Crawlee (JS) | Scrapy (Python) |
|---|---|---|
| 上手难度 | 低,CLI 一键生成项目 | 中,需要理解 Scrapy 架构 |
| 浏览器爬取 | 原生集成 Playwright/Puppeteer | 需要 scrapy-playwright 等插件 |
| 反检测 | 内置(TLS 指纹、代理池) | 需要自行配置 |
| 动态页面 | 原生支持 | 需要额外集成 |
| 生态 | Node.js + Apify 云平台 | Python 庞大生态 |
| Python 版 | crawlee-python 已开源 | N/A |
简单说:如果你用 JavaScript/TypeScript,Crawlee 是第一选择。如果你用 Python,Scrapy 依然是王者,但 crawlee-python 值得尝试。
反爬对抗能力
这是 Crawlee 最有价值的部分之一。它不只是"能爬",而是"能持续稳定地爬"。
代理轮换
Crawlee 内置 Session Pool,每个 Session 可以绑定一个代理 IP。Session 过期或被封后自动切换,不需要你手动管理。
import { PlaywrightCrawler, ProxyConfiguration } from 'crawlee';
const proxyConfig = new ProxyConfiguration({
proxyUrls: [
'http://proxy1.example.com',
'http://proxy2.example.com',
],
});
const crawler = new PlaywrightCrawler({
proxyConfiguration: proxyConfig,
// ...
});
浏览器指纹模拟
除了 TLS 指纹,Crawlee 还会模拟:
- 浏览器 User-Agent 轮换
- 屏幕尺寸和分辨率模拟
- 浏览器插件和环境特征
请求间隔控制
内置 autoscaledPool,自动根据系统负载和目标网站的响应速度调节并发数,不会把目标站打挂。
实际应用场景
场景 1:新闻聚合
用 CheerioCrawler 高速爬取多个新闻源,自动提取标题、内容、时间,存入 Dataset。配合定时任务,可以实现实时新闻聚合。
const crawler = new CheerioCrawler({
maxRequestsPerCrawl: 1000,
async requestHandler({ $, request, enqueueLinks }) {
const articles = [];
$('article').each((_, el) => {
articles.push({
title: $(el).find('h2').text(),
url: $(el).find('a').attr('href'),
time: $(el).find('.time').text(),
});
});
await Dataset.pushData(articles);
await enqueueLinks();
},
});
await crawler.run(['https://news.example.com']);
场景 2:竞品价格监控
用 PlaywrightCrawler 爬电商网站(需要 JS 渲染才能加载价格),设置定时任务,发现价格变化时触发告警。
场景 3:SEO 批量审计
用 CheerioCrawler 批量爬站点所有页面,提取 meta 标签、标题层级、图片 alt 属性、加载时间等数据,生成 SEO 报告。
Python 版
Crawlee 的 Python 版本 crawlee-python 也已经开源,架构和 JS 版一致。如果你更习惯 Python 生态,可以直接用:
pip install crawlee[playwright]
Python 版还在快速发展中,核心功能已可用。
冷静的看法
优点:
- Apify 在爬虫领域是专业的,框架经过生产验证
- 反检测能力开箱即用,不像裸用 Playwright 容易被封
- 文档质量高,examples 丰富,社区活跃
- Apache-2.0 许可,商用无限制
- CLI 脚手架对新手友好
- HTTP 爬取能力比大多数框架都强
需要注意的:
- 主要生态在 Node.js(Python 版还在追赶)
- 大规模部署时,配合 Apify 云平台体验最好,但纯本地用也完全 OK
- RequestQueue 的工作机制需要理解,尤其是分布式场景下的行为
- 如果你的需求只是简单爬几个页面,可能用 axios + cheerio 就够了,Crawlee 的价值在规模化爬取时才能充分体现
总结
Crawlee 是我见过的最完整的 Node.js 爬虫框架。它把 HTTP 爬取、浏览器自动化、代理管理、数据存储、反检测这些原本需要你一个个拼的能力,打包成了一个统一的框架。
如果你在做数据采集、竞品监控、SEO 审计、AI 训练数据收集——Crawlee 值得认真考虑。
快速开始:
npx crawlee create my-crawler文档:https://crawlee.dev GitHub:https://github.com/apify/crawlee
标签:Crawlee, Web Scraping, Node.js, TypeScript, 爬虫, Apify, Playwright, 数据采集, AI 训练数据
评论 ({{ comments.length }})
暂无评论,来说两句吧