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教程 安装express及配置app.js文件的详细步骤
May 11 NodeJs
NodeJS Express框架中处理404页面一个方式
May 28 NodeJs
NodeJS学习笔记之Connect中间件模块(一)
Jan 27 NodeJs
nodejs通过phantomjs实现下载网页
May 04 NodeJs
nodejs创建web服务器之hello world程序
Aug 20 NodeJs
使用Angular和Nodejs、socket.io搭建聊天室及多人聊天室
Aug 21 NodeJs
Nodejs的express使用教程
Nov 23 NodeJs
nodejs个人博客开发第二步 入口文件
Apr 12 NodeJs
Nodejs实现多房间简易聊天室功能
Jun 20 NodeJs
NodeJS简单实现WebSocket功能示例
Feb 10 NodeJs
Nodejs使用Mongodb存储与提供后端CRD服务详解
Sep 04 NodeJs
监控Nodejs的性能实例代码
Jul 02 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+jQuery实现自动补全功能源码
2013/05/15 PHP
解析PHP汉字转换拼音的类
2013/06/18 PHP
php5.5中类级别的常量使用介绍
2013/10/02 PHP
php共享内存段示例分享
2014/01/20 PHP
PHP MySql增删改查的简单实例
2016/06/21 PHP
浅谈Yii乐观锁的使用及原理
2017/07/25 PHP
Json对象与Json字符串互转(4种转换方式)
2013/03/27 Javascript
jQuery超赞的评分插件(8款)
2015/08/20 Javascript
vue实现可增删查改的成绩单
2016/10/27 Javascript
js获取json中key所对应的value值的简单方法
2020/06/17 Javascript
用最少的JS代码写出贪吃蛇游戏
2018/01/12 Javascript
详解React native fetch遇到的坑
2018/08/30 Javascript
React项目动态设置title标题的方法示例
2018/09/26 Javascript
JS添加或删除HTML dom元素的方法实例分析
2019/03/05 Javascript
vue学习笔记之slot插槽用法实例分析
2020/02/29 Javascript
[16:21]教你分分钟做大人:圣堂刺客
2014/12/03 DOTA
Python日期操作学习笔记
2008/10/07 Python
python实现bitmap数据结构详解
2014/02/17 Python
Python中使用wxPython开发的一个简易笔记本程序实例
2015/02/08 Python
python实现内存监控系统
2021/03/07 Python
virtualenv 指定 python 解释器的版本方法
2018/10/25 Python
Python3.7基于hashlib和Crypto实现加签验签功能(实例代码)
2019/12/04 Python
Django通用类视图实现忘记密码重置密码功能示例
2019/12/17 Python
python图形开发GUI库wxpython使用方法详解
2020/02/14 Python
CSS3伪类选择器:nth-child()
2009/04/02 HTML / CSS
网吧收银员岗位职责
2013/12/14 职场文书
金融管理应届生求职信
2014/02/20 职场文书
艺术设计专业个人求职信
2014/04/10 职场文书
2014大学生党员评议个人总结
2014/09/22 职场文书
批评与自我批评发言稿
2014/10/15 职场文书
实习单位证明范例
2014/11/17 职场文书
2015年酒店服务员工作总结
2015/05/18 职场文书
宝葫芦的秘密观后感
2015/06/11 职场文书
MongoDB balancer的使用详解
2021/04/30 MongoDB
解析MySQL索引的作用
2022/03/03 MySQL
电脑关机速度很慢怎么办 提升电脑关机速度设置教程
2022/04/08 数码科技