亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

nodejs通過(guò)phantomjs實(shí)現(xiàn)下載網(wǎng)頁(yè)

 更新時(shí)間:2015年05月04日 09:04:27   投稿:hebedich  
這篇文章主要介紹了nodejs通過(guò)phantomjs實(shí)現(xiàn)下載網(wǎng)頁(yè)的方法,有需要的小伙伴可以參考下。

功能其實(shí)很見簡(jiǎn)單,通過(guò) phantomjs.exe 采集 url 加載的資源,通過(guò)子進(jìn)程的方式,啟動(dòng)nodejs 加載所有的資源,對(duì)于css的資源,匹配css內(nèi)容,下載里面的url資源

當(dāng)然功能還是很簡(jiǎn)單的,在響應(yīng)式設(shè)計(jì)和異步加載的情況下,還是有很多資源沒有能夠下載,需要根據(jù)實(shí)際情況處理下

 首先當(dāng)然是下載 nodejs 和 phantomjs

下面是 phantomjs.exe 執(zhí)行的 down.js

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

下面是對(duì)應(yīng)的node運(yùn)行的 downHtml.js

"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 放在同一個(gè)文件夾下 通過(guò)下列 cmd 運(yùn)行

D:\phantomjs-2.0.0-windows\bin\phantomjs.exe down.js http://www.youku.com/

以上所述就是本文的全部?jī)?nèi)容了,希望大家能夠喜歡。

相關(guān)文章

  • node后端與Vue前端跨域處理方法詳解

    node后端與Vue前端跨域處理方法詳解

    從目前我了解的情況來(lái)看,前后端跨域使用的方式有很多種,這里記錄我使用最順手的一種,即在后端使用cors跨域,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • koa2服務(wù)配置SSL的實(shí)現(xiàn)方法

    koa2服務(wù)配置SSL的實(shí)現(xiàn)方法

    這篇文章主要介紹了koa2服務(wù)配置SSL的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-05-05
  • 可能是全網(wǎng)最詳細(xì)的nodejs卸載和安裝教程

    可能是全網(wǎng)最詳細(xì)的nodejs卸載和安裝教程

    npm的中文意思為"node包管理器",是Node.js平臺(tái)的默認(rèn)包管理工具,會(huì)隨著Nodejs一起安裝,npm管理對(duì)應(yīng)node.js的第三方插件,下面這篇文章主要給大家介紹了關(guān)于nodejs卸載和安裝教程的相關(guān)資料,這可能全網(wǎng)最詳細(xì)的教程了,需要的朋友可以參考下
    2023-05-05
  • 詳細(xì)分析Node.js 模塊系統(tǒng)

    詳細(xì)分析Node.js 模塊系統(tǒng)

    這篇文章主要介紹了Node.js 模塊系統(tǒng)的的相關(guān)資料,文中講解非常詳細(xì),供大家參考和學(xué)習(xí),感興趣的朋友可以了解下
    2020-06-06
  • 詳解Node.js讀寫中文內(nèi)容文件操作

    詳解Node.js讀寫中文內(nèi)容文件操作

    在本篇文章中我們給大家分享了關(guān)于Node.js讀寫中文內(nèi)容文件操作的相關(guān)知識(shí)點(diǎn)內(nèi)容,有需要的朋友們可以學(xué)習(xí)下。
    2018-10-10
  • 如何構(gòu)建一個(gè)?NodeJS?影院微服務(wù)并使用?Docker?部署

    如何構(gòu)建一個(gè)?NodeJS?影院微服務(wù)并使用?Docker?部署

    微服務(wù)是一個(gè)單獨(dú)的自包含單元,與其他許多單元一起構(gòu)成一個(gè)大型應(yīng)用程序,這篇文章主要介紹了如何構(gòu)建一個(gè)NodeJS影院微服務(wù)并使用Docker部署,在這個(gè)系列中,將構(gòu)建一個(gè) NodeJS 微服務(wù),并使用 Docker Swarm 集群進(jìn)行部署,需要的朋友可以參考下
    2023-08-08
  • 關(guān)于NodeJs和JAVA建立socket連接方式

    關(guān)于NodeJs和JAVA建立socket連接方式

    這篇文章主要介紹了關(guān)于NodeJs和JAVA建立socket連接方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • 編譯打包nodejs服務(wù)代碼如何部署到服務(wù)器

    編譯打包nodejs服務(wù)代碼如何部署到服務(wù)器

    這篇文章主要介紹了編譯打包nodejs服務(wù)代碼如何部署到服務(wù)器問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-10-10
  • windows 下安裝nodejs 環(huán)境變量設(shè)置

    windows 下安裝nodejs 環(huán)境變量設(shè)置

    windows 下安裝nodejs 了,也安裝了npm, 但是有時(shí)候切不能直接用request(‘ws’)這一類的東西.我覺得是確實(shí)環(huán)境變量或其他設(shè)置有問題,能否給個(gè)完整的設(shè)置方案:
    2017-02-02
  • 用NodeJS實(shí)現(xiàn)批量查詢地理位置的經(jīng)緯度接口

    用NodeJS實(shí)現(xiàn)批量查詢地理位置的經(jīng)緯度接口

    最近要實(shí)現(xiàn)一個(gè)顯示各個(gè)城市信息的功能,后臺(tái)一看包含一堆城市的excel,發(fā)現(xiàn)不僅有每個(gè)省的直轄市,還有二三線等的城市,數(shù)量還不少,一個(gè)個(gè)去查還挺浪費(fèi)時(shí)間的,那為什么不寫個(gè)腳本去實(shí)現(xiàn)批量查詢呢。
    2016-08-08

最新評(píng)論