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学习笔记之Http模块
Jan 13 NodeJs
nodejs和php实现图片访问实时处理
Jan 05 NodeJs
nodejs服务搭建教程 nodejs访问本地站点文件
Apr 07 NodeJs
详解nodejs异步I/O和事件循环
Jun 07 NodeJs
nodejs构建本地web测试服务器 如何解决访问静态资源问题
Jul 14 NodeJs
NodeJS使用七牛云存储上传文件的方法
Jul 24 NodeJs
详解IWinter 一个路由转控制器的 Nodejs 库
Nov 15 NodeJs
nodejs搭建本地服务器轻松解决跨域问题
Mar 21 NodeJs
nodejs 十六进制字符串型数据与btye型数据相互转换
Jul 30 NodeJs
Nodejs中怎么实现函数的串行执行
Mar 02 NodeJs
Nodejs环境实现socket通信过程解析
Jul 03 NodeJs
详解nodejs内置模块
May 06 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
极典R601SW收音机
2021/03/02 无线电
php压缩多个CSS为一个css的代码并缓存
2011/04/21 PHP
Laravel定时任务的每秒执行代码
2019/10/22 PHP
laravel5.6实现数值转换
2019/10/23 PHP
详解CSS样式中的 !important * _ 符号
2021/03/09 HTML / CSS
CCPry JS类库 代码
2009/10/30 Javascript
JavaScript 题型问答有答案参考
2010/02/17 Javascript
NODE.JS加密模块CRYPTO常用方法介绍
2014/06/05 Javascript
使用jQuery的attr方法来修改onclick值
2014/07/07 Javascript
jQuery中each()、find()和filter()等节点操作方法详解(推荐)
2016/05/25 Javascript
jQuery实现点击行选中或取消CheckBox的方法
2016/08/01 Javascript
angular route中使用resolve在uglify压缩后问题解决
2016/09/21 Javascript
微信小程序 Button 组件详解及简单实例
2017/01/10 Javascript
JS二叉树的简单实现方法示例
2017/04/05 Javascript
微信小程序自定义toast实现方法详解【附demo源码下载】
2017/11/28 Javascript
node.js中fs文件系统目录操作与文件信息操作
2018/02/24 Javascript
Javascript实现秒表倒计时功能
2018/11/17 Javascript
VueCli3.0中集成MockApi的方法示例
2019/07/05 Javascript
小程序实现多个选项卡切换
2020/06/19 Javascript
Vue将props值实时传递 并可修改的操作
2020/08/09 Javascript
深入理解javascript中的this
2021/02/08 Javascript
Python远程桌面协议RDPY安装使用介绍
2015/04/15 Python
简单解析Django框架中的表单验证
2015/07/17 Python
python实现实时视频流播放代码实例
2020/01/11 Python
python如何设置静态变量
2020/09/07 Python
python 读取、写入txt文件的示例
2020/09/27 Python
Python  Asyncio模块实现的生产消费者模型的方法
2021/03/01 Python
欧洲最大的婴幼儿服装及内衣公司:Petit Bateau(小帆船)
2016/08/16 全球购物
vivo智能手机官方商城:vivo
2016/09/22 全球购物
自我鉴定怎么写
2013/12/05 职场文书
三年级科学教学反思
2014/01/29 职场文书
高中家长寄语
2014/04/02 职场文书
《雨点儿》教学反思
2014/04/14 职场文书
《大作家的小老师》教学反思
2014/04/16 职场文书
幼儿园迎国庆65周年活动策划方案
2014/09/16 职场文书
Oracle安装TNS_ADMIN环境变量设置参考
2021/11/01 Oracle