国产99久久精品_欧美日本韩国一区二区_激情小说综合网_欧美一级二级视频_午夜av电影_日本久久精品视频

最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
當前位置: 首頁 - 科技 - 知識百科 - 正文

Puppeteer 爬取動態生成的網頁實戰

來源:懂視網 責編:小采 時間:2020-11-27 22:03:48
文檔

Puppeteer 爬取動態生成的網頁實戰

Puppeteer 爬取動態生成的網頁實戰:Puppeteer 相關介紹與安裝不過多介紹,可通過以下鏈接進行學習 一、Puppeteer 開源地址 英文文檔 中文社區 二、爬取動態網頁 1. 需求 首先,了解下我們的需求: 爬取zoomcharts 文檔中 Net Chart 目錄下所有訪問連接對應的頁面,并保存到本地 2. 研究
推薦度:
導讀Puppeteer 爬取動態生成的網頁實戰:Puppeteer 相關介紹與安裝不過多介紹,可通過以下鏈接進行學習 一、Puppeteer 開源地址 英文文檔 中文社區 二、爬取動態網頁 1. 需求 首先,了解下我們的需求: 爬取zoomcharts 文檔中 Net Chart 目錄下所有訪問連接對應的頁面,并保存到本地 2. 研究

Puppeteer 相關介紹與安裝不過多介紹,可通過以下鏈接進行學習

一、Puppeteer

開源地址

英文文檔

中文社區

二、爬取動態網頁

1. 需求

首先,了解下我們的需求: 爬取zoomcharts 文檔中 Net Chart 目錄下所有訪問連接對應的頁面,并保存到本地

2. 研究 ZoomCharts 文檔頁面結構

首先,我們得研究透 ZoomCharts 頁面如何加載,以及左側導航的 DOM 樹結構,才好進行下一步操作

頁面首次加載

頁面首次加載,左側導航第一個目錄 Introduction 高亮,從控制臺可看出,該元素增加了 active 類,同時 li[data-section="net-chart"] 節點下只有一個元素節點 a

點擊 Net Chart 目錄

點擊 Net Chart 目錄, Net Chart 目錄高亮,下拉顯示子目錄,查看控制臺,其元素節點增加 active 類,并增加 ul 子元素節點, 此時,第一個子目錄節點也只有一個子元素節點 a

結論

不難發現, 左側目錄是動態生成的,而不是靜態寫死的,只有點擊父級目錄,其子目錄才會生成顯示,同時,父級目錄元素上的 drop 類表明存在子級目錄

3. 編寫主程序

通過上面分析,得出大概流程如下

  • 從上到下,遍歷 Net Chart 目錄的 DOM 樹,當找到 a.drop 的元素節點,模擬鼠標點擊事件 click ,生成子目錄節點
  • 找到 Net Chart 目錄下所有的 a 鏈接,生成一個數組
  • 遍歷數組,訪問每一個子目錄頁面,保存頁面的 html 文件到本地
  • 接下來實現每個具體流程

    項目初始化

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

    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); // 創建一個Browser 對象
     try {
     const page = await browser.newPage(); // 使用 Browser 創建 Page 
     page.setDefaultNavigationTimeout(600000);
     // 監聽 console 
     page.on('console', msg => {
     for (let i = 0; i < msg.args().length; ++i) {
     console.log(`${i}: ${msg.args()[i]}`);
     }
     });
     
     <!-- main start -->
     // main 區域
     
     <!-- end start-->
     console.log('服務正常結束')
     } catch (error) {
     console.log('服務出現錯誤:')
     console.log(error)
     } finally {
     
     }
    }
    
    main()

    接下來所有代碼都在 main 區域內完成, 完整代碼可訪問github代碼倉庫 查看,下面僅列出每部分的思路

    創建文件夾,用于保存爬取的文件

  • 定義文件輸出路徑
  • 根據路徑生成文件夾
  • 當文件夾已經存在,先刪除,再新建
  • 實現 Net Chart 目錄下所有 a.drop 元素的點擊事件

    這部分涉及到DOM 操作, 只有在 page.evaluate() 中才能訪問真實的 DOM 元素,同時,在 page.evaluate() 中不能直接調用外面定義的函數,可將函數傳遞進去,或將函數綁定到 window 對象上

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

    此時,綁定到 window 對象上的 walkDOM 函數需要在 page.evaluateOnNewDocument 函數中定義才能生效

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

    當Net Chart 目錄下所有 a.drop 元素點擊過后, Net Chart 目錄下所有后代子目錄都會加載生成,接下來操作就簡單了

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

  • 通過 document.querySelectorAll() 查找到所有 a 元素,保存到數組
  • 遍歷數組,對數組每一項進行處理成 {href: '',text: ''} 對象
  • 返回對象數組
  • 遍歷對象數組, 訪問每一個鏈接,下載其HTML文件

  • 跳轉每一個鏈接,下載需要的html到指定文件夾
  • 當 HTML 中存在 img 時,下載所有圖片
  • 4. 總結

    第一次使用Puppeteer也是磕磕絆絆,花費不少時間,期間也參考了不少文章,還需多多練習

    代碼倉庫

    代碼倉庫

    聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

    文檔

    Puppeteer 爬取動態生成的網頁實戰

    Puppeteer 爬取動態生成的網頁實戰:Puppeteer 相關介紹與安裝不過多介紹,可通過以下鏈接進行學習 一、Puppeteer 開源地址 英文文檔 中文社區 二、爬取動態網頁 1. 需求 首先,了解下我們的需求: 爬取zoomcharts 文檔中 Net Chart 目錄下所有訪問連接對應的頁面,并保存到本地 2. 研究
    推薦度:
    標簽: 動態 頁面 網頁
    • 熱門焦點

    最新推薦

    猜你喜歡

    熱門推薦

    專題
    Top
    主站蜘蛛池模板: 久久伊人中文字幕有码 | 久久国产成人精品国产成人亚洲 | 欧美a在线视频 | 亚洲一区二区精品视频 | 中文字幕va一区二区三区 | 欧美视频精品 | 香蕉一区二区 | 精品久久久久久久一区二区手机版 | 亚欧成人一区二区 | 青青热久久国产久精品秒播 | 亚洲欧美日本在线观看 | 九九久久亚洲综合久久久 | 精品久久久久中文字幕日本 | 在线观看免费精品国产 | 欧美一区二区在线观看视频 | 国内高清久久久久久久久 | 黄网站在线观看 | 亚洲欧美日韩一区 | 欧美网址在线观看 | 美日韩在线 | 91久久偷偷看嫩草影院无费 | 亚欧精品在线观看 | 亚洲一区二区在线免费观看 | 国产原创一区 | 国产欧美亚洲精品a | 亚洲精品免费在线观看 | 亚洲一区二区三区四区在线观看 | 欧美成人国产 | 成人精品视频在线观看播放 | 在线观看视频国产 | 亚欧免费视频一区二区三区 | 亚洲 欧美 成人日韩 | 欧美第3页| 在线中文高清资源免费观看 | 久久综合影院 | 国产欧美在线观看不卡 | 精品国产欧美一区二区三区成人 | 国产成人成人一区二区 | 伊人一级 | 麻豆系列| 香蕉久久ac一区二区三区 |