首先介紹Puppeteernode
Puppeteer是一個node庫,他提供了一組用來操縱Chrome的API(默認headless也就是無UI的chrome,也能夠配置爲有UI)git
有點相似於PhantomJS,但Puppeteer是Chrome官方團隊進行維護的,前景更好。es6
使用Puppeteer,至關於同時具備Linux和Chrome的能力,應用場景會很是多。就爬蟲領域來講,遠比通常的爬蟲工具功能更豐富,性能分析、自動化測試也不在話下,今天先探討爬蟲相關github
Puppeteer官方文檔請猛戳這裏chrome
puppeteer.launch()
運行puppeteer,他會return一個promise,使用then方法獲取browser實例,Browser API猛擊這裏 browser.newPage()
方法,能夠獲得一個page實例, 猛戳 Page API page.goto()
方法,跳轉至ES6標準入門 page.evaluate()
方法中註冊回調函數,並分析dom結構,從下圖能夠進行詳細分析,並經過document.querySelectorAll('ol li a')
拿到文章的全部連接page.pdf()
方法打印當前頁面核心代碼以下api
puppeteer.launch().then(async browser => { let page = await browser.newPage(); await page.goto('http://es6.ruanyifeng.com/#README'); await timeout(2000); let aTags = await page.evaluate(() => { let as = [...document.querySelectorAll('ol li a')]; return as.map((a) =>{ return { href: a.href.trim(), name: a.text } }); }); await page.pdf({path: `./es6-pdf/${aTags[0].name}.pdf`}); page.close() // 這裏也可使用promise all,但cpu可能吃緊,謹慎操做 for (var i = 1; i < aTags.length; i++) { page = await browser.newPage() var a = aTags[i]; await page.goto(a.href); await timeout(2000); await page.pdf({path: `./es6-pdf/${a.name}.pdf`}); page.close(); } browser.close(); });
https://github.com/zhentaoo/p...promise
若是在page go以後立刻進行pdf抓取,此時頁面還未完成渲染,只能抓到loading圖(以下),因此用timeout作了簡單點處理
less
最終爬取效果以下,PDF的尺寸、預覽效果、首頁重複就不作過多整理, 預覽效果以下,若是想要本身處理,能夠設置一下chrome尺寸,打印頁數
dom
最後聲明,生成的PDF很粗糙,應該不會對阮老師產生什麼影響,若有問題能夠第一時間聯繫我....async