微信分享缩略图
  • {{ post.title }}

    {{ post.excerpt }}

    {{ post.author_name || settings.site_author || 'Admin' }} {{ formatDate(post.published_at || post.created_at) }} {{ post.view_count }} {{ post.comment_count }}

Crawlee 深度解析:Node.js 生态最成熟的爬虫框架

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']);

这段代码做了什么:

  1. 打开目标页面
  2. 提取页面标题和 URL
  3. 提取页面上的所有链接,加入爬取队列
  4. 递归爬取所有链接
  5. 所有数据自动保存到本地 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 GitHubhttps://github.com/apify/crawlee


标签:Crawlee, Web Scraping, Node.js, TypeScript, 爬虫, Apify, Playwright, 数据采集, AI 训练数据

{{ currentPost.title }}

评论 ({{ comments.length }})

正在回复 @{{ replyTo.author_name }} 取消回复

暂无评论,来说两句吧

{{ settings.about_title || '个人简介' }}

搜索中...
没有找到相关文章
{{ r.title }}
{{ r.category_name }} {{ formatDate(r.published_at || r.created_at) }} {{ r.view_count }} 次阅读

{{ r.excerpt }}

评论通过

评论未通过

等待审核

{{ aiModalData.review || aiModalData.message }}

{{ toast.message }}