puppeteer

目录

介绍

puppeteer是一个可以控制chrome的库,可以模拟一些交互行为。

启动方法

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

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

如何实现

获取网页元素

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

js 复制代码
// 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
  );

截图

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

js 复制代码
await page.screenshot({
    path: "1.png",
    fullPage: true,
  });
  await page.pdf({
    path: "1.pdf",
    fullPage: true,
  });

爬虫小demo

js 复制代码
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();
})();

功能二、执行脚本

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

js 复制代码
  const result = await page.evaluate(() => {
    // 在此处编写要执行的脚本
    return xxx;
  });

百度搜索脚本demo

js 复制代码
  // 执行脚本
  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,
  });

结果生成的图片

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

js 复制代码
let cookie = await page.cookies();

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

复制代码
  // 跟踪
  // 启动跟踪
  await page.tracing.start({ path: "trace.json" });
  。。。。。。
  // 停止跟踪
  await page.tracing.stop();

  // 导出跟踪结果
  const tracingData = await page.tracing.export();

  // 保存跟踪结果为JSON文件
  require('fs').writeFileSync('trace.json', tracingData);

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

相关推荐
稀土熊猫君11 小时前
一个人能做出什么开源项目?
vue.js·后端·开源
lizhongxuan11 小时前
Agent Runtime 中的 Code-driven Assembly
后端
货拉拉技术11 小时前
资损下降 99.96% 的背后: AI 资损防控平台实战
后端
用户83580861879111 小时前
撮合引擎 OrderBook 的 100ns 之路:无锁 RingBuffer + 伪共享消除,Go 1.22 下单 op 11ns
后端
用户8818630013611 小时前
用Node.js写一个简单的API请求日志中间件
后端
用户83580861879111 小时前
Go 高并发下的“内存刺客“:自研 Size-Class 无锁对象池,把 sync.Pool 的 P99 从 128μs 压到 41μs
后端
货拉拉技术11 小时前
资损下降 99.96% 的背后— AI 资损防控平台实战
后端
山水洛行13 小时前
AI Agent 智能体记忆:从检索到被治理的数据系统
后端
卷无止境14 小时前
C++20 的概念与约束:让模板编程终于"说人话"
后端