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创建基础应用并应用模板引擎
Apr 12 NodeJs
nodejs和php实现图片访问实时处理
Jan 05 NodeJs
nodejs入门教程三:调用内部和外部方法示例
Apr 24 NodeJs
NodeJs安装npm包一直失败的解决方法
Apr 28 NodeJs
nodejs+websocket实时聊天系统改进版
May 18 NodeJs
关于Mac下安装nodejs、npm和cnpm的教程
Apr 11 NodeJs
Linux Centos7.2下安装nodejs&amp;npm配置全局路径的教程
May 15 NodeJs
详解NodeJs开发微信公众号
May 25 NodeJs
nodejs 生成和导出 word的实例代码
Jul 31 NodeJs
手把手教你如何使用nodejs编写cli命令行
Nov 05 NodeJs
NodeJs 实现简单WebSocket即时通讯的示例代码
Aug 05 NodeJs
nodejs的安装使用与npm的介绍
Sep 11 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+SQL 注入攻击的技术实现以及预防办法
2010/12/29 PHP
PHP实现在数据库百万条数据中随机获取20条记录的方法
2017/04/19 PHP
Yii框架安装简明教程
2020/05/15 PHP
jquery批量设置属性readonly和disabled的方法
2014/01/24 Javascript
JavaScript 变量、作用域及内存
2015/04/08 Javascript
学习使用Bootstrap页面排版样式
2017/05/11 Javascript
vue实现element表格里表头信息提示功能(推荐)
2019/11/20 Javascript
如何在 Vue 表单中处理图片
2021/01/26 Vue.js
[04:09]2018年度DOTA2社区贡献奖-完美盛典
2018/12/16 DOTA
NumPy 如何生成多维数组的方法
2018/02/05 Python
python实现人脸识别经典算法(一) 特征脸法
2018/03/13 Python
对Python中Iterator和Iterable的区别详解
2018/10/18 Python
python开发之anaconda以及win7下安装gensim的方法
2019/07/05 Python
Python定时任务APScheduler的实例实例详解
2019/07/22 Python
Python将主机名转换为IP地址的方法
2019/08/14 Python
TensorFlow tf.nn.conv2d实现卷积的方式
2020/01/03 Python
python 命名规范知识点汇总
2020/02/14 Python
python实现电子词典
2020/03/03 Python
10行Python代码实现Web自动化管控的示例代码
2020/08/14 Python
python 无损批量压缩图片(支持保留图片信息)的示例
2020/09/22 Python
python中Array和DataFrame相互转换的实例讲解
2021/02/03 Python
使用Python制作一盏 3D 花灯喜迎元宵佳节
2021/02/26 Python
聊聊Python pandas 中loc函数的使用,及跟iloc的区别说明
2021/03/03 Python
玩转CSS3色彩
2010/01/16 HTML / CSS
美国瑜伽品牌:Gaiam
2017/10/31 全球购物
世界上最值得信赖的多日游在线市场:TourRadar
2018/07/20 全球购物
货代行业个人求职简历的自我评价
2013/10/22 职场文书
销售文员岗位职责
2013/11/29 职场文书
竞选副班长演讲稿
2014/04/24 职场文书
无传销社区工作方案
2014/05/13 职场文书
数学教师个人工作总结
2015/02/06 职场文书
基层组织建设年活动总结
2015/05/09 职场文书
优秀教师工作总结2015
2015/07/22 职场文书
护理自荐信
2019/05/14 职场文书
2019生态环境保护倡议书!
2019/07/03 职场文书
oracle DGMGRL ORA-16603报错的解决方法(DG Broker)
2021/04/06 Oracle