应用node Puppeteer爬取数据

什么是Puppeteer?

Puppeteer 是一个由 Google 开发的 Node 库,它提供了一个高级 API 来通过 DevTools 协议控制 Chrome 或 Chromium 浏览器。这使得 Puppeteer 在多种场景下都非常有用,以下是一些主要的应用场景:

应用场景

  1. 网页截图与 PDF 导出:Puppeteer 可以轻松截取网页的全尺寸截图或生成整个页面的 PDF 文件,这对于网页内容存档、创建预览图或制作电子书非常有帮助。
  2. 网页自动化测试:由于 Puppeteer 能够模拟用户操作(如点击、填写表单、导航等),它成为了进行端到端测试(E2E testing)的强大工具,可以确保网页在不同交互下的功能表现正常。
  3. 性能审计:Puppeteer 可以用来收集网页加载时间、运行 Lighthouse 审计等,帮助开发者优化网站性能。
  4. 数据抓取:虽然 Puppeteer 主要不是为网络爬虫设计的,但其强大的浏览器操控能力使其能有效抓取动态渲染的内容,即那些需要 JavaScript 执行后才能加载的数据,适用于构建复杂的数据采集脚本。
  5. 网页内容生成静态站点:结合 Puppeteer 的截图或 HTML 生成能力,可以将动态网页内容转换为静态文件,便于离线浏览或提高服务器端渲染(SSR)的效率。
  6. UI/UX 测试:可以用来自动化检查网页的视觉一致性,比如确保所有页面在不同屏幕尺寸上的布局正确,或是颜色、字体等样式符合设计规范。
  7. 登录自动化与会话管理:Puppeteer 可以处理 cookies 和本地存储,从而实现自动登录和维持用户会话状态,这对于需要身份验证后才能访问的页面内容抓取特别有用。
  8. 浏览器扩展开发和测试:Puppeteer 支持安装和管理浏览器扩展,这对于扩展的自动化测试和调试非常有帮助。

例子

拿到页面window对象的数据

Puppeteer 本身不直接提供访问页面 window 对象的方法,因为它是在 Node.js 环境下运行的,而 window 对象是浏览器环境中的全局对象。但是,Puppeteer 允许你执行页面上下文中的JavaScript代码,这样就可以间接地访问和操作 window 对象及其属性和方法了。

以下是几种获取或操作页面中 window 对象数据的方法:

1. 页面.evaluate()

使用 page.evaluate() 方法可以在页面上下文中执行任意JavaScript代码,并返回结果。这是访问 window 对象属性的最直接方式。

javascript 复制代码
const puppeteer = require('puppeteer');

(async () => {
    const browser = await puppeteer.launch();
    const page = await browser.newPage();
    
    await page.goto('http://example.com');
    
    // 访问 window 对象的属性,例如获取当前URL
    const url = await page.evaluate(() => window.location.href);
    console.log('Current URL:', url);
    
    // 或者执行更复杂的操作,比如调用 window 上的函数
    const userAgent = await page.evaluate(() => window.navigator.userAgent);
    console.log('User Agent:', userAgent);
    
    await browser.close();
})();

2. 页面.content()

如果你需要获取整个页面的HTML内容,包括内联JavaScript定义的变量和函数,可以使用 page.content(),但这通常不用于直接访问 window 对象的数据,因为这会返回原始HTML字符串而不是执行环境。

3. 页面.addScriptTag()

如果你想在页面上注入脚本并访问 window 对象,可以使用 page.addScriptTag() 方法添加一个包含你想要执行的脚本的 <script> 标签。这个脚本可以直接操作 window 对象。

注意事项

  • 当使用 page.evaluate() 时,传递给它的函数及其返回值必须是可序列化的(即能够转换为 JSON 的数据类型),因为它们需要通过 JSON.stringify()JSON.parse() 在Node.js和浏览器上下文之间传递。
  • 避免在 page.evaluate() 中进行大量的数据处理,因为这会增加序列化和反序列化的开销,对于大数据量的操作,考虑在页面上执行数据处理逻辑,仅返回处理后的结果。

实现模拟点击

使用Puppeteer模拟用户点击一个网页上的特定元素,比如点赞按钮,首先需要启动浏览器、导航到目标页面,然后定位到该元素并触发点击事件。以下是一个基本的示例代码,展示了如何实现这一过程:

javascript 复制代码
const puppeteer = require('puppeteer');

(async () => {
  // 启动浏览器
  const browser = await puppeteer.launch({ headless: false }); // 设置headless为false可以让浏览器可视化,便于观察操作过程

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

    // 导航到目标网址
    await page.goto('https://juejin.cn/post/7342432361097576498', { waitUntil: 'networkidle2' });

    // 等待点赞按钮出现并点击
    // 注意:由于网页的动态加载和元素的加载时间,可能需要适当调整等待时间或使用更精确的选择器
    await page.waitForSelector('.panel-btn.with-badge', { visible: true });
    await page.click('.panel-btn.with-badge');

    console.log('点赞成功');
  } catch (error) {
    console.error('发生错误:', error);
  } finally {
    // 关闭浏览器
    await browser.close();
  }
})();

参考文章:

破解滑块验证码

blog.csdn.net/KlausLily/a...

juejin.cn/post/733941...

相关推荐
全栈开发圈3 小时前
新书速览|Java网络爬虫精解与实践
java·开发语言·爬虫
小白学大数据3 小时前
JavaScript重定向对网络爬虫的影响及处理
开发语言·javascript·数据库·爬虫
ac-er88884 小时前
PHP网络爬虫常见的反爬策略
开发语言·爬虫·php
聪明的墨菲特i7 小时前
Python爬虫学习
爬虫·python·学习
oliveira-time9 小时前
爬虫学习6
爬虫
xiaoxiongip66614 小时前
HTTP 和 HTTPS
网络·爬虫·网络协议·tcp/ip·http·https·ip
兆。16 小时前
掌握 PyQt5:从零开始的桌面应用开发
开发语言·爬虫·python·qt
API快乐传递者1 天前
淘宝反爬虫机制的主要手段有哪些?
爬虫·python
兜里有糖请分享1 天前
Python中序列化/反序列化JSON格式的数据
爬虫·python
亿牛云爬虫专家2 天前
用Puppeteer点击与数据爬取:实现动态网页交互
javascript·爬虫·爬虫代理·puppeteer·数据·代理ip·16yun