nodejs通过phantomjs实现下载网页


Posted in NodeJs onMay 04, 2015

功能其实很见简单,通过 phantomjs.exe 采集 url 加载的资源,通过子进程的方式,启动nodejs 加载所有的资源,对于css的资源,匹配css内容,下载里面的url资源

当然功能还是很简单的,在响应式设计和异步加载的情况下,还是有很多资源没有能够下载,需要根据实际情况处理下

 首先当然是下载 nodejs 和 phantomjs

下面是 phantomjs.exe 执行的 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();
      })      
    }
  });
}

下面是对应的node运行的 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 放在同一个文件夹下 通过下列 cmd 运行

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

以上所述就是本文的全部内容了,希望大家能够喜欢。

NodeJs 相关文章推荐
利用NodeJS的子进程(child_process)调用系统命令的方法分享
Jun 05 NodeJs
我的NodeJs学习小结(一)
Jul 06 NodeJs
详谈nodejs异步编程
Dec 04 NodeJs
NodeJS学习笔记之Connect中间件模块(二)
Jan 27 NodeJs
nodejs通过phantomjs实现下载网页
May 04 NodeJs
使用NodeJs 开发微信公众号(三)微信事件交互实例
Mar 02 NodeJs
nodejs和php实现图片访问实时处理
Jan 05 NodeJs
Nodejs进阶之服务端字符编解码和乱码处理
Sep 04 NodeJs
Mac下通过brew安装指定版本的nodejs教程
May 17 NodeJs
Nodejs 识别图片类型的方法
Aug 15 NodeJs
Nodejs 微信小程序消息推送的实现
Jan 20 NodeJs
NodeJS和浏览器中this关键字的不同之处
Mar 03 NodeJs
nodejs实现HTTPS发起POST请求
Apr 23 #NodeJs
PHP和NodeJs开发的应用如何共用Session
Apr 16 #NodeJs
Nodejs学习笔记之测试驱动
Apr 16 #NodeJs
Nodejs学习笔记之入门篇
Apr 16 #NodeJs
Windows系统下使用Sublime搭建nodejs环境
Apr 13 #NodeJs
nodejs开发微博实例
Mar 25 #NodeJs
nodejs中实现阻塞实例
Mar 24 #NodeJs
You might like
可定制的PHP缩略图生成程式(需要GD库支持)
2007/03/06 PHP
php的array_multisort()使用方法介绍
2012/05/16 PHP
php源码分析之DZX1.5随机数函数random用法
2015/06/17 PHP
PHP版QQ互联OAuth示例代码分享
2015/07/05 PHP
php实现图片上传时添加文字和图片水印技巧
2020/04/18 PHP
php DES加密算法实例分析
2019/09/18 PHP
javascript 客户端验证上传图片的大小(兼容IE和火狐)
2009/08/15 Javascript
JavaScript 输入框内容格式验证代码
2010/02/11 Javascript
JS时间选择器 兼容IE6,7,8,9
2012/06/26 Javascript
JQuery中form验证出错信息的查看方法
2013/10/08 Javascript
JavaScript中for循环的使用详解
2015/06/03 Javascript
js正则取值的结果数组调试方法
2018/10/10 Javascript
jQuery实现的五星点评功能【案例】
2019/02/18 jQuery
详解vuex的简单todolist例子
2019/07/14 Javascript
Node.js fs模块(文件模块)创建、删除目录(文件)读取写入文件流的方法
2019/09/03 Javascript
python批量添加zabbix Screens的两个脚本分享
2017/01/16 Python
django 中QuerySet特性功能详解
2019/07/25 Python
python中return如何写
2020/06/18 Python
英国、欧洲和全球租车服务:Avis英国
2016/08/29 全球购物
Original Penguin英国官方网站:美国著名休闲时装品牌
2016/10/30 全球购物
澳大利亚在线百货商店:Real Smart
2017/08/13 全球购物
linux面试题参考答案(7)
2012/10/29 面试题
百度软件工程师职位
2013/02/14 面试题
园长自我鉴定
2013/10/06 职场文书
银行实习生的自我评价
2014/01/13 职场文书
学习型党组织心得体会
2014/09/12 职场文书
详细的本科生职业生涯规划范文
2014/09/16 职场文书
2014年学生管理工作总结
2014/12/20 职场文书
横店影视城导游词
2015/02/06 职场文书
实习指导老师意见
2015/06/04 职场文书
新闻稿怎么写
2015/07/18 职场文书
教师个人工作总结范文2015
2015/10/14 职场文书
2019员工保密协议书(3篇)
2019/09/23 职场文书
详解Python类和对象内容
2021/06/22 Python
AngularJS实现多级下拉框
2022/03/25 Javascript
vue二维数组循环嵌套方式 循环数组、循环嵌套数组
2022/04/24 Vue.js