我的网站开发技术经验总结 我的网站开发技术经验总结
首页

fangdown

我的网站开发技术经验总结
首页
  • 认识ESM
  • chrome-talend插件,类似postman
  • sequelize 使用及技巧
  • UML工具Power Designer建表
  • sequelize相关操作文档
  • 解决抖音获取签名及并发的问题
  • 记一次解决抖音分享页混淆字体,字体图标转UID解决方案
  • 获取抖音用户作品列表信息
  • 获取抖音用户作品列表信息-进阶
  • 获取抖音用户作品列表信息-进阶3
  • 如何根据抖音号获取用户信息
  • 获取用户最新视频
  • 模块化-import和require的区别
  • eslint规范
  • js容错处理
  • js-数组分组,执行promise
  • reduce使用遇到的问题
  • 正则匹配html的元素内容
  • taro 小程序 弹窗层禁止底部滚动
  • 公众号签名问题
  • CentOS7中MariaDB重置密码
  • nginx多域名配置
  • node访问接口,得到乱码的结果,原因-Accept-Encoding
  • node写文件到json中
  • node抓取html内容
  • Node.js使用ES6语法
  • express 使用cors中间件解决跨域
  • node + express + session + redis 进行持久化缓存
  • node中读取文件夹,获取文件名称
  • pm2常用命令
  • 使用pm2管理后台node服务
  • typescript puppeteer支持window及document属性
  • node读取json文件
  • node中使用redis缓存
  • node + github的webhook完成自动部署
  • vuepress-blog的性能优化-CDN
  • CENTOS7下安装REDIS
  • promise then和catch的学习和使用
  • promise在循环中的串行并行用法
  • puppeteer常用知识
    • 客户端模拟
      • 模拟移动端
    • 页面跳转
    • 选择
    • 模拟输入
    • 等待
    • 执行脚本
      • 其他场景脚本
    • 信息查看
    • 请求劫持
    • 内容注入
    • 事件
    • 内容保存
    • 不常用函数
    • 参考
  • centos部署安装puppeteer
  • python的学习和使用
  • Taro+TypeScript - Mobx实践
  • 爬虫系列 --- 反爬机制和破解方法汇总
  • 安全-html转码
  • taro中使用animation动画
  • charles 使用
  • Mac下VSCode设置iTerm2终端样式
  • centos一步步完成站点部署
  • 云闪付做地铁的思路
  • 准备技能
  • 备案pc项目介绍
  • 备案小程序项目介绍
  • 小程序二维码扫码功能
  • 小程序域名组件开发
  • 小程序添加水印
  • 规则引擎优化
  • 记一次hooks代替redux的经历
  • 通过nodejs+koa+stream进行服务端图片代理
  • nodeJs接入log4j日志
  • nodejs+typescript项目中添加全局global属性
  • create-react-app 安装 bizcharts 项目崩溃
  • 使用MutationObserver监控dom的变化
  • 服务器重启后启动相关服务
  • moment国际化的问题
  • 项目经验
fangdown
2019-12-03
目录

puppeteer常用知识

# 客户端模拟

页面模拟设置相关函数有如下几个:

  • page.setViewport: 设置视图大小
  • page.setUserAget: 设置UserAgent
  • page.SetCookie: 设置Cookie

# 模拟移动端

const puppeteer = require('puppeteer');
const devices = require('puppeteer/DeviceDescriptors');|
const iPhone = devices['iPhone 6'];
puppeteer.launch().then(async browser => {
    const page = await browser.newPage();
    await page.emulate(iPhone);
    await page.goto('https://www.google.com');
    // other actions...
    await browser.close();
});

# 页面跳转

  • page.goto(url, options)
  • page.goBack(options)
  • page.goForward(options)
  • page.reload(options)

比较常用的是page.goto,相当于在浏览器中输入了地址,然后回车。此外,也可以同通过执行js跳转和模拟点击link跳转。

# 选择

  • page.$(selector): document.querySelector
  • page.$$(selector): document.querySelectorAll
  • page.$x(expression): xpath的select版本

在typescript中$符号会报错,解决方法: let $: any;先定义一下。它们返回的对象是<Promise<?ElementHandle>>,可以用它判断某元素是否存在,也可以对ElementHandle执行相应操作,具体在后面的ElementHandle中介绍。

# 模拟输入

  • page.mouse
  • page.keyboard
  • page.click(selector[, options]) 在被选择元素上模拟点击
  • page.type(selector, text[, options]) 在被选择的输入框中输入
  • page.hover(selector) 模拟鼠标移动到被选择元素上
  • page.select(selector, ...values) 在被选择元素上模拟选择select选项
  • page.tap(selector) 在被选择元素上模拟触摸

# 等待

  • page.waitForNavigation(options)
  • page.waitFor(selectorOrFunctionOrTimeout[, options[, ...args]])
  • page.waitForSelector(selector[, options])
  • page.waitForXPath(xpath[, options])
  • page.waitForFunction(pageFunction[, options[, ...args]])

其中最常用的有page.waitFor、page.waitForNavigation,后者常用于等待跳转结束,例如点击搜索按钮后,等待跳转至搜索结果页面。

const navigationPromise = page.waitForNavigation();
await page.click('a.my-link'); 
await navigationPromise; 

# 执行脚本

执行脚本最常用的函数是page.evaluate,它类似于在控制台中执行指令。

console.log(await page.evaluate('1 + 2'));
var title = await page.evaluate('document.title')
var title = await page.evaluate(async (i) => {
    return document.title + ' ' + i;
}, 'hello');

console.log(title);

# 其他场景脚本

  • page.evaluateHandle(pageFunction, ...args)
  • page.evaluateOnNewDocument(pageFunction, ...args)
  • page.$$eval(selector, pageFunction[, ...args])
  • page.$eval(selector, pageFunction[, ...args])
const searchValue = await page.$eval('#search', el => el.value);
const preloadHref = await page.$eval('link[rel=preload]', el => el.href);
const html = await page.$eval('.main-container', e => e.outerHTML);

# 信息查看

  • page.url()
  • page.content()
  • page.frames()
  • page.mainFrame()
  • page.metrics()
  • page.target()
  • page.title()
  • page.viewport()

# 请求劫持

page.setRequestInterception提供了中断请求的机制,例如,我们可以通过它实现一个无图模式。

await page.setRequestInterception(true);
page.on('request', interceptedRequest => {
    if (interceptedRequest.url().endsWith('.png') || interceptedRequest.url().endsWith('.jpg'))
        interceptedRequest.abort();
    else
        interceptedRequest.continue();
});
await page.goto('https://example.com');

这里有一个interceptedRequest对象,它提供了三种响应模式: abort、continue和respond。

# 内容注入

  • page.addScriptTag(options)
  • page.addStyleTag(options)

# 事件

事件名 备注
domcontentloaded
load
request
requestfailed
requestfinished
response
console
close
frameattached
framedetached
framenavigated
error
pageerror
page.on('load',
async () => {
    console.log('page loading done, start fetch...');
});

# 内容保存

page.pdf(options)
page.screenshot([options])

# 不常用函数

page.authenticate(credentials)
page.bringToFront()
page.browser()
page.close(options)
page.coverage
page.exposeFunction(name, puppeteerFunction)
page.queryObjects(prototypeHandle)
page.setBypassCSP(enabled)
page.setCacheEnabled(enabled)
page.setContent(html)
page.setDefaultNavigationTimeout(timeout)
page.setJavaScriptEnabled(enabled)
page.setOfflineMode(enabled)
page.tracing

# 参考

Puppeteer2.0 官方api (opens new window)

使用Puppeteer进行数据抓取(二)——Page对象 (opens new window)

Node:使用Puppeteer完成一次复杂的爬虫 (opens new window)

#pupeteer
上次更新: 2021/12/19, 18:05:42
promise在循环中的串行并行用法
centos部署安装puppeteer

← promise在循环中的串行并行用法 centos部署安装puppeteer→

最近更新
01
多分支修复撞车的问题
05-01
02
如何成为架构师
01-23
03
服务器部署全过程
11-23
更多文章>
Theme by Vdoing | Copyright © 2019-2026 fangdown | 粤ICP备19079809号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式