nodejs通過phantomjs實現下載網頁簡單介紹
能其實很見簡單,通過 phantomjs.exe 採集 url 載入的資源,通過子程式的方式,啟動nodejs 載入所有的資源,對於css的資源,匹配css內容,下載裡面的url資源。
當然功能還是很簡單的,在響應式設計和非同步載入的情況下,還是有很多資源沒有能夠下載,需要根據實際情況處理。
首先當然是下載 nodejs 和 phantomjs:
下面是 phantomjs.exe 執行的 down.js
[JavaScript] 純文字檢視 複製程式碼var page = require('webpage').create(), system = require('system'); var spawn = require("child_process").spawn if (system.args.length === 1) { console.log('Usage: netsniff.js <some URL>'); phantom.exit(1); } else { var urls = []; page.address = system.args[1]; page.onResourceReceived = function (res) { if (res.stage === 'start') { urls.push(res.url); } }; page.open(page.address, function (status) { var har; if (status !== 'success') { console.log('FAIL to load the address'); phantom.exit(1); } else { console.log('down resource ' + urls.length + ' urls.'); var child = spawn("node", ["--harmony", "downHtml.js", urls.join(',')]) child.stdout.on("data", function (data) { console.log(data); }) child.stderr.on("data", function (data) { console.log(data); }) child.on("exit", function (code) { phantom.exit(); }) } }); }
下面是對應的node執行的 downHtml.js
[JavaScript] 純文字檢視 複製程式碼"use strict"; var fs = require('fs'); var http = require('http'); var path = require('path'); var r_url = require('url'); var dirCache = {};//快取減少判斷 function makedir (pathStr, callback) { if (dirCache[pathStr] == 1) { callback(); } else { fs.exists(pathStr, function (exists) { if (exists == true) { dirCache[pathStr] == 1; callback(); } else { makedir(path.dirname(pathStr), function () { fs.mkdir(pathStr, function () { dirCache[pathStr] == 1; callback(); }) }); } }) } }; var reg = /[:,]\s*url\(['"]?.*?(\1)\)/g var reg2 = /\((['"]?)(.*?)(\1)\)/ var isDownMap = {}; var downImgFromCss = function (URL) { http.get(URL, function(res) { //console.log(path.resolve(process.cwd(), 'index.min.css')) //res.pipe(fs.createWriteStream(path.resolve(process.cwd(), 'index.min.css'))); var body = ""; res.setEncoding('utf8'); res.on('data', function (chunk) { body += chunk; }); res.on('end', function () { var match = body.match(reg); for (var i = 0, len = match.length; i < len; i++){ var m = match[i].match(reg2); if (m && m[2]) { var url = m[2]; let imgUrl = r_url.resolve(URL, url); if (!isDownMap[imgUrl]) { var uo = r_url.parse(imgUrl); let filepath = CWD + '/' + uo.hostname + uo.pathname; makedir(path.dirname(filepath), function () { http.get(imgUrl, function (res) { res.pipe(fs.createWriteStream(filepath)); }) }) isDownMap[imgUrl] = 1; } } } }); }); } var URLS = process.argv[2].split(','); var CWD = process.cwd(); //下載資源 URLS.forEach(function (URL) { var uo = r_url.parse(URL); var filepath; if (uo.pathname == '/' || uo.pathname == '') { filepath = CWD + '/' + uo.hostname + '/index.html'; } else { filepath = CWD + '/' + uo.hostname + uo.pathname; } makedir(path.dirname(filepath), function () { http.get(URL, function (res) { if (URL.indexOf('.css') != -1 || (res.headers["content-type"] && res.headers["content-type"].indexOf('text/css')!= -1)) { console.log('down images form css file:' + URL + '.'); downImgFromCss(URL); } res.pipe(fs.createWriteStream(filepath)); }) }); });
down.js downHtml.js 放在同一個資料夾下 通過下列 cmd 執行
D:\phantomjs-2.0.0-windows\bin\phantomjs.exe down.js http://www.softwhy.com/
相關文章
- NodeJS使用PhantomJs抓取網頁NodeJS網頁
- Android通過輔助功能實現搶微信紅包原理簡單介紹Android
- 簡單介紹ASP.NET Core實現檔案上傳和下載ASP.NET
- 簡單介紹numpy實現RNN原理實現RNN
- 簡單介紹NMS的實現方法
- nodeJS 爬蟲,通過Puppeteer實現滾動載入NodeJS爬蟲
- NodeJS專案基礎結構簡單介紹NodeJS
- 簡單介紹如何通過註解獲取反射的值反射
- 簡單介紹shell中的curl網路請求的實現
- RPC模式的介紹以及簡單的實現RPC模式
- 簡單介紹SpringMVC RESTFul實現列表功能SpringMVCREST
- django 網站實現簡單分頁Django網站
- 簡單介紹一下 JSONJSON
- 簡單介紹Java String Methods(下)Java
- 單步除錯理解webpack裡通過require載入nodejs原生模組實現原理除錯WebUINodeJS
- 網路 IO 模型簡單介紹模型
- 簡單介紹Go 字串比較的實現示例Go字串
- 簡單介紹VBS 批次Ping的專案實現
- 簡單介紹pytorch中log_softmax的實現PyTorch
- 簡單介紹python中的單向連結串列實現Python
- RSA加密演算法簡單介紹以及python實現加密演算法Python
- 簡單介紹Android自定義View實現時鐘功能AndroidView
- RPC簡單介紹RPC
- Python簡單介紹Python
- KVM簡單介紹
- RMI簡單介紹
- HTML簡單介紹HTML
- HTML 簡單介紹HTML
- JavaScript 簡單介紹JavaScript
- CSS 簡單介紹CSS
- ajax簡單介紹
- SVG簡單介紹SVG
- Clickjacking簡單介紹
- 【Pandas】簡單介紹
- Map簡單介紹
- JSON簡單介紹JSON
- ActiveMQ簡單介紹MQ
- 簡單介紹Angular單元測試之事件觸發的實現Angular事件
- 最簡單的AI換臉軟體,roop下載介紹(可直播)AIOOP