使用Apify Crawlee构建第一个网络爬虫:从入门到实践
爬虫开发基础概念
在开始构建第一个爬虫之前,我们需要了解Crawlee框架中的几个核心概念。Crawlee提供了三种主要的爬虫类,它们各自适用于不同的场景:
- CheerioCrawler - 基于Cheerio的轻量级HTTP爬虫,适合处理静态HTML内容
- PuppeteerCrawler - 基于Puppeteer的浏览器爬虫,可处理JavaScript渲染的页面
- PlaywrightCrawler - 基于Playwright的多浏览器爬虫,支持Chromium、Firefox和WebKit
这三种爬虫虽然实现方式不同,但都遵循相同的基本工作流程:访问网页→执行操作→保存结果→继续下一页→重复这个过程直到完成。
爬虫工作原理详解
请求(Request)与请求队列(RequestQueue)
每个爬虫都需要解决两个核心问题:"去哪里"和"做什么"。
-
去哪里:通过
Request
对象指定,至少包含一个URL地址。多个请求存储在RequestQueue
中,形成一个动态队列。 -
做什么:通过
requestHandler
函数定义,这个用户自定义函数会在每个请求被处理时调用,接收一个CrawlingContext
对象作为参数。
为什么选择CheerioCrawler
对于初学者,建议从CheerioCrawler
开始,因为:
- 它基于HTTP协议,速度快且资源消耗低
- 内置Cheerio库,提供类似jQuery的DOM操作API
- 支持HTTP/2和反爬虫功能
- 不需要复杂的浏览器环境
只有当目标网站必须执行JavaScript才能显示内容时,才需要考虑使用Puppeteer或Playwright爬虫。
实战:构建第一个爬虫
基础版本:获取网页标题
让我们从最简单的例子开始:获取网页的HTML标题。
import { CheerioCrawler } from 'crawlee';
const crawler = new CheerioCrawler({
async requestHandler({ $, request }) {
const title = $('title').text();
console.log(`网页 "${request.url}" 的标题是: ${title}`);
}
});
await crawler.run(['https://crawlee.dev']);
这段代码做了以下几件事:
- 创建CheerioCrawler实例
- 定义requestHandler处理每个页面
- 使用Cheerio的
$
选择器提取标签文本</li> - 启动爬虫并传入初始URL
代码解析与技术要点
-
Top-level await:示例中使用了顶层await,需要在package.json中添加
"type": "module"
,或使用.mjs文件扩展名。 -
Cheerio选择器:
$('title').text()
是典型的Cheerio语法,与jQuery几乎相同。 -
自动队列管理:
crawler.run()
会自动创建和管理请求队列,比手动创建RequestQueue更简洁高效。
性能优化技巧
当需要爬取大量URL时,可以使用批量添加方式:
// 创建包含多个URL的数组
const startUrls = [
'https://example.com/page1',
'https://example.com/page2',
// ...更多URL
];
await crawler.run(startUrls);
Crawlee会以每批1000个请求的方式高效处理,不会阻塞主线程。
爬虫开发进阶方向
掌握了基础爬虫后,可以进一步学习:
- 动态URL发现:从页面中提取新链接并加入队列
- 数据处理:结构化提取信息并存储
- 反爬虫策略:处理验证码、限速等防护措施
- 分布式爬取:大规模数据采集方案
常见问题与解决方案
-
JavaScript渲染问题:如果内容需要JS执行,考虑切换到PuppeteerCrawler
-
请求失败处理:Crawlee内置自动重试机制,可配置重试次数
-
性能调优:调整并发数、请求间隔等参数优化爬取速度
通过这个简单的例子,你已经掌握了使用Crawlee构建爬虫的核心概念。接下来可以尝试更复杂的数据提取和页面导航功能,逐步构建功能完善的网络爬虫。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考