Puppeteer 是一个 node 库,提供了一组用来操做 chrome 的 API, 一个 headless chrome (ui界面可配置)。 须要支持async, await 官方也提倡使用ES7标准javascript
node >= v7.6.0
npm i puppeteer -Shtml
https://github.com/GoogleChrome/puppeteer前端
app.get('/', function (req, res) {
(async ()=>{
const browser = await (puppeteer.launch({
timeout: 15000,
ignoreHTTPSErrors: true,
devtools: false,
headless: true
}));
const page = await browser.newPage();
await page.goto('https://juejin.im/post/5af8f00c51882567105fda7b');
await page.screenshot({
path:'photo/juejin.png',
type:'png',
fullPage : true
});
// res.send(JSON.stringify(list));
browser.close();
})()
})
复制代码
你们也注意到了的开篇写的puppeteer 的写法是ES7的标准 其实 promise.then的写法很丑 因此说想研究的朋友仍是用ES7的好java
上述文本中的 puppeteer.launch 函数 用来运行puppeteer并建立一个bowswer的实例对象,可传options (具体参数参照官网api)node
borwser.newPage()函数做用就是建立一个page实例用来访问咱们的url地址,这里我给的是掘金的一篇文章 page.goto(url) 函数的做用就是访问当前的url地址
screenshot 函数的做用就是截图 options 主要有 path、type、fullPage 等等 就不一一介绍了。很轻松的就完成了截图的操做,是否是以为很简单。headless chrome 与其余几个不一样 它的逻辑操做是用户,而PhantomJS 、webdriver都是从程序角度出发的,因此说前端用起来会更顺手。git
app.get('/juejin',function(req,res){
(async ()=>{
console.log(new Date());
let browser = await puppeteer.launch({
timeout:15000,
headless:false,
ignoreHTTPSErrors:true
});
let page = await browser.newPage();
let arr = [];
await page.goto('https://juejin.im/welcome/frontend');
await page.waitFor(500);
let sources = await page.evaluate(()=>{
let con = Array.from(document.querySelectorAll('.entry-list > li a.title'));
return con.map(item =>item.href);
});
for(let i =0;i<sources.length;i++){
let page = await browser.newPage();
await page.goto(sources[i],{timeout:0});
let html = await page.evaluate(()=>{
let content = Array.from(document.querySelectorAll('div.article-area'));
return content.map(con => con.textContent);
})
arr.push({'content':html})
}
res.send({'data':arr});
await browser.close();
console.log(new Date());
console.log('end');
})()
})
复制代码
上述代码中的访问url就不在讲解了 主要讲解从列表中获取 全部文章的地址 而后访问个个网址提取文章的内容。github
page.evaluate 函数的主要用途是添加可执行的JavaScript代码段到page中咱们须要的是获取元素中的地址,因此咱们先要找到元素的位置,开控制台找元素就不用多说了把,page.evaluate 函数中 documentSelectorAll 就是来找携带地址的a 元素。web
Array.from 相似于建立新array实例同样 咱们获取到了元素的href 而后 return 出来。chrome
for循环去遍历拿到的地址列表 建立新的page页面而后去访问 去找到文字内容的节点而后返回出来 在这里我定义了一个数据 用来接收每一个页面文章的内容,for循环完成后 经过res.send函数 返回给前端页面,这样就能够在前端看到我获取到的数据了。express
borwser.close() 那确定就是关闭浏览器啊,都操做完了确定是要结束的啊。 文中的page.waitFor() 功能相似咱们的timeout 函数差很少
https://blog.csdn.net/u010142437/article/details/79136182