阅读 1649

puppeteer使用记录

Github地址 github.com/GoogleChrom…

介绍

做爬虫或者是浏览器的自动化测试

环境

node v7.6及以上 node下载地址 nodejs.org/zh-cn/downl…

开始

npm i puppeteer
复制代码

安装过程中会下载Chromium,可能会下载失败,可以跳过此步骤,然后自己下载。

npm i puppeteer --ignore-scripts
复制代码

或者 设置环境变量

set PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=1
复制代码

截图示例

新建一个app.js

const puppeteer = require('puppeteer')
(async ()=> {
    const browser = await puppeteer.launch();
    const page = await browser.newPage();
    await page.goto('https://juejin.cn');
    await page.screenshot({path: 'juejin.png'});
    await browser.close()
})();
复制代码

打开cmd执行

node app.js
复制代码

puppeteer.launch()参数说明

  1. headless:是否显示浏览器窗口,默认true不显示
  2. executablePath:跳过下载Chromium时,需要使用此参数指定Chromium执行路径
  3. slowMo:执行操作间隔
  4. devtools:F12

Page介绍

  1. 选中某个元素 page.$(selector) , 执行的是 document.querySelector()
const SEARCH_BUTTON = '#search'
const btn = await page.$(SEARCH_BUTTON)
复制代码
  1. 选中同类型的所有元素 page.?(selector) 执行的是 document.querySelectorAll()
const ITEMS = '.item'
const items = await page.?(ITEMS);
复制代码
  1. 点击 page.click(selector[,options])
const SEARCH_BUTTON = '#search'
await page.click(SEARCH_BUTTON);
复制代码

如果点击导致当前页面url发生了变化(hash变化待定)

const SEARCH_BUTTON = '#search'
await Promise.all([
    page.waitForNavigation(),
    page.click()
])
复制代码
  1. 输入内容 page.type(selector,text[,options])
const SEARCH_BOX = '#search_box'
await page.type(SEARCH_BOX,'搜索内容')
复制代码
  1. 元素出现在可视区域,并将鼠标移入(一般点击或者输入内容之前执行此操作) page.hover(selector)
const SEARCH_BUTTON = '#search_button'
await page.hover(SEARCH_BUTTON)
复制代码
  1. 操作ua page.setUserAgent(ua) 一般会重写ua否则会过于明显
page.setUserAgent('Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36')
复制代码
  1. 写入cookie page.setCookie(...cookies)
await page.setCookie(...[{name:'uid',value:'123456',domain:'.juejin.im'}])
复制代码
  1. page.waitFor() 等待 一般用于延时
await page.waitFor(1000)
复制代码
  1. 操作单个元素 page.$eval()
const searchVal = await page.$eval('#search_box',(el) => {el.value})
复制代码
  1. 操作多个元素 page.?eval()
const len = await page.$$eval('a',elems => elems.length)
复制代码
  1. page.evaluate()
const bodyHandle = await page.$('body')
const html = await page.evaluate(body => body.innerHTML,bodyHandle)
await bodyHandle.dispose()
复制代码
  1. 访问页面 page.goto()
await page.goto('https://juejin.cn')
复制代码
  1. request事件
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://juejin.cn');
复制代码
  1. response 事件
page.on('response', async (resp) => {
    let status = resp.status()
    let content = await resp.text()
});

复制代码

键盘

模拟全选删除

await page.keyboard.down('ControlLeft');
await page.keyboard.down('KeyA');
await page.keyboard.up('KeyA');
await page.keyboard.up('ControlLeft');
await page.keyboard.press('Backspace');
复制代码
文章分类
前端