Crawlee 指南:从入门到实战详解 JavaScript 与 Python 通用爬虫库
2025-10-31 379 0
Crawlee 是一个开源的网页爬取和浏览器自动化库,支持 JavaScript/TypeScript(Node.js)和 Python。它由 Apify 团队维护。Crawlee 的目标是让你以更少的配置、更统一的接口,快速构建可靠的爬虫。

其主要用途包括:
-
抓取静态网页(HTTP 请求 + 解析)
-
抓取动态网页(浏览器渲染、Playwright / Puppeteer)
-
管理爬取队列、链接入队、数据存储、代理轮换等机制
Crawlee 的强项在于内置了很多“爬虫实战”所需的机制(如代理、会话、浏览器模拟、链接队列等),让开发者更聚焦数据抽取逻辑,而不是从头实现这些基础设施。
Crawlee 主要特性
Crawlee 具备以下较为突出的功能:
-
统一接口:无论是 HTTP 模式还是浏览器模式,Crawlee 提供统一的入口。对于 Python 版,它强调“统一的 HTTP & headless 浏览器爬取接口”。
-
自动化并发与队列管理:你可以为大量 URL 设定初始入口,在爬虫运行中自动入队、并行处理。
-
支持浏览器模式:对于需要 JavaScript 渲染的页面,Crawlee 可搭配 Playwright 或 Puppeteer 使用。
-
阻挡防护机制:默认包含如代理轮换、浏览器指纹、会话池等来减少被反爬虫机制封禁或限制的风险。
-
灵活数据存储与导出:抓取的数据可以存储为多种格式,且易于导出。
-
良好的扩展性:对于大型项目可以通过配置、插件或自定义逻辑进行调优。
安装与快速启动
JavaScript/Node.js
1. 创建项目:npm init -y。
2. 安装 Crawlee:npm install crawlee。
3. 编写一个简单爬虫示例:
import { PlaywrightCrawler } from 'crawlee';
const crawler = new PlaywrightCrawler({
async requestHandler({ request, page, enqueueLinks, pushData, log }) {
const title = await page.title();
log.info(`Title of ${request.loadedUrl} is '${title}'`);
await pushData({ title, url: request.loadedUrl });
await enqueueLinks();
},
maxRequestsPerCrawl: 20,
});
await crawler.run(['https://crawlee.dev']);
await crawler.exportData('./result.csv');
const data = await crawler.getData();
console.table(data.items);
在这个示例中,使用 PlaywrightCrawler,访问入口 URL,抽取标题并继续抓取内部链接。
Python
1. 安装:pip install 'crawlee[all]'(视需要安装所有功能)。
编写示例:
from crawlee import PlaywrightCrawler, Dataset
async def handler(context):
title = await context.page.title()
print(f"Title: {title}")
await context.push_data({"title": title, "url": context.request.loaded_url})
await context.enqueue_links()
crawler = PlaywrightCrawler(request_handler=handler, max_requests_per_crawl=20)
await crawler.run(["https://crawlee.dev"])
await crawler.export_dataset("./result.json")
典型用法详解
1. 静态页面抓取(CheerioCrawler/HTTP 模式)
对于无大量 JavaScript 渲染、页面结构简单的网站,可以选用 CheerioCrawler(在 JS 版)或 HTTP 模式(Python)。例如:
import { CheerioCrawler } from 'crawlee';
const crawler = new CheerioCrawler({
async requestHandler({ $, request }) {
const title = $('title').text();
console.log(`Title of "${request.url}" is: ${title}`);
await enqueueLinks();
},
});
await crawler.run(['https://books.toscrape.com']);
这种方式资源消耗小、速度快,是优选方案。
2. 动态页面抓取(浏览器模式)
当页面通过 JavaScript 渲染内容或有大量异步加载时,必须用浏览器模式(如 PlaywrightCrawler/PuppeteerCrawler):
-
启动浏览器(可选 headful / headless)
-
加载页面、等待元素出现
-
提取数据、可能滚动页面、处理无限滚动、加载更多等
Crawlee 在这方面提供封装,使得从 HTTP 模式切换到浏览器模式较为平滑。
3. 链接入队与爬取流程控制
Crawlee 的 enqueueLinks 支持自动发现页面中的链接并加入队列,帮助构建“蜘蛛”式爬虫。你可以自定义哪些链接入队、哪些跳过,定义策略例如只抓取同域名或某些路径。
4. 代理、会话、 fingerprint 管理
为了避免被网站封禁,Crawlee 内置了代理轮换、会话池、浏览器指纹等功能。你无须从零实现这些机制,就可以在项目中配置代理池、设置 Fingerprint 选项,使爬虫“看起来像”真实用户。
实战建议与注意事项
-
遵守目标网站规则:在抓取前请确认目标网站是否允许爬虫访问,例如
robots.txt、服务条款。 -
合理设置并发:尽管 Crawlee 支持高并发,但切勿对同一站点施加过高请求负荷,以避免影响目标站点或触发封锁。
-
处理反爬机制:真实网站可能会有验证码、登录、动态内容加载、无限滚屏、AJAX 请求等。Crawlee 提供基础支持,但还是需要开发者根据目标站点做定制逻辑。
-
错误处理与重试:爬取中不可避免会遇到网络问题、加载失败或被封禁。应配置好重试、失败记录、断点续爬机制。
-
数据存储与清洗:抓到的数据往往需要清洗、校验、结构化;尽量在爬虫逻辑里或后处理阶段做好。
-
资源与部署考量:浏览器模式资源消耗较高,部署时要关注内存、CPU、并发量、代理费用等成本。
-
维护与选择切换:目标站点结构变更会导致抓取失败。建议定期维护selectors、路径,或设计策略先尝试 API 接口再降级到浏览器爬取。
总结
Crawlee 是一个兼顾易用性与功能强大的网页爬虫框架,支持 JavaScript/Python 双语生态,封装了队列管理、链接入队、代理轮换、浏览器模式等关键机制。无论你是初次尝试爬虫开发,还是要构建规模化、可靠的数据抓取系统,Crawlee 都是一个不错的选择。希望你能借助本文快速上手,并在你的项目中发挥作用。