• puppeteer


    介绍

    puppeteer是一个可以控制chrome的库,可以模拟一些交互行为,以及进行前端自动化测试。

    启动方法

    启动浏览器,然后打开一个页面,之后跳转到一个网址打开页面

    // Launch the browser
      const browser = await puppeteer.launch({ headless: "new" });
    
      // Create a page
      const page = await browser.newPage();
    
      // Go to your site
      await page.goto("https://www.baidu.com");
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    功能一、爬虫

    优势

    1. 与普通爬虫相比它更简单,因为它用的是真实的chrome环境,不需要我们配置各种header的参数
    2. 它能等待js动态生成的内容之后进行爬虫
    3. 他能能够截图并保存为图片

    如何实现

    获取网页元素
    这里用waitForSelector用选择器进行爬取,这边都是异步的函数,这也是puppeteer的优势,它可以等待一些动态变化之后再爬取

    // Query for an element handle.
      const element = await page.waitForSelector("span.title-content-title");
    
      // Get the text content of the element
      const textContent = await page.evaluate(
        (element) => element.textContent,
        element
      );
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    截图
    保存图片用screenshot方法,保存pdf用pdf方法(而且pdf是带链接的)

    await page.screenshot({
        path: "1.png",
        fullPage: true,
      });
      await page.pdf({
        path: "1.pdf",
        fullPage: true,
      });
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    爬虫小demo

    let puppeteer = require("puppeteer");
    
    (async () => {
      // Launch the browser
      const browser = await puppeteer.launch({ headless: "new" });
    
      // Create a page
      const page = await browser.newPage();
    
      // Go to your site
      await page.goto("https://www.baidu.com");
    
      // Query for an element handle.
      const element = await page.waitForSelector("span.title-content-title");
    
      // Get the text content of the element
      const textContent = await page.evaluate(
        (element) => element.textContent,
        element
      );
    
      console.log(textContent);
    
      // Dispose of handle
      await element.dispose();
    
      // Close browser.
      await browser.close();
    })();
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    功能二、执行脚本

    上面爬虫的那个evaluate方法就是执行脚本的方法,执行脚本之后可以返回一个值作为结果。

      const result = await page.evaluate(() => {
        // 在此处编写要执行的脚本
        return xxx;
      });
    
    • 1
    • 2
    • 3
    • 4

    百度搜索脚本demo

      // 执行脚本
      const result = await page.evaluate(() => {
        // 在此处编写要执行的脚本
        let input = document.querySelector("input#kw");
        input.value = "nodejs教学";
        let search = document.querySelector("input#su");
        search.click();
        return "已搜索";
      });
    
      console.log(result); // 输出脚本执行结果
      // 等待两秒等待页面加载完成
      await page.waitForTimeout(2000);
      await page.screenshot({
        path: "nodejs.png",
        fullPage: true,
      });
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    结果生成的图片
    在这里插入图片描述

    功能三、获取cookie(这个只能是模拟浏览器当前进入网页的cookie不是平时用的下载的的浏览器的cookie)

    let cookie = await page.cookies();
    
    • 1

    功能四、监控网页,进行性能分析

      // 跟踪
      // 启动跟踪
      await page.tracing.start({ path: "trace.json" });
      。。。。。。
      // 停止跟踪
      await page.tracing.stop();
    
      // 导出跟踪结果
      const tracingData = await page.tracing.export();
    
      // 保存跟踪结果为JSON文件
      require('fs').writeFileSync('trace.json', tracingData);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    这里生成的json文件可以通过浏览器的F12里的性能里上传按钮上传,之后就能看到可视化的性能分析,结果图如下
    在这里插入图片描述

  • 相关阅读:
    dotnet core 也能协调分布式事务啦!
    插件化原理
    MySql面试
    Maven的安装与配置(详细版)
    ChatGPT AutoExpert:通过自定义指令,增强 GPT-4 和 GPT-3.5-Turbo 对话模型的功能
    一文快速回顾 Session 和 Cookie
    超图聚类论文阅读1:Kumar算法
    【C++】:类和对象(中)之类的默认成员函数——构造函数and析构函数
    【阿里云】图像识别 摄像模块 语音模块
    js设计模式:组合模式
  • 原文地址:https://blog.csdn.net/ArmadaDK/article/details/133793907