溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

怎么在node中利用puppeteer模擬登錄抓取頁面

發(fā)布時(shí)間:2021-06-02 16:56:28 來源:億速云 閱讀:278 作者:Leah 欄目:web開發(fā)

今天就跟大家聊聊有關(guān)怎么在node中利用puppeteer模擬登錄抓取頁面,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。

一般實(shí)現(xiàn)熱圖顯示需要經(jīng)過如下階段:
1.獲取網(wǎng)站頁面
2.獲取經(jīng)過處理后的用戶數(shù)據(jù)
3.繪制熱圖
 本篇主要聚焦于階段1來詳細(xì)的介紹一下主流的在熱圖中獲取網(wǎng)站頁面的實(shí)現(xiàn)方式
4.使用iframe直接嵌入用戶網(wǎng)站
5.抓取用戶頁面保存到本地,通過iframe嵌入本地資源(所謂本地資源這里認(rèn)為是分析工具這一端)

兩種方式各有各的優(yōu)缺點(diǎn)

首先第一種直接嵌入用戶網(wǎng)站,這個(gè)有一定的限制條件,比如如果用戶網(wǎng)站為了防止iframe劫持,不允許iframe嵌套(設(shè)置meta X-FRAME-OPTIONS 為sameorgin 或者直接設(shè)置http header ,甚至直接通過js來控制if(window.top !== window.self){ window.top.location = window.location;} ),這種情況下就需要客戶網(wǎng)站做一部分工作才可以被分析工具的iframe加載,使用起來不一定那么方便,因?yàn)椴⒉皇撬械男枰獧z測(cè)分析的網(wǎng)站用戶都可以管理網(wǎng)站的。

第二種方式,直接抓取網(wǎng)站頁面到本地服務(wù)器,然后瀏覽的是本機(jī)服務(wù)器上抓取的頁面,這種情況下頁面已經(jīng)過來了,我們就可以為所欲為了,首先我們繞過了X-FRAME-OPTIONS 為sameorgin的問題,只需要解決js控制的問題,對(duì)于抓取的頁面來說,我們可以通過特殊的對(duì)應(yīng)來處理(比如移除對(duì)應(yīng)的js控制,或者添加我們自己的js);但是這種方式也有很多的不足:1、無法抓取spa頁面,無法抓取需要用戶登錄授權(quán)的頁面,無法抓取用戶設(shè)置了白明白的頁面等等。

兩種方式都存在https 和 http資源由于同源策略引起的另一個(gè)問題,https站無法加載http資源,所以如果為了最好的兼容性,熱圖分析工具需要被應(yīng)用http協(xié)議,當(dāng)然具體可以根據(jù)訪問的客戶網(wǎng)站而具體分站優(yōu)化。

抓取網(wǎng)站頁面如何優(yōu)化

這里我們針對(duì)抓取網(wǎng)站頁面遇到的問題基于puppeteer做一些優(yōu)化,提高抓取成功的概率,主要優(yōu)化以下兩種頁面:

1.spa頁面

spa頁面在當(dāng)前頁算是主流了,但是它總所周知的是其對(duì)搜索引擎的不友好;通常的頁面抓取程序其實(shí)就是一個(gè)簡單的爬蟲,其過程通常都是發(fā)起一個(gè)http get 請(qǐng)求到用戶網(wǎng)站(應(yīng)該是用戶網(wǎng)站服務(wù)器)。這種抓取方式本身就會(huì)有問題問題,首先,直接請(qǐng)求的是用戶服務(wù)器,用戶服務(wù)器對(duì)非瀏覽器的agent 應(yīng)該會(huì)有很多限制,需要繞過處理;其次,請(qǐng)求返回的是原始內(nèi)容,需要在瀏覽器中通過js渲染的部分無法獲?。ó?dāng)然,在iframe嵌入后,js執(zhí)行還是會(huì)再一定程度上彌補(bǔ)這個(gè)問題),最后如果頁面是spa頁面,那么此時(shí)獲取的只是模板,在熱圖中顯示效果非常不友好。

針對(duì)這種情況,如果基于puppeteer來做,流程就變成了

puppeteer啟動(dòng)瀏覽器打開用戶網(wǎng)站-->頁面渲染-->返回渲染后結(jié)果,簡單的用偽代碼實(shí)現(xiàn)如下:

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();
}

這樣我們拿到的內(nèi)容就是渲染后的內(nèi)容,無論頁面的渲染方式如何(客戶端渲染抑或服務(wù)端)

需要登錄的頁面

對(duì)于需要登錄頁面其實(shí)分為多種情況:

需要登錄才可以查看頁面,如果沒有登錄,則跳轉(zhuǎn)到login頁面(各種管理系統(tǒng))

對(duì)于這種類型的頁面我們需要做的就是模擬登錄,所謂模擬登錄就是讓瀏覽器去登錄,這里需要用戶提供對(duì)應(yīng)網(wǎng)站的用戶名和密碼,然后我們走如下的流程:

訪問用戶網(wǎng)站-->用戶網(wǎng)站檢測(cè)到未登錄跳轉(zhuǎn)到login-->puppeteer控制瀏覽器自動(dòng)登錄后跳轉(zhuǎn)到真正需要抓取的頁面,可用如下偽代碼來說明:

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 跳轉(zhuǎn)到請(qǐng)求的頁面
   await page.waitForNavigation();

   return await page.content();
}

登錄與否都可以查看頁面,只是登錄后看到內(nèi)容會(huì)所有不同 (各種電商或者portal頁面)

這種情況處理會(huì)比較簡單一些,可以簡單的認(rèn)為是如下步驟:

通過puppeteer啟動(dòng)瀏覽器打開請(qǐng)求頁面-->點(diǎn)擊登錄按鈕-->輸入用戶名和密碼登錄 -->重新加載頁面

基本代碼如下圖:

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 根據(jù)實(shí)際情況來確定
   await page.reload();

   return await page.content();
}

看完上述內(nèi)容,你們對(duì)怎么在node中利用puppeteer模擬登錄抓取頁面有進(jìn)一步的了解嗎?如果還想了解更多知識(shí)或者相關(guān)內(nèi)容,請(qǐng)關(guān)注億速云行業(yè)資訊頻道,感謝大家的支持。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI