以前寫的兩篇爬蟲體驗基本上涵蓋了通常的Html頁面提取場景,可是有些時候,若是目標頁面不是純靜態的頁面,而是使用js動態渲染的頁面(好比one),以前的爬蟲就很差使了,這種時候就要藉助一些其餘工具來進行實現。php
通常爬取動態頁面的思路是經過軟件模擬瀏覽器行爲獲取到渲染後的頁面鏡像,而後再對渲染後的頁面進行分析,經常使用的工具備selenium,phantomJs,puppeteer等,經過對項目維護程度、對PHP友好度的對比,我選用的是puppeteer。html
根據官方介紹,谷歌在2017年開發了自家Chrome瀏覽器的Headless特性,puppeteer即是這個時候誕生的,它的原理是經過調用Chrome DevTools開放的接口與Chrome通訊,將瀏覽器開放接口進行封裝,方便用戶調用,能夠很容易地實現瀏覽器行爲的模擬。node
嘗試一下puppeteer,安裝起來其實很是簡單:git
npm i puppeteer
根據官方API寫了example.js進行測試:github
async function start(){ const browser = await puppeteer.launch(); const page = await browser.newPage(); await page.goto('http://wufazhuce.com'); return page.content(); }; (async () => { const a = await start(); process.stdout.write(a); })();
執行node example.js即可以看到控制檯輸出了渲染完成以後的頁面Html,這個時候便可以使用php的fopen讀取stdout獲取到html文本進行下一步處理了。npm
在github上面查找相關支持,發現有spatie/browsershot這個項目直接把操做步驟封裝好了,這樣即可以使用puppeteer進行動態生成html內容的獲取,而後繼續使用dom-crawler來獲取想要抓取的內容了:瀏覽器
$this->crawler = new Crawler(); $html = Browsershot::url($this->url) ->setOption('args', [ '--no-sandbox', '--disable-setuid-sandbox' ]) ->bodyHtml(); $this->crawler->addHtmlContent($html);