基于JavaScript、puppeteer的爬虫

前期准备:

npm puppeteer

import puppeteer from 'puppeteer';

puppeteer文档

第一步:启动浏览器,跳转到需要爬取的页面

const browser = await puppeteer.launch({ headless: false });
    const page = await browser.newPage();

    await page.goto(url, { waitUntil: 'networkidle2' });

第二步:打开需要爬取的网页,按“F12”查看前端的dom,查看我们想获取的文本信息的父级类名,例如:

第三步,通常列表页面都有下拉刷新,我们需要写一个脚本让页面下拉刷新

我要爬取的页面下拉到一定的地步后会有一个“加载更多”按钮,需要点击,直到页面无法滚动,且没有加载更多按钮的时候停止,脚本参考如下:

 // 定义滚动函数
  const scrollPage = async () => {
    const distance = 100000; // 每次滚动的距离
    const delay = 2000; // 每次滚动后的延迟
    let previousHeight = await page.evaluate('document.body.scrollHeight');

    while (true) {
        await page.evaluate(`window.scrollBy(0, ${distance})`);
        await new Promise(resolve => setTimeout(resolve, delay));

        const newHeight = await page.evaluate('document.body.scrollHeight');
        if (newHeight === previousHeight) {
            const loadMoreButton = await page.$('.类名1.类名2');//锁定“加载更多按钮”
                if (loadMoreButton) {
                    await loadMoreButton.click();
                    console.log('点击加载更多结果按钮');
                    await new Promise(resolve => setTimeout(resolve, delay)); // 等待加载更多内容
                } else {
                    console.log('已滚动到底部,没有更多内容加载');
                    break;
                }
        }
        
        previousHeight = newHeight;
    }
};

await scrollPage();

第四步,封装成对象并打印

第三步的脚本让我们把页面加载到拥有全部数据的状态,现在需要将第二步收集的类名里的文本封装成数组

await page.waitForSelector('.卡片父级类名', { timeout: 60000 });//卡片最外层
const info= await page.evaluate(() => {
    const cardElements = document.querySelectorAll('.卡片父级类名');//获取所有卡片
    const arr= [];
    cardElements.forEach(hotel => {
        const nameElement = hotel.querySelector('[需要的元素1的属性]');
        const priceElement = hotel.querySelector('[需要的元素2的属性]');
        const name = nameElement ? nameElement.innerText.trim() : null;
        const price = priceElement ? priceElement.innerText.trim() : null;
        if (name || price) {
            arr.push({ name, price });
        }
    });
    return arr;
});

console.log(JSON.stringify(info, null, 2))

// 完事关闭浏览器
await browser.close();

运行

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ssm高校宿舍用电管理系统-计算机毕业设计源码97859

摘要 随着高校规模的扩大和学生数量的增加,高校宿舍的用电需求也日益庞大。为了提高用电效率、节约能源、确保用电安全和方便管理,开发一个高校宿舍用电管理系统具有重要意义。本系统将采用Java作为后端开发语言,具备跨平台特性,能…

收银系统源码-营销活动-幸运抽奖

1. 功能描述 营运抽奖:智慧新零售收银系统,线上商城营销插件,商户/门店在小程序商城上设置抽奖活动,中奖人员可内定; 2.适用场景 新店开业、门店周年庆、节假日等特定时间促销;会员拉新,需会…

k8s-第四节-Service

Service Service 通过 label 关联对应的 PodServcie 生命周期不跟 Pod 绑定,不会因为 Pod 重创改变 IP提供了负载均衡功能,自动转发流量到不同 Pod可对集群外部提供访问端口集群内部可通过服务名字访问 创建 Service kubectl apply -f service.yamlkub…

多个comfyui之间如何共享模型,节省存储空间

COMFYUI 模型共享插件教程 一、COMFYUI 模型共享插件教程1.1 插件特性1.2 插件介绍1.3 链接 二、详细配置步骤2.1 开启开发者选项2.2 放置插件文件2.3 放置配置文件2.4 编辑配置文件2.4.1 其他配置项 三、启动COMFYUI并验证3.1 启动COMFYUI3.2 验证模型共享3.3 多整合包共享配置…

C++11|完美转化 新的类功能 可变参数模板

目录 一、完美转发 1.1模板中的&&万能引用 1.2完美转发 1.3完美转发实际中的引用场景 二、新的类功能 2.1移动构造和移动赋值规则详解 2.2类成员变量初始化和强制生成默认函数(default) 2.3禁止生成默认函数的关键字(delete) 三、可变参数模板 3.1递归函数方式…

TCP和IP数据包结构

一、问题引入 一般我们在谈上网速度的时候,专业上用带宽来描述,其实无论说网速或者带宽都是不准确的,呵呵。比如:1兆,512K……有些在学校的学生,也许会有疑问,明明我的业务是1M,为…

某yi逆向sign值

1. 定位 url: aHR0cHM6Ly93d3cuaXFpeWkuY29tL3ZfMTlycjRyZ3AxZy5odG1s打开网址,找到sign值所在位置 应该是32位大写md5加密,可以看到console中加载出来很多东西,往下翻到base_info所在位置 点进去main.js,打上断点 2. 调试 刷…

项目基础知识

1.JDBC编程和MySQL数据库 数据库的连接(以前写qq项目时的代码) package com.wu.Util; import java.sql.*; public class JDBCUtil {private static JDBCUtil jdbcUtil null;private JDBCUtil() {}public static JDBCUtil getJdbcUtil() {if (jdbcUtil…

基于Echarts进行图表组件的封装

什么是Echarts 是一个使用js实现的开源可视库,提供了多种图表,但是当我们在项目中进行使用的时候可能就是需要进行一系列的相关配置如: 标题,类型,x轴,y轴等,当我们使用较为频繁的时候就容易导…

昇思25天学习打卡营第16天 | DCGAN生成漫画头像

这两天把minspore配置到我的电脑上了,然后运行就没什么问题了✨😊 今天学这个DCGAN生成漫画头像,我超级感兴趣的嘞🦄🥰 GAN基础原理 这部分原理介绍参考GAN图像生成。 DCGAN原理 DCGAN(深度卷积对抗生成…

一本超简单能用Python实现办公自动化的神书!让我轻松摆脱办公烦恼!

《超简单:用Python让Excel飞起来》 这本书旨在通过Python与Excel的“强强联手”,为办公人员提供一套高效的数据处理方案。书中还介绍了如何在Excel中调用Python代码,进一步拓宽了办公自动化的应用范围。 全书共9章。第1~3章主要讲解Python编…

【数据结构】06.栈队列

一、栈 1.1栈的概念及结构 栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。 压栈&#…

JAVA 对象存储OSS工具类(腾讯云)

对象存储OSS工具类 import com.qcloud.cos.COSClient; import com.qcloud.cos.ClientConfig; import com.qcloud.cos.auth.BasicCOSCredentials; import com.qcloud.cos.auth.COSCredentials; import com.qcloud.cos.model.ObjectMetadata; import com.qcloud.cos.model.PutObj…

洗地机品牌哪个最好用?硬核推荐五大实力爆款洗地机

在这个忙碌的时代,家就是我们放松的港湾,但要保持它的清洁与舒适常常很不容易。每天拖着疲惫的身体回家,还要面对地板上那些难缠的灰尘、污渍,真是非常让人头疼。不过,洗地机的出现就像是给家务清洁装上了智能引擎&…

idea中maven全局配置

配置了就不需要每次创建项目都来设置maven仓库了。 1.先把项目全关了 2. 进入全局设置 3.设置maven的仓库就可以了

一篇文章带你完全理解C语言数组

文章目录 1.一维数组的创建和初始化数组的创建1.2数组的初始化1.3 一维数组的使用1.4一维数组在内存中的存储 2.二维数组的创建和初始化2.1二维数组的创建2.2 二维数组的初始化2.3 二维数组的使用2.4 二维数组在内存中的存储 3.数组越界4.数组作为函数参数4.1 冒泡排序函数的错…

从零开始开发美颜SDK:打造属于平台的主播美颜工具

本篇文章,小编将从零开始,介绍如何打造一款属于平台的主播美颜工具。 一、需求分析 首先,明确开发美颜SDK的需求是至关重要的。当前市场上,美颜工具的功能主要包括: 1.实时美颜:磨皮、美白、瘦脸等基础功…

Static关键字的用法详解

Static关键字的用法详解 1、Static修饰内部类2、Static修饰方法3、Static修饰变量4、Static修饰代码块5、总结 💖The Begin💖点点关注,收藏不迷路💖 在Java编程语言中,static是一个关键字,它可以用于多种上…

项目机会:4万平:智能仓,AGV,穿梭车,AMR,WMS,提升机,机器人……

导语 大家好,我是社长,老K。专注分享智能制造和智能仓储物流等内容。 如下为近期国内智能仓储物流相关项目的公开信息线索,这些项目具体信息会发布到知识星球,请感兴趣的球友先人一步到知识星球【智能仓储物流技术研习社】自行下载…

时钟系统框图(时钟树)解析

时钟系统框图(时钟树)解析 文章目录 时钟系统框图(时钟树)解析1、时钟树2、 4个时钟源:$HSI、HSE、LSI、LSE$3、PLL锁相环倍频输出4、系统时钟的来源5、Enable CSS(时钟监视系统)6、几个重要的时…