使用 Crawlee 实现自动化爬虫流程
1. Crawlee 简介
Crawlee 是一个强大的爬虫框架,用于快速构建和维护可靠的爬虫。它支持多种爬虫类型,包括基于 Cheerio 和 Playwright 的爬虫,能够高效处理静态和动态网页。
2. 项目目标
通过自动化脚本实现两个主要任务:
- 采集目标网站的所有链接。
- 从采集到的链接中提取页面数据。
3. 文件结构
项目包含以下文件:
collect_links.js
:采集目标网站的所有链接并保存到 JSON 文件。collect_data.js
:从 JSON 文件读取链接并采集页面数据。main.js
:主控制脚本,协调两个文件的同步执行。collected_links.json
:存储采集到的链接。collected_data.json
:存储采集到的页面数据。
4. 安装依赖
在项目根目录下运行以下命令安装所需依赖:
npm install crawlee
5. 示例 1:采集链接
collect_links.js
脚本负责从目标网站采集所有链接,并将结果保存到 collected_links.json
文件中。
const { CheerioCrawler, Dataset } = require('crawlee');
const startUrls = ['https://example.com']; // 替换为目标网站的起始页面
const crawler = new CheerioCrawler({
async requestHandler({ request, $ }) {
const links = $('a').map((i, el) => $(el).attr('href')).get();
const validLinks = links.filter((link) => link && link.startsWith('http'));
await Dataset.pushData({ url: request.loadedUrl, links: validLinks });
await crawler.addRequests(validLinks.map((link) => ({ url: link })));
}
});
(async () => {
await crawler.run(startUrls);
await Dataset.exportData({ path: './collected_links.json', format: 'json' });
console.log('所有链接已保存到 collected_links.json 文件中');
})();
6. 示例 2:采集数据
collect_data.js
脚本从 collected_links.json
文件中读取链接,并采集每个页面的标题和内容,最终将数据保存到 collected_data.json
文件中。
const fs = require('fs');
const { CheerioCrawler, Dataset } = require('crawlee');
(async () => {
const links = JSON.parse(fs.readFileSync('./collected_links.json', 'utf-8'));
const allLinks = links.flatMap((entry) => entry.links);
const crawler = new CheerioCrawler({
async requestHandler({ request, $ }) {
const title = $('title').text();
const content = $.html();
await Dataset.pushData({ url: request.loadedUrl, title, content });
console.log(`已采集页面:${request.loadedUrl}`);
}
});
await crawler.addRequests(allLinks.map((url) => ({ url })));
await crawler.run();
await Dataset.exportData({ path: './collected_data.json', format: 'json' });
console.log('采集完成,数据已保存到 collected_data.json 文件中');
})();
7. 主控制脚本:main.js
主控制脚本负责协调两个文件的同步执行,确保采集链接和采集数据的任务能够连续运行。
const { exec } = require('child_process');
const fs = require('fs');
const path = './collected_links.json';
// 运行采集链接的脚本
function runCollectLinks() {
console.log('开始采集链接...');
exec('node collect_links.js', (err, stdout, stderr) => {
if (err) {
console.error('采集链接时出错:', err);
return;
}
console.log('采集链接完成:', stdout);
console.log('开始采集数据...');
runCollectData();
});
}
// 运行采集数据的脚本
function runCollectData() {
exec('node collect_data.js', (err, stdout, stderr) => {
if (err) {
console.error('采集数据时出错:', err);
return;
}
console.log('采集数据完成:', stdout);
});
}
// 启动整个流程
runCollectLinks();
8. 同步执行任务
通过 main.js
脚本,确保 collect_links.js
和 collect_data.js
按顺序同步执行。当 collect_links.js
完成后,自动触发 collect_data.js
。
9. 运行项目
在项目根目录下运行以下命令启动整个流程:
node main.js
10. 优点
- 自动化流程:整个采集流程完全自动化,无需手动干预。
- 解耦设计:采集链接和采集数据的逻辑完全分离,便于维护和扩展。
- 实时响应:通过主控制脚本,确保在链接文件更新后立即启动数据采集。
11.文档地址
https://crawlee.dev