puppeteer 总结
const puppeteer = require('puppeteer');
// 查找 谷歌浏览器位置
const findChrome = require('carlo/lib/find_chrome');
// 获取谷歌浏览器位置
const chromePath = await findChrome({});
// 初始化一个 浏览器
const browser = await puppeteer.launch({
executablePath:chromePath.executablePath,
headless: true, // 无头 默认值是 true
// 设置网页视图区域大小
defaultViewport:{
width:1280,
height: 1200
}
// 设置 放慢每个步骤的 毫秒数
slowMo:800
});
const page = await browser.newPage() // 新 实例出一个页面
await page.goto(httpUrl)
await page.waitForSelector('.align-items-center.cs-header > div > a')
let ct = await page.content(); // 获取真个 页面 html 字符串形式
let $ = cheerio.load(ct);
let links = []
$('.align-items-center.cs-header > div > a').each((i,item)=>{
// 获取 链接 地址
links.push( host + $(item).attr('href'))
})
let title = await page.$eval('#root > div.article-detail-container > div.main > div.article-content > h1',(el)=>{
// $eval 的 函数里面的代码 就是在浏览器里面执行的运行
console.log(el.innerHTML );
return el.innerHTML
})
let content = await page.$eval('#root > div.article-detail-container > div.main > div.article-content > article',(el)=>{
// $eval 的 函数里面的代码 就是在浏览器里面执行的运行
console.log(el.innerHTML );
return el.innerHTML
})
// await page.screenshot({path: 'example.png'}); // 截屏
// 获取页面内容
page.$$eval("#menu > div > ul > li > a",elements=>{
// console.log(elements);
elements.forEach((item,i)=>{
console.log(item.innerHTML);
})
})
let gnPage = await browser.newPage();
// console.log(linkList[2].href);
await gnPage.goto(linkList[2].href);
// 监听浏览器在控制台的输出
page.on('console',function(eventMsg){
console.log(eventMsg.text());
})
// 通过点击页面 进行跳转 获取页面对象
// let elementHandle = await page.$$('#menu li a');
// 点击 第二个链接 跳转到新页面
// elementHandle[2].click();
// 通过点击页面 进行跳转 获取页面对象
// let elementHandle = await page.$$('#menu li a');
// 点击 第二个链接 跳转到新页面
// elementHandle[2].click();
// 通过表单输入进行搜索
let inputEle = await page.$('.searchl > p:nth-child(1) > input');
// 聚焦光标
await inputEle.focus();
// 往输入框输入内容
await page.keyboard.type('蝙蝠侠')
// 取消 冒泡
await page.$eval('.search',(element)=>{
element.addEventListener('click',function(event){
event.cancelBubble = true
})
})
// 点击按钮
let btnEle = await page.$('.searchr > input[type=Submit]')
// 点击按钮
await btnEle.click()
page.waitFor(utilFun.random(1000, 3000));
// 关闭浏览器
await browser.close();
2
async function getlink(){
let arr = await getList();
// 按顺序 依次执行 -> 详情采集
let i=1;
arr.reduce((res,url)=>{
return res.then(()=>{
return new Promise(async (resolve)=>{
let res = await getInfo(url);
console.log('完成第' + i++ + '个文章采集');
let strHtml = `<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<h1>${res.title}</h1>
<div>${res.content} </div>
</body>
</html>`
fs.writeFileSync('./toutiao_article/' + res.title + '.html', strHtml);
// 间隔 5秒 继续执行
sleep(10)
resolve();
})
})
},Promise.resolve())
}
// js 睡眠函数 sleep(3) number 间隔秒数
function sleepOne(number){
var now = new Date();
var exitTime = now.getTime() + number;
while (true) {
now = new Date();
if(now.getTime() > exitTime)
return
}
}