在網站分析行業中,網站熱圖可以很好的反應用戶在網站的操做行爲,具體分析用戶的喜愛,對網站進行鍼對性的優化,一個熱圖的例子(來源於ptengine)javascript
上圖中能很清晰的看到用戶關注點在那,咱們不關注產品中熱圖的功能如何,本篇文章就熱圖的實現作一下簡單的分析和總結。css
通常實現熱圖顯示須要通過以下階段:html
兩種方式各有各的優缺點,首先第一種直接嵌入用戶網站,這個有必定的限制條件,好比若是用戶網站爲了防止iframe劫持,不容許iframe嵌套(設置meta X-FRAME-OPTIONS 爲sameorgin 或者直接設置http header ,甚至直接經過js來控制java
if(window.top !== window.self){ window.top.location = window.location;}
),這種狀況下就須要客戶網站作一部分工做才能夠被分析工具的iframe加載,使用起來不必定那麼方便,由於並非全部的須要檢測分析的網站用戶均可以管理網站的。瀏覽器
第二種方式,直接抓取網站頁面到本地服務器,而後瀏覽的是本機服務器上抓取的頁面,這種狀況下頁面已通過來了,咱們就能夠隨心所欲了,首先咱們繞過了X-FRAME-OPTIONS 爲sameorgin的問題,只須要解決js控制的問題,對於抓取的頁面來講,咱們能夠經過特殊的對應來處理(好比移除對應的js控制,或者添加咱們本身的js);可是這種方式也有不少的不足:一、沒法抓取spa頁面,沒法抓取須要用戶登陸受權的頁面,沒法抓取用戶設置了白明白的頁面等等。服務器
兩種方式都存在https 和 http資源因爲同源策略引發的另外一個問題,https站沒法加載http資源,因此若是爲了最好的兼容性,熱圖分析工具須要被應用http協議,固然具體能夠根據訪問的客戶網站而具體分站優化。async
這裏咱們針對抓取網站頁面遇到的問題基於puppeteer作一些優化,提升抓取成功的機率,主要優化如下兩種頁面:工具
const puppeteer = require('puppeteer'); async getHtml = (url) =>{ const browser = await puppeteer.launch(); const page = await browser.newPage(); await page.goto(url); return await page.content(); }
這樣咱們拿到的內容就是渲染後的內容,不管頁面的渲染方式如何(客戶端渲染抑或服務端)性能
對於須要登陸頁面其實分爲多種狀況:優化
const puppeteer = require("puppeteer"); async autoLogin =(url)=>{ const browser = await puppeteer.launch(); const page =await browser.newPage(); await page.goto(url); await page.waitForNavigation(); //登陸 await page.type('#username',"用戶提供的用戶名"); await page.type('#password','用戶提供的密碼'); await page.click('#btn_login'); //頁面登陸成功後,須要保證redirect 跳轉到請求的頁面 await page.waitForNavigation(); return await page.content(); }
這種狀況處理會比較簡單一些,能夠簡單的認爲是以下步驟:
經過puppeteer啓動瀏覽器打開請求頁面-->點擊登陸按鈕-->輸入用戶名和密碼登陸 -->從新加載頁面
基本代碼以下圖:
const puppeteer = require("puppeteer"); async autoLoginV2 =(url)=>{ const browser = await puppeteer.launch(); const page =await browser.newPage(); await page.goto(url); await page.click('#btn_show_login'); //登陸 await page.type('#username',"用戶提供的用戶名"); await page.type('#password','用戶提供的密碼'); await page.click('#btn_login'); //頁面登陸成功後,是否須要reload 根據實際狀況來肯定 await page.reload(); return await page.content(); }
明天總結吧,今天下班了。
補充(還昨天的債):基於puppeteer雖然能夠很友好的抓取頁面內容,可是也存在這不少的侷限