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的模块写法入门(实例代码)
Mar 07 NodeJs
在NodeJS中启用ECMAScript 6小结(windos以及Linux)
Jul 15 NodeJs
Nodejs全栈框架StrongLoop推荐
Nov 09 NodeJs
NodeJS制作爬虫全过程
Dec 22 NodeJs
Nodejs中读取中文文件编码问题、发送邮件和定时任务实例
Jan 01 NodeJs
nodejs微信公众号支付开发
Sep 19 NodeJs
win系统下nodejs环境安装配置
May 04 NodeJs
nodejs+websocket实时聊天系统改进版
May 18 NodeJs
Nodejs搭建wss服务器教程
May 24 NodeJs
NodeJs实现定时任务的示例代码
Dec 05 NodeJs
详解webpack打包nodejs项目(前端代码)
Sep 19 NodeJs
nodejs实现获取本地文件夹下图片信息功能示例
Jun 22 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
在IIS上安装PHP4.0正式版
2006/10/09 PHP
隐藏你的.php文件的实现方法
2007/03/19 PHP
PHP教程 基本语法
2009/10/23 PHP
解决PHP里大量数据循环时内存耗尽的方法
2015/10/10 PHP
YII Framework框架教程之使用YIIC快速创建YII应用详解
2016/03/15 PHP
PHP编程实现微信企业向用户付款的方法示例
2017/07/26 PHP
原生php实现excel文件读写的方法分析
2018/04/25 PHP
初探jquery——表单应用范例
2007/02/20 Javascript
jquery 图片轮换效果
2010/07/29 Javascript
用JS提交参数创建form表单在FireFox中遇到的问题
2013/01/16 Javascript
jquery怎样实现ajax联动框(二)
2013/03/08 Javascript
自己动手实现jQuery Callbacks完整功能代码详解
2013/11/25 Javascript
javascript调试之DOM断点调试法使用技巧分享
2014/04/15 Javascript
百度地图API之本地搜索与范围搜索
2015/07/30 Javascript
jQuery插件FusionCharts实现的2D面积图效果示例【附demo源码下载】
2017/03/06 Javascript
vue实现表格数据的增删改查
2017/07/10 Javascript
node.js 用socket实现聊天的示例代码
2017/10/17 Javascript
Nodejs中的JWT和Session的使用
2018/08/21 NodeJs
JavaScript数据结构与算法之检索算法示例【二分查找法、计算重复次数】
2019/02/22 Javascript
js尾调用优化的实现
2019/05/23 Javascript
layui lay-verify form表单自定义验证规则详解
2019/09/18 Javascript
Bootstrap简单实用的表单验证插件BootstrapValidator用法实例详解
2020/03/29 Javascript
21行Python代码实现拼写检查器
2016/01/25 Python
shelve  用来持久化任意的Python对象实例代码
2016/10/12 Python
Python实现找出数组中第2大数字的方法示例
2018/03/26 Python
Python+OpenCV+图片旋转并用原底色填充新四角的例子
2019/12/12 Python
对tensorflow中cifar-10文档的Read操作详解
2020/02/10 Python
Europcar意大利:汽车租赁
2019/07/07 全球购物
项目经理聘任书
2014/03/29 职场文书
个人批评与自我批评发言稿
2014/09/28 职场文书
违纪检讨书范文
2015/01/27 职场文书
档案工作个人总结
2015/03/03 职场文书
党员干部廉政承诺书
2015/04/28 职场文书
2019秋季运动会口号
2019/06/25 职场文书
两行代码解决Jupyter Notebook中文不能显示的问题
2021/04/24 Python
3050和2060哪个好 性能差多少 差距有多大 谁更有性价比
2022/06/17 数码科技