Puppeteer入门实践

news2024/11/25 2:40:52

环境

1、安装nodejs
官网:https://nodejs.org/zh-cn
下载安装好nodejs只后
验证:node -v 出现版本号表示安装成功,否则需要配置环境变量
在这里插入图片描述
2、创建node项目并初始化
随便新建一个文件夹
在这里插入图片描述
进入文件夹搜索cmd回车
在这里插入图片描述执行npm init -y
在这里插入图片描述

安装依赖

使用vscode或webStorm打开项目,我这里使用WebStorm进行演示安装puppeteer依赖npm install puppeteer
在这里插入图片描述

随便新建一个test.js
中文文档:https://puppeteer.bootcss.com/
粘贴文档中的例子看下环境是否有问题

const puppeteer = require('puppeteer');

(async () => {
    const browser = await puppeteer.launch();
    const page = await browser.newPage();
    await page.goto('https://example.com');
    await page.screenshot({path: 'example.png'});

    await browser.close();
})();

运行node ./test.js,成功截图
在这里插入图片描述

选择器

浏览器:谷歌浏览器
本次实践抓取B站热播榜top100的电影信息https://www.bilibili.com/movie/?spm_id_from=333.1007.0.0
在这里插入图片描述点击进入top100,进来后的url : https://www.bilibili.com/v/popular/rank/movie/?from_spmid=666.7.hotlist.more
在这里插入图片描述
右击排行第一的影片,点击检查
在这里插入图片描述
可以看到右边的代码和左边的界面上阴影部分是对应的
在这里插入图片描述我们需要找到一块区域包含所有top100的元素标签
在这里插入图片描述右键元素 -> 复制 -> 复制选择器
在这里插入图片描述
打开控制台
在这里插入图片描述在控制台输入$$('粘贴前面复制的选择器'),在这里输入$$('#app > div > div.rank-container > div.rank-list-wrap')回车
在这里插入图片描述OK,现在拿到了div,这个标签下面包含了top100,接下来我们需要层层递进。

观察元素可以发现,div下面的ul是top100,ul下面的li是每一个影片

在这里插入图片描述在控制台递进到li,使用>表示递进
可以看到我们在原先的选择器后面加上> ul > li就递进到了每个top,现在top100拿到了,接下来获取top里面的数据了
在这里插入图片描述随便点开一个li看一下我们需要的信息在哪个属性里面
在这里插入图片描述可以看到视频播放链接在innerHTML,标题、播放量和点赞量在innerText
在这里插入图片描述在控制台打印innerText看看效果$$('#app > div > div.rank-container > div.rank-list-wrap > ul > li').forEach(e => {console.log(e.innerText)})

在这里插入图片描述

Puppeteer通过选择器获取top100数据

test.js代码

const puppeteer = require('puppeteer');

(async () => {
    const browser = await puppeteer.launch({
        headless: false, // 以非无头模式启动浏览器,可见浏览器窗口
        slowMo: 100 // 添加延迟,减慢操作速度(用于观察和调试)
    });

    const page = await browser.newPage(); // 创建一个新的页面对象

    await page.goto('https://www.bilibili.com/v/popular/rank/movie/?from_spmid=666.7.hotlist.more'); // 访问指定的 URL

// 等待页面加载2秒钟
    await new Promise(resolve => setTimeout(resolve, 4000));

    let top100Combined = await page.$$eval('#app > div > div.rank-container > div.rank-list-wrap > ul > li', lis => {
        return lis.map(li => {
            return {
                innerText: li.innerText, // 获取每个<li>元素的innerText属性
                innerHTML: li.innerHTML // 获取每个<li>元素的innerHTML属性
            };
        });
    });
// 格式化数据
    let top100 = [];
    for (let top100CombinedKey in top100Combined) {
        const {innerText, innerHTML} = top100Combined[top100CombinedKey];
        // 使用正则表达式匹配电影信息
        let parts = innerText.split('\n');
        let rank = parseInt(parts[0]);
        let movieName = parts[1];
        let releaseDate = parts[2];
        let playCount = parseFloat(parts[3]);
        let likeCount = parseFloat(parts[4]);
        // 构造电影对象
        let top = {
            rank,
            movieName,
            releaseDate,
            playCount,
            likeCount,
        };
        // 正则表达式匹配视频播放链接
        let regexLink = /<a href="(\/\/www\.bilibili\.com\/bangumi\/play\/[^"]+)"/;
        let matchesLink = innerHTML.match(regexLink);
        if (matchesLink && matchesLink.length === 2) {
            let videoUrl = `https:${matchesLink[1]}`;
            top.videoUrl = videoUrl;
        } else {
            console.log("无法提取视频播放链接");
        }
        top100.push(top)
    }

    console.log(top100);

    await browser.close(); // 关闭浏览器实例

})()


运行脚本

运行此脚本
node ./test.js

在这里插入图片描述浏览器页面,可以看到数据全都抓到了
在这里插入图片描述

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

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

相关文章

RabbitMq--- 惰性队列

前言 消息堆积是Mq消费时常见的问题&#xff0c;这里我们展开说一下消息堆积的原因&#xff0c;以及RabbitMq 中是如何解决这个问题的。 1. 消息堆积问题 当生产者发送消息时的速度超过了消费者处理消息的速度&#xff0c;就会导致队列中的消息堆积&#xff0c;直到队列存储…

【Linux】shell脚本—正则表达式

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、正则表达式概述二、基本的正则表达式三、操作演示 一、正则表达式概述 正则表达式是对字符串操作的一种逻辑公式&#xff0c;就是用事先定义好的一些特定字符、…

WIN11+CLion+CMake+MINGW+OPENCV编译需注意问题

安装编译教程可参考以下链接&#xff1a; CLion OpenCV cmake&#xff0c;源码编译及使用_clion编译opencv_拜阳的博客-CSDN博客 使用CLion开发openCV——环境搭建全记录_-Willing-的博客-CSDN博客 此文主要是记录自己在编译过程中遇到的问题和解决方法 1、版本问题 C…

Windows 10 主机上的 VMware Workstation 和设备/凭据防护不兼容“错误

Windows 10 主机上的 VMware Workstation 和设备/凭据防护不兼容“错误 VMware Workstation 和 Device/Credential Guard 不兼容。VMware 工作站可以在禁用设备/凭据防护后运行。 排查错误的过程&#xff1a; 要解决错误&#xff0c;请按照以下步骤操作&#xff1a; 如果您…

LDR6020 【USB_C显示器方案】台式显示器方案介绍

首先介绍一下什么是Type-c接口&#xff1f; 现在显示器上常见的有这几种接口&#xff1a;HDMI、DP、USB-A、USB-C&#xff08;USB Type-c接口&#xff09;、3.5mm和电源接口&#xff0c;像之前流行的VGA接口和DVI接口&#xff0c;基本上在新显示器上&#xff0c;尤其是中高端显…

什么是频谱型温振变送器(附常见振动故障特征)

在机械振动方面&#xff0c;振动分析是一项十分重要的技术。这项技术是预测维修程序中的基础&#xff0c;是机器状态的指示器&#xff0c;为了避免机械设备异常振动所带来的损失&#xff0c;对工业机械设备做振动分析是非常有必要的&#xff01; 频谱型温振变送器是一款选用了M…

阿里高级工程师对C语言预处理指令的理解

目录 预处理器指令列表 预处理器指令的流程 四种主要类型的预处理器指令 结论 我们可以将预处理器视为一个编译过程&#xff0c;该过程在开发人员运行程序时运行。它是使用 c/c 语言执行程序的预处理。若要初始化预处理器命令的进程&#xff0c;必须使用哈希符号 &#xf…

【Devops运维】Docker搭建jenkins自动化编译hadoop/spark/flink/hive/kyuubi/trino大数据组件

Docker搭建jenkins DevOps概念Docker部署Jenkins制作Jenkins镜像Dockerfile及所依赖的脚本build镜像 利用docker-compose部署jenkins 配置Jenkins管理员密码插件安装系统配置全局工具配置MAVEN 配置JDK 配置GIT 配置MAVEN 配置 Jenkins Maven Git 自动化编译找到token生成界面…

ChatGPT:使用OpenAI创建自己的AI网站,使用 flask web框架快速搭建网站主体

使用OpenAI创建自己的AI网站 如果你还是一个OpenAI的小白&#xff0c;有OpenAI的账号&#xff0c;但想调用OpenAI的API搞一些有意思的事&#xff0c;那么这一系列的教程将仔细的为你讲解如何使用OpenAI的API制作属于自己的AI网站。 使用 flask web框架快速搭建网站主体 之前…

C++:布隆过滤器和哈希切分

目录 一. 什么是布隆过滤器 二. 布隆过滤器的实现 2.1 数据插入函数set 2.2 判断数据是否存在函数test 2.3 布隆过滤器数据的删除 三. 哈希切分 一. 什么是布隆过滤器 在我之前的博客C&#xff1a;使用位图处理海量数据_【Shine】光芒的博客-CSDN博客中&#xff0c;介绍了…

【LinuxShell】linux防火墙之firewalld防火墙

文章目录 前言一、firewalld概述1. 概念2. firewalld和iptables的关系 二、firewalld网络区域1. firewalld区域的概念2. firewalld预定义区域3. firewalld数据包的处理3.1 firewalld数据处理流程3.2 firewalld检查数据包的源地址的规则3.3 总结 三、firewalld防火墙的配置方法1…

“GPT+医疗健康”:给予医疗领域新机遇

现如今&#xff0c;GPT十分火热。随着人们对健康医疗的关注越来越热切&#xff0c;GPT已逐渐成为健康医疗领域的重要角色之一。GPT可以用于许多医疗语境中&#xff0c;如医学咨询、病症诊断、健康建议、在线问诊、患者教育、健康数据跟踪等。 GPT是一种基于深度学习的自然语言处…

结构体-C语言

&#x1f929;本文作者&#xff1a;大家好&#xff0c;我是paper jie&#xff0c;感谢你阅读本文&#xff0c;欢迎一建三连哦。 &#x1f970;内容专栏&#xff1a;这里是《C知识系统分享》专栏&#xff0c;笔者用重金(时间和精力)打造&#xff0c;基础知识一网打尽&#xff0c…

【Python办公自动化】python实现将图片插入到word中指定位置并将word转换为图片

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化 &#x1f449;专__注&#x1f448;&#xff1a;专注主流机器人、人工智能等相关领域的开发、…

垃圾站养殖场除臭杀菌解决方案

养殖场和垃圾站都会产生大量的有机废气和垃圾&#xff0c;这些废气和垃圾会产生难闻的臭味&#xff0c;影响周围环境和居民健康。这些地方又是病菌和细菌的滋生地&#xff0c;这些细菌和病菌会对人类和动物的健康造成威胁。除臭杀菌系统可以杀灭这些细菌和病菌&#xff0c;也可…

换个思维方式,你离网工天花板会更近一点

大家好&#xff0c;我是许公子。 收到老杨的邀请&#xff0c;我正式加入网络工程师俱乐部了&#xff0c;未来会给你分享更多网工硬核内容。 和老杨聊天的过程中&#xff0c;我想起了在刚入社会一两年&#xff0c;我去参加了一个高中同学聚餐。 里面有自主创业的&#xff0c;…

软件测试被00后整顿职场了?

00后带来的压力 公司一位工作3年的老油条工资还没有刚来的00后高&#xff0c;她心中不平&#xff0c;对这件事情有不小的怨气&#xff0c;她觉得自己来公司三年了&#xff0c;三年内迟到次数都不超过5次&#xff0c;每天勤勤恳恳&#xff0c;要加班的时候也愿意加班&#xff0…

Python竖版大屏 | 用pyecharts开发可视化的奇妙探索

你好&#xff01;我是马哥python说&#xff0c;一枚10年程序猿&#x1f468;&#x1f3fb;‍&#x1f4bb;&#xff0c;正在试错用pyecharts开发可视化大屏的非常规排版。 以下&#xff0c;我用8种ThemeType展示的同一个可视化数据大屏。 1、SHINE主题 2、LIGHT主题 3、MACARO…

手撕代码——任意奇数分频

手撕代码——任意奇数分频 一、奇数分频器原理与设计 在上文《手撕代码——任意偶数分频》中&#xff0c;我们编写任意偶数分频的Verilog代码&#xff0c;对时钟进行偶数分频&#xff0c;只需要用到时钟的上升沿或者下降沿即可&#xff0c;而要进行N倍奇数分频&#xff0c;需要…

修改Allure报告窗口标题,Overview的标题文案,环境配置,左上角LOGO

前言 如下图所示&#xff1a; 一、修改Allure报告窗口标题 Allure-html测试报告的窗口标题保存在&#xff1a;allure-html目录下的index.html文件 写个 set_windows_title 方法&#xff0c;并在 run.py 的执行文件去调用即可修改&#xff08; 在html报告生成后&#xff09…