使用Apify/Crawlee的PuppeteerCrawler快速入门指南
概述
Apify/Crawlee是一个强大的Node.js爬虫框架,其中PuppeteerCrawler是其基于Puppeteer的无头浏览器爬虫实现。本文将详细介绍如何使用PuppeteerCrawler快速构建一个网页爬取程序。
PuppeteerCrawler核心优势
PuppeteerCrawler相比传统爬虫具有以下特点:
- 完全模拟浏览器环境,可以处理JavaScript渲染的页面
- 提供完整的浏览器自动化能力,如点击、表单提交等
- 内置请求队列、自动重试等企业级功能
- 简化了Puppeteer的复杂API,提供更友好的开发体验
快速入门示例解析
让我们通过一个基础示例来了解PuppeteerCrawler的基本用法:
import { PuppeteerCrawler, Dataset } from 'crawlee';
const crawler = new PuppeteerCrawler({
async requestHandler({ request, page, enqueueLinks, log }) {
const title = await page.title();
log.info(`Title of ${request.loadedUrl} is '${title}'`);
await Dataset.pushData({ title, url: request.loadedUrl });
await enqueueLinks();
},
maxRequestsPerCrawl: 50,
});
await crawler.run(['https://crawlee.dev']);
代码分解
-
初始化PuppeteerCrawler:
- 创建爬虫实例时传入配置对象
- 核心是
requestHandler
函数,处理每个抓取的页面
-
requestHandler参数:
request
:当前请求对象,包含URL等信息page
:Puppeteer的Page实例,提供浏览器操作APIenqueueLinks
:用于发现并添加新链接到队列log
:日志记录工具
-
数据处理:
- 使用
page.title()
获取页面标题 - 通过
Dataset.pushData()
存储结果到本地JSON文件 - 调用
enqueueLinks()
自动发现页面链接并加入队列
- 使用
-
安全限制:
maxRequestsPerCrawl
限制最大请求数,防止意外抓取过多页面
进阶配置选项
除了基础配置,PuppeteerCrawler还支持多种高级选项:
-
浏览器控制:
headless: false
:显示浏览器窗口,方便调试launchOptions
:自定义Puppeteer启动参数
-
请求处理:
minConcurrency
/maxConcurrency
:控制并发请求数requestHandlerTimeoutSecs
:设置处理超时时间
-
请求过滤:
globs
/regexps
:使用模式匹配过滤请求exclude
:排除特定URL
实际应用建议
-
错误处理:
- 在requestHandler中添加try-catch块处理页面异常
- 使用
log.error()
记录错误信息
-
性能优化:
- 适当增加并发数提高抓取速度
- 禁用不必要的资源加载(CSS、图片等)
-
数据存储:
- 除了Dataset,还可以使用KeyValueStore存储文件
- 考虑定期导出数据,避免内存占用过大
总结
Apify/Crawlee的PuppeteerCrawler为开发者提供了简单而强大的工具来构建基于浏览器的爬虫。通过本文介绍的基础用法和配置选项,您可以快速上手并开发出适应各种复杂场景的爬虫程序。无论是简单的数据抓取还是复杂的交互式爬虫,PuppeteerCrawler都能提供良好的支持。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考