最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Puppeteer 爬取動(dòng)態(tài)生成的網(wǎng)頁(yè)實(shí)戰(zhàn)

 更新時(shí)間:2018年11月14日 09:16:34   作者:Alone1469546971808  
這篇文章主要介紹了Puppeteer 爬取動(dòng)態(tài)生成的網(wǎng)頁(yè)實(shí)戰(zhàn),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧

Puppeteer 相關(guān)介紹與安裝不過(guò)多介紹,可通過(guò)以下鏈接進(jìn)行學(xué)習(xí)

一、Puppeteer

開(kāi)源地址

英文文檔

中文社區(qū)

二、爬取動(dòng)態(tài)網(wǎng)頁(yè)

1. 需求

首先,了解下我們的需求: 爬取zoomcharts 文檔中 Net Chart 目錄下所有訪問(wèn)連接對(duì)應(yīng)的頁(yè)面,并保存到本地

2. 研究 ZoomCharts 文檔頁(yè)面結(jié)構(gòu)

首先,我們得研究透 ZoomCharts 頁(yè)面如何加載,以及左側(cè)導(dǎo)航的 DOM 樹(shù)結(jié)構(gòu),才好進(jìn)行下一步操作

頁(yè)面首次加載

頁(yè)面首次加載,左側(cè)導(dǎo)航第一個(gè)目錄 Introduction 高亮,從控制臺(tái)可看出,該元素增加了 active 類(lèi),同時(shí) li[data-section="net-chart"] 節(jié)點(diǎn)下只有一個(gè)元素節(jié)點(diǎn) a

點(diǎn)擊 Net Chart 目錄

點(diǎn)擊 Net Chart 目錄, Net Chart 目錄高亮,下拉顯示子目錄,查看控制臺(tái),其元素節(jié)點(diǎn)增加 active 類(lèi),并增加 ul 子元素節(jié)點(diǎn), 此時(shí),第一個(gè)子目錄節(jié)點(diǎn)也只有一個(gè)子元素節(jié)點(diǎn) a

結(jié)論

不難發(fā)現(xiàn), 左側(cè)目錄是動(dòng)態(tài)生成的,而不是靜態(tài)寫(xiě)死的,只有點(diǎn)擊父級(jí)目錄,其子目錄才會(huì)生成顯示,同時(shí),父級(jí)目錄元素上的 drop 類(lèi)表明存在子級(jí)目錄

3. 編寫(xiě)主程序

通過(guò)上面分析,得出大概流程如下

  • 從上到下,遍歷 Net Chart 目錄的 DOM 樹(shù),當(dāng)找到 a.drop 的元素節(jié)點(diǎn),模擬鼠標(biāo)點(diǎn)擊事件 click ,生成子目錄節(jié)點(diǎn)
  • 找到 Net Chart 目錄下所有的 a 鏈接,生成一個(gè)數(shù)組
  • 遍歷數(shù)組,訪問(wèn)每一個(gè)子目錄頁(yè)面,保存頁(yè)面的 html 文件到本地

接下來(lái)實(shí)現(xiàn)每個(gè)具體流程

項(xiàng)目初始化

安裝 puppeteer , rimraf (文件夾操作時(shí)需用到)

npm i -S puppeteer rimraf

新建 test.js 文件并引入

const puppeteer = require('puppeteer');
const chalk = require('chalk');
const path = require('path');
const https = require('https');
const fs = require('fs');
const rm = require('rimraf');

const settings = {
 headless: false
}

function resolve(dir, dir2 = '') {
	return path.posix.join(__dirname, './', dir, dir2);
}

async function main () {
 const browser = await puppeteer.launch(settings); // 創(chuàng)建一個(gè)Browser 對(duì)象
 try {
  const page = await browser.newPage(); // 使用 Browser 創(chuàng)建 Page 
  page.setDefaultNavigationTimeout(600000);
  // 監(jiān)聽(tīng) console 
  page.on('console', msg => {
   for (let i = 0; i < msg.args().length; ++i) {
    console.log(`${i}: ${msg.args()[i]}`);
   }
  });
  
  <!-- main start -->
  // main 區(qū)域
  
  <!-- end start-->
  console.log('服務(wù)正常結(jié)束')
 } catch (error) {
  console.log('服務(wù)出現(xiàn)錯(cuò)誤:')
  console.log(error)
 } finally {
  
 }
}

main()

接下來(lái)所有代碼都在 main 區(qū)域內(nèi)完成, 完整代碼可訪問(wèn)github代碼倉(cāng)庫(kù) 查看,下面僅列出每部分的思路

創(chuàng)建文件夾,用于保存爬取的文件

  • 定義文件輸出路徑
  • 根據(jù)路徑生成文件夾
  • 當(dāng)文件夾已經(jīng)存在,先刪除,再新建

實(shí)現(xiàn) Net Chart 目錄下所有 a.drop 元素的點(diǎn)擊事件

這部分涉及到DOM 操作, 只有在 page.evaluate() 中才能訪問(wèn)真實(shí)的 DOM 元素,同時(shí),在 page.evaluate() 中不能直接調(diào)用外面定義的函數(shù),可將函數(shù)傳遞進(jìn)去,或?qū)⒑瘮?shù)綁定到 window 對(duì)象上

await page.evaluate(async () => {
 const rootNode = document.querySelector('#menu > ul > li:nth-child(5) > ul > li:nth-child(5)');
 await window.walkDOM(rootNode)
})

此時(shí),綁定到 window 對(duì)象上的 walkDOM 函數(shù)需要在 page.evaluateOnNewDocument 函數(shù)中定義才能生效

await page.evaluateOnNewDocument(() => {
 // 遍歷DOM
 window.walkDOM = (node) => {
  if (node === null) {
   return
  }
  if (node.tagName === 'A' && node.className.indexOf('drop') > -1) {
   node.click() // 點(diǎn)擊事件
  }
  node = node.firstElementChild
  while (node) {
   walkDOM(node)
   node = node.nextElementSibling
  }
 }
})

當(dāng)Net Chart 目錄下所有 a.drop 元素點(diǎn)擊過(guò)后, Net Chart 目錄下所有后代子目錄都會(huì)加載生成,接下來(lái)操作就簡(jiǎn)單了

獲取Net Chart 目錄下所有 a 元素

  • 通過(guò) document.querySelectorAll() 查找到所有 a 元素,保存到數(shù)組
  • 遍歷數(shù)組,對(duì)數(shù)組每一項(xiàng)進(jìn)行處理成 {href: '',text: ''} 對(duì)象
  • 返回對(duì)象數(shù)組

遍歷對(duì)象數(shù)組, 訪問(wèn)每一個(gè)鏈接,下載其HTML文件

  • 跳轉(zhuǎn)每一個(gè)鏈接,下載需要的html到指定文件夾
  • 當(dāng) HTML 中存在 img 時(shí),下載所有圖片

4. 總結(jié)

第一次使用Puppeteer也是磕磕絆絆,花費(fèi)不少時(shí)間,期間也參考了不少文章,還需多多練習(xí)

代碼倉(cāng)庫(kù)

代碼倉(cāng)庫(kù)

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Node.js中.npmrc文件的配置實(shí)現(xiàn)

    Node.js中.npmrc文件的配置實(shí)現(xiàn)

    .npmrc?文件是 npm 配置的核心文件,用于管理 npm 的行為,本文就來(lái)介紹一下Node .npmrc文件配置,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-12-12
  • Node.js+ES6+dropload.js實(shí)現(xiàn)移動(dòng)端下拉加載實(shí)例

    Node.js+ES6+dropload.js實(shí)現(xiàn)移動(dòng)端下拉加載實(shí)例

    這個(gè)demo服務(wù)由Node搭建服務(wù)、下拉加載使用插件dropload,數(shù)據(jù)渲染應(yīng)用了ES6中的模板字符串。有興趣的小伙伴可以自己嘗試下
    2017-06-06
  • node將Excel數(shù)據(jù)轉(zhuǎn)為JSON的示例代碼

    node將Excel數(shù)據(jù)轉(zhuǎn)為JSON的示例代碼

    平時(shí)工作中我們基本都會(huì)接觸到excel數(shù)據(jù)表,但是在代碼中使用和處理數(shù)據(jù)的時(shí)候通常都要先將其轉(zhuǎn)為json格式數(shù)據(jù),json格式的數(shù)據(jù)可以更加方便我們進(jìn)行處理,那么我們要怎么將Excel數(shù)據(jù)轉(zhuǎn)為JSON數(shù)據(jù)呢,接下來(lái)本文給大家詳細(xì)介紹一下
    2024-11-11
  • Node.js+ELK日志規(guī)范的實(shí)現(xiàn)

    Node.js+ELK日志規(guī)范的實(shí)現(xiàn)

    這篇文章主要介紹了Node.js+ELK日志規(guī)范的實(shí)現(xiàn),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2019-05-05
  • Node?文件查找優(yōu)先級(jí)及?Require?方法文件查找策略

    Node?文件查找優(yōu)先級(jí)及?Require?方法文件查找策略

    這篇文章主要介紹了Node文件查找優(yōu)先級(jí)及Require方法文件查找策略。文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-09-09
  • 原生node.js案例--前后臺(tái)交互

    原生node.js案例--前后臺(tái)交互

    本文主要介紹了原生node.js案例--前后臺(tái)交互。本案例包含4部分:(1)HTML部分;(2)ajax部分;(3)JavaScript部分;(4)node服務(wù)器部分。具有很好的參考價(jià)值,下面跟著小編一起來(lái)看下吧
    2017-02-02
  • node檢測(cè)端口可用性的實(shí)踐示例

    node檢測(cè)端口可用性的實(shí)踐示例

    本文主要介紹了node檢測(cè)端口可用性的實(shí)踐示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02
  • Node.js操作Firebird數(shù)據(jù)庫(kù)教程

    Node.js操作Firebird數(shù)據(jù)庫(kù)教程

    這篇文章主要為大家分享了Node.js操作Firebird數(shù)據(jù)庫(kù)教程,思路清晰便于大家理解,感興趣的小伙伴們可以參考一下
    2016-03-03
  • node.js中的emitter.on方法使用說(shuō)明

    node.js中的emitter.on方法使用說(shuō)明

    這篇文章主要介紹了node.js中的emitter.on方法使用說(shuō)明,本文介紹了emitter.on的方法說(shuō)明、語(yǔ)法、接收參數(shù)、使用實(shí)例和實(shí)現(xiàn)源碼,需要的朋友可以參考下
    2014-12-12
  • 淺談node中的cluster集群

    淺談node中的cluster集群

    這篇文章主要介紹了淺談node中的cluster集群,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-06-06

最新評(píng)論

鸡东县| 农安县| 宣汉县| 金山区| 大英县| 晋宁县| 印江| 包头市| 吴江市| 册亨县| 建湖县| 鄢陵县| 平顶山市| 平塘县| 闸北区| 吴江市| 乌兰浩特市| 新乡县| 鄢陵县| 青岛市| 贵溪市| 泗水县| 江山市| 西城区| 鄂尔多斯市| 汉中市| 仁布县| 临沂市| 赞皇县| 湛江市| 梨树县| 青海省| 崇仁县| 闵行区| 富平县| 虹口区| 潼关县| 安阳市| 那曲县| 四平市| 永顺县|