使用Crawlee可破题js渲染采集数据

news2025/2/28 12:48:43

使用 Crawlee 实现自动化爬虫流程

在这里插入图片描述

1. Crawlee 简介

Crawlee 是一个强大的爬虫框架,用于快速构建和维护可靠的爬虫。它支持多种爬虫类型,包括基于 Cheerio 和 Playwright 的爬虫,能够高效处理静态和动态网页。

2. 项目目标

通过自动化脚本实现两个主要任务:

  1. 采集目标网站的所有链接。
  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.jscollect_data.js 按顺序同步执行。当 collect_links.js 完成后,自动触发 collect_data.js

9. 运行项目

在项目根目录下运行以下命令启动整个流程:

node main.js

10. 优点

  • 自动化流程:整个采集流程完全自动化,无需手动干预。
  • 解耦设计:采集链接和采集数据的逻辑完全分离,便于维护和扩展。
  • 实时响应:通过主控制脚本,确保在链接文件更新后立即启动数据采集。

11.文档地址

https://crawlee.dev

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2307388.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Fiddler在Windows下抓包Https

文章目录 1.Fiddler Classic 配置2.配置浏览器代理自动代理手动配置浏览器代理 3.抓取移动端 HTTPS 流量(可选)解决抓取 HTTPS 失败问题1.Fiddler证书过期了 默认情况下,Fiddler 无法直接解密 HTTPS 流量。需要开启 HTTPS 解密: 1…

Java语法基础知识点1

目录 一、数组 1.1数组的初始化: 1.2数组的遍历方法: 1.3数组的常见使用方法: 二、类和对象 2.1构造方法: 2.2this关键字: 三、封装 3.1访问限定符: 3.2static关键字: 3.3代码块: 一…

【新手入门】SQL注入之盲注

一、引言 在我们的注入语句被带入数据库查询但却什么都没有返回的情况我们该怎么办? 例如应用程序返回到一个"通用的"的页面,或者重定向一个通用页面(可能为网站首页)。这时,我们之前学习的SQL注入的办法就无法使用了。这种情况我们称之为无…

python-leetcode-分割等和子集

416. 分割等和子集 - 力扣(LeetCode) class Solution:def canPartition(self, nums: List[int]) -> bool:total sum(nums)if total % 2 ! 0:return Falsetarget total // 2dp [False] * (target 1)dp[0] Truefor num in nums:for j in range(tar…

趣讲TCP三次握手

一、TCP三次握手简介 TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。在TCP连接中,只有两方进行通信,它使用校验和、确认和重传机制来保证数据的可靠传输。…

基于coze+微信小程序实现图片上传并利用大模型解析

项目截图&#xff1a; 实现代码&#xff08;直接搬去可用&#xff09; 前提&#xff1a;需要填写你的oss配置coze的api授权配置&#xff01;&#xff01;&#xff01; <template><view class"container"><!-- 高斯模糊背景 --><view class&qu…

VMware Fusion 虚拟机Mac版 安装CentOS 7 系统

介绍 CentOS是Community Enterprise Operating System的缩写&#xff0c;也叫做社区企业操作系统。是企业Linux发行版领头羊Red Hat Enterprise Linux的再编译版本&#xff08;是一个再发行版本&#xff09;&#xff0c;而且在RHEL的基础上修正了不少已知的 Bug &#xff0c;相…

java练习(44)

ps:题目来自力扣 两两交换链表中的节点 给你一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题&#xff08;即&#xff0c;只能进行节点交换&#xff09;。 // 定义链表节点类&#xff0c;每个节…

Deepseek 开源周第一天:FlashMLA

Deepseek 隆重开启开源周!第一天我们迎来了FlashMLA。我很高兴带大家了解这项创新,揭秘 FlashMLA 为何能成为 AI 和 GPU 优化领域的变革者。 Deepseek 开源周的热门话题有哪些?

DeepSeek-OpenSourceWeek-第三天-Release of DeepGEMM

DeepGEMM:这是一款专为高效的 FP8(8 位浮点)通用矩阵乘法(GEMMs)而开发的尖端库。GEMMs 是许多 AI 工作负载(尤其是深度学习)中的基本操作。 特点: 支持稠密和 MoE GEMMs:它可以处理标准的稠密矩阵乘法以及混合专家(MoE)模型中使用的矩阵乘法。MoE 是一种神经网络架…

Bitlocker取证之PXE降级取密钥

支持到微软Surface pro系列。

.Net Core Visual Studio NuGet.Config 配置参考

Visual Studio 2022 NUGET NU1301 无法加载源 基础连接已关闭&#xff1a;无法建立SSL / TLS安全通道的信任关系&#xff1b;根据验证过程&#xff0c;远程证书无效&#xff0c;参考文章&#xff1a;https://blog.csdn.net/hefeng_aspnet/article/details/145780081 NuGet 行为…

Immich自托管服务的本地化部署与随时随地安全便捷在线访问数据

文章目录 前言1.关于Immich2.安装Docker3.本地部署Immich4.Immich体验5.安装cpolar内网穿透6.创建远程链接公网地址7.使用固定公网地址远程访问 前言 小伙伴们&#xff0c;你们好呀&#xff01;今天要给大家揭秘一个超炫的技能——如何把自家电脑变成私人云相册&#xff0c;并…

Apache-iotdb 基本概念

问题背景 定义&#xff08;写得太好了&#xff01;&#xff09; root 是整个树状结构的父节点&#xff0c; CirroData-TimeS 有存储组、设备、测点等概念&#xff0c;数据在存储的时候&#xff0c;不同的存储组的数据是存储在不同的文件夹中的。上图中有 root.sgcc、root.ln两…

CryptoJS库中WordArray对象支持哪些输出格式?除了toString() 方法还有什么方法可以输出吗?WordArray对象的作用是什么?

前言&#xff1a;这里只说js用的CryptoJS库里的相关内容&#xff0c;只用js来进行代码操作和讲解。 这里网上相关的帖子很少&#xff0c;不得已问了很长时间AI 想引用CryptoJS库情况分两种&#xff0c;一种是html引用&#xff0c;另一种是在Nodejs里引用。 一、引用CryptoJS库…

springboot浅析

springboot浅析 什么是springboot&#xff1f; 实际上springboot就是一个给我们提供了快速搭建使用spring的一种方式&#xff0c;让我们省去了繁琐的xml配置。 为什么无需进行大量的xml配置&#xff0c;就是因为springboot是基于约定优于配置的思想&#xff0c;简单来说就是遵循…

【文件基础操作】小笔记

Step1: 现在项目文件夹&#xff08;我的项目叫做RunPony&#xff09;下创建一个a.txt文本文件&#xff0c;手动写入一些数字&#xff0c;保存 Step2: 现在在main.c内写一个基本的文件处理的程序 Step3: 现在已经知道如何打开关闭文件&#xff0c;下一步要搞懂如何读取txt内的…

SSL 证书是 SSL 协议实现安全通信的必要组成部分

SSL证书和SSL/TLS协议有着密切的关系&#xff0c;但它们本质上是不同的概念。下面是两者的区别和它们之间的关系的表格&#xff1a; 属性SSL/TLS 协议SSL证书英文全称SSL&#xff08;Secure Sockets Layer&#xff09;&#xff0c;TLS&#xff08;Transport Layer Security&am…

AI问答-供应链管理:排队模型M/D/5/100/m/FCFS代表的含义是什么

在供应链管理中&#xff0c;排队模型M/D/5/100/m/FCFS代表的含义如下&#xff1a; M&#xff1a; 表示顾客到达时间间隔服从负指数分布&#xff08;Markov&#xff0c;负指数分布具有无记忆性&#xff09;&#xff0c;即顾客到达是随机的&#xff0c;且到达时间间隔服从指数分…

Linux驱动学习(四)--字符设备注册

上一节讲到的字符设备注册与销毁是通过cdev_init、cdev_add、cdev_del等函数分步执行的&#xff0c;本小节用一种更简单的方式&#xff0c;来注册字符设备 register_chrdev 如果major为0&#xff0c;该函数将动态的分配一个主设备号并且返回对应的值如果major > 0&#xff…