功能其实很见简单,通过 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 下载网页及相关资源文件的更多相关文章

  1. nodejs下载网页所有图片

    前言 昨天一番发了一篇批量下载手机壁纸的文章,分享了抓取到的美图给小伙伴,然后一番就美美的去碎觉了. 早上起来看到有小伙伴在日更群里说有没有狗哥的?憨憨的一番以为就是狗的图片,于是就发了几张昨天抓取的 ...

  2. 使用CInternetSession CHttpFile下载网页链接地址的文件

    思路很清晰,使用CInternetSession创建CHttpFile对象.然后对该对象获取文件信息.进行文件读写操作均可. void DownloadFile(LPCTSTR szURL, LPCT ...

  3. 怎样下载网页中的js文件?

    1.按下F12,会看到调试的界面,如下图所示,先点击最上面的Resources选项,Frames--(你想下载的网址)--Script,下面就是全部的js文件啦,网站的图片啊什么的都可以下载了.

  4. 实现iOS图片等资源文件的热更新化(四): 一个最小化的补丁更新逻辑

    简介 以前写过一个补丁更新的文章,此处会做一个更精简的最小化实现,以便于集成.为了使逻辑具有通用性,将剥离对AFNetworking和ReativeCocoa的依赖.原来的文章,可以先看这里: htt ...

  5. Linux使用Aria2命令下载BT种子/磁力/直链文件 转载

    Linux使用Aria2命令下载BT种子/磁力/直链文件 博主: Rat's 发布时间:2017 年 10 月 10 日 26725 次浏览 8 条评论 1073 字数 分类:主机教程 首页 正文 分 ...

  6. (原)Struts 相关资源下载

    官网:http://struts.apache.org 点击[Download],进入页面如下,可以看到下载的资源: 点击[struts-2.3.20-all.zip],就能获取Struts2项目所有 ...

  7. KaliLinuxNetHunter教程下载相关资源

    KaliLinuxNetHunter教程下载相关资源 当用户将刷机工具准备完后,则需要下载ROM包.ROM是ROM image(只读内存镜像)的简称,常用于手机定制系统.一般手机刷机的过程,就是将只读 ...

  8. 打造百度网盘备份利器:自动备份Linux VPS文件和多线程下载百度网盘资源

    前一段时间国内的各大网盘百度云盘,金山快盘,360云盘,华为网盘为争夺用户上演空间容量博弈,网盘商们还固执地以为中国的网民都不懂网络技术,可以像某公司那样用一些数字的手段来忽悠用户,参与到网盘商的数字 ...

  9. 官网下载java相关资源

    官网下载java相关资源 官网地址:http://www.oracle.com 一.下载JDK 1.首先进入Downloads >> Java For Developers,如图 2.点击 ...

随机推荐

  1. vbox下安装 linux 64 bit出现“kernel requires an x86_64 cpu

        今天在vbox下安装linux 64bit出现"kernel requires an x86_64 cpu, but only detected "的错误,网上有很多文章介 ...

  2. Linux 08

    1按照视频里提出的几点要求完善使ls命令模仿windows下dir命令输出的脚本 {printf $6" "$7" \t";if (substr($1,1,1) ...

  3. hdu1251统计难题

    Problem Description Ignatius最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的单词出现),现在老师要他统计出以某个字符串为前缀的单词数量(单词本身也是自己 ...

  4. 记一次phpStudy apache启动后自动关闭 修改过程

    第一种可能原因:路径包含中文 .添加站点 2.重启服务 3.遇见问题 apache 刚启动,1秒钟中后就停止 4.解决问题 发现是自己添加的网站中包含中文路径的问题,建议不要在自己的网站目录下包含中文 ...

  5. 【11.2noip冲刺赛】 循环整数 (分段打表)

    [问题描述]moreD在学习完循环小数之后发现循环是个很美好的性质.自己只需要记住短短的循环节以及循环次数(次数大于1,且是整数)就可以记住整个数字了.因为背诵数字变得方便了,moreD决定背诵[L, ...

  6. Android Studio 没有assets目录的问题

    Where to place the assets folder in Android Studio   If you are having problems with asset files not ...

  7. Scrapy入门程序点评

    1,引言 在<Scrapy的架构初探>一文,我基于爬虫开发的经验对Scrapy官网文章作了点评和解读,事件驱动的异步处理架构.极强的模块化等是个绝好的框架,接着我细读了官网的<Scr ...

  8. mongo设计(三)

    原文:http://blog.mongodb.org/post/88473035333/6-rules-of-thumb-for-mongodb-schema-design-part-3 By Wil ...

  9. VS 2012 插件卸载(删除自己安装的插件)

    给VS 装了一个插件,装完之后感觉别扭,所以想卸载,[工具]--> [扩展和更新]-->[找到想要卸载的插件点击一下就会出现禁用或卸载]

  10. LPC同STM32的比较

    Cortex-M3是新兴起来的一种ARM7的核,而ARM7TDMI是一种传统的经典的ARM内核.我们就抛开这一切,来比较一下两则的异同. 我们就在以下平台上比较吧: STMicoelectronics ...