返回

Crawlee 指南:从入门到实战详解 JavaScript 与 Python 通用爬虫库

2025-10-31 Crawlee JavaScript Python 379 0

Crawlee 是一个开源的网页爬取和浏览器自动化库,支持 JavaScript/TypeScript(Node.js)和 Python。它由 Apify 团队维护。Crawlee 的目标是让你以更少的配置、更统一的接口,快速构建可靠的爬虫。

Crawlee 指南:从入门到实战详解 JavaScript 与 Python 通用爬虫库

其主要用途包括:

  • 抓取静态网页(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 都是一个不错的选择。希望你能借助本文快速上手,并在你的项目中发挥作用。

顶部