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