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 win7下安装方法
May 24 NodeJs
Ubuntu中搭建Nodejs开发环境过程分享
Jun 01 NodeJs
Nodejs+express+html5 实现拖拽上传
Aug 08 NodeJs
NodeJS实现微信公众号关注后自动回复功能
May 31 NodeJs
手把手教你把nodejs部署到linux上跑出hello world
Jun 19 NodeJs
nodejs构建本地web测试服务器 如何解决访问静态资源问题
Jul 14 NodeJs
nodejs密码加密中生成随机数的实例代码
Jul 17 NodeJs
详解nodejs通过代理(proxy)发送http请求(request)
Sep 22 NodeJs
使用nodejs+express实现简单的文件上传功能
Dec 27 NodeJs
nodejs+mongodb+vue前后台配置ueditor的示例代码
Jan 02 NodeJs
Nodejs Express 通过log4js写日志到Logstash(ELK)
Aug 30 NodeJs
nodejs通过钉钉群机器人推送消息的实现代码
May 05 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
如何在smarty中增加类似foreach的功能自动加载数据
2013/06/26 PHP
CodeIgniter记录错误日志的方法全面总结
2016/05/17 PHP
详细对比php中类继承和接口继承
2018/10/11 PHP
YII2框架中日志的配置与使用方法实例分析
2020/03/18 PHP
js实现的网页颜色代码表全集
2007/07/17 Javascript
javascript Demo模态窗口
2009/12/06 Javascript
Google排名中的10个最著名的 JavaScript库
2010/04/27 Javascript
基于jQuery实现表单提交验证
2014/11/24 Javascript
JavaScript中的标签语句用法分析
2015/02/10 Javascript
浅析AngularJS中的指令
2016/03/20 Javascript
简单的js计算器实现
2016/10/26 Javascript
微信小程序  action-sheet详解及实例代码
2016/11/09 Javascript
Jquery on绑定的事件 触发多次实例代码
2016/12/08 Javascript
jQuery Validate插件自定义验证规则的方法
2016/12/27 Javascript
深入讲解xhr(XMLHttpRequest)/jsonp请求之abort
2017/07/26 Javascript
微信小程序实现全国机场索引列表
2018/01/31 Javascript
详解Vue.js v-for不支持IE9的解决方法
2018/12/29 Javascript
JS实现指定区域的全屏显示功能示例
2019/04/25 Javascript
百度小程序之间的页面通信过程详解
2019/07/18 Javascript
js数据类型转换与流程控制操作实例分析
2019/12/18 Javascript
python基础教程之面向对象的一些概念
2014/08/29 Python
python实现按行切分文本文件的方法
2016/04/18 Python
python2.x实现人民币转大写人民币
2018/06/20 Python
Django中使用极验Geetest滑动验证码过程解析
2019/07/31 Python
Python大数据之从网页上爬取数据的方法详解
2019/11/16 Python
在python中做正态性检验示例
2019/12/09 Python
解决python对齐错误的方法
2020/07/16 Python
HTML5不支持标签和新增标签详解
2016/06/27 HTML / CSS
华润集团网上药店:健一网
2016/09/19 全球购物
实习医生自我评价
2013/09/22 职场文书
对公司合理化的建议书
2014/03/12 职场文书
党员个人查摆剖析材料
2014/10/16 职场文书
国庆节慰问信
2015/02/15 职场文书
党支部培养考察意见
2015/06/02 职场文书
2015年物业管理员工工作总结
2015/10/15 职场文书
Python办公自动化之教你如何用Python将任意文件转为PDF格式
2021/06/28 Python