puppeteer的作用
1、生成页面的屏幕截图,和PDF。
2、爬取SPA(单页应用程序)并生成预渲染的内容(即“ SSR”(服务器端渲染))。
2、自动执行表单提交,UI测试,键盘输入等。
4、创建最新的自动化测试环境。使用最新的JavaScript和浏览器功能,直接在最新版本的Chrome中运行测试。
5、捕获站点的时间线跟踪以帮助诊断性能问题。
6、测试Chrome扩展程序。
初次使用,打开页面,并且截图
let puppeteer = require('puppeteer')
async function test() {
// puppeteer.launch 实例开始浏览器
// 上面的方法可以传进去一个option对象, headless:false, 表示配置成有界面 , 可以配置为无界面浏览器,或者有界面浏览器
// 无界面性能更高 有界面用于调试
// 默认新创建的页面大小是800*600 可以使用 defaultViewport 中width和height 配置大小
let options = {
headless:false,
defaultViewport:{
width:1400,
height:800
}
}
let browser = await puppeteer.launch( options )
// 尝试打开网页
let page = await browser.newPage() // 先创建一个新页面
// 打开页面
console.log(page);
page.goto("http://www.baidu.com").then(res =>{
console.log("成功");
// 在上面打开的页面进行截图
page.screenshot({path:"aa.png"})
})
}
test()
使用选择器获取网页里面的内容
使用方法 两个$$eval 来获得多个选择器,一个代表只获取一个
let puppeteer = require('puppeteer')
async function test() {
let options = {
headless:false,
defaultViewport:{
width:1400,
height:800
}
}
let browser = await puppeteer.launch( options )
let page = await browser.newPage()
page.goto("https://www.dytt8.net/").then(res =>{
// 使用方法 $$eval
page.$$eval("#menu li a",ele =>{
ele.forEach(function (item,i){
console.log(item.innerHTML);
})
})
})
// 监听 console方法的输出
page.on("console",function (...arg){
console.log(arg);
})
}
test()
获取input,并输入内容,并且点击
// 找到输入框
inputEle = page.$('.searchl input[name="keyword"]')
// 聚焦
inputEle.focus()
// 设置键盘输入内容
page.keyboard.type("小丑")
// 点击按钮
btn = page.$('.searchl input[name="Submit"]')
btn.click()
杂,乱
let puppeteer = require('puppeteer')
let axios = require('axios')
let url =require('url')
let httpUrl = 'https://sobooks.cc/';
// $代表拿到对象,如果要获得内容得话,就需要使用$eval
(async function aa(){
let options = {
defaultViewport:{
width:1400,
height:800
},
headless:false,
slowMo:250
}
let browser = await puppeteer.launch( options )
async function getNum(){
let page =await browser.newPage()
await page.goto(httpUrl)
let pageNum = await page.$eval('.pagination li:last-child span',ele =>{
// 进行text得初始化,不初始化无法访问
let text = ele.innerHTML
// substring 表示把前面和后面剪切去一些
text = ele.innerHTML.substring(1,text.length-2).trim()
return text
})
page.close()
return pageNum
}
let num = await getNum()
console.log(num);
async function getObj(num){
let page =await browser.newPage()
let url = "https://sobooks.cc/page/"+num
await page.goto(url)
let arrPage = await page.$$eval('.card .card-item .thumb-img>a',ele =>{
let arr = []
ele.forEach( ele2=>{
var obj = {
title:ele2.getAttribute('title'),
url:ele2.getAttribute('href')
}
arr.push(obj)
})
return arr
})
page.close()
console.log();
getInfo(arrPage[0].url)
}
getObj(1)
async function getInfo(url){
console.log(url);
let page =await browser.newPage()
// 获取谷歌请求
// await page.setRequestInterception(true);
// 监听请求事件,并对请求事件进行拦截,为了使请求快速,效率高一点
// page.on('request',interceptedRequest =>{
// // 对url模块对请求得地址进行解析
// let urlObj = url.parse(interceptedRequest.url())
// if (urlObj.hostname == 'goodlead.g.doubleclick.net') {
// // 如果是谷歌得广告请求,就放弃
// interceptedRequest.abort()
// }else{
// interceptedRequest.continue()
// }
// });
await page.goto(url)
let eleA = await page.$('.dltable tr:nth-child(3) a:last-child')
let Ahref = await eleA.getProperty('href')
}
})()