Nodejs phantomjsによるダウンロードページの実現
4833 ワード
機能は簡単ですexeはurlのロードする資源を採集して、サブプロセスの方式を通じて、nodejsを起動してすべての資源をロードして、cssの資源に対して、cssの内容にマッチして、中のurlの資源をダウンロードします
もちろん機能は簡単ですが、応答型設計や非同期ロードの場合、ダウンロードできないリソースが多いので、実際の状況に応じて処理する必要があります.
まずnodejsとphantomjsをダウンロードします
次はphantomjsです.exeが実行するdown.js
以下は、対応するnodeが実行するdownHtmlである.js
down.js downHtml.jsは同じフォルダの下に置いて以下のcmdで実行します
D:\phantomjs-2.0.0-windows\bin\phantomjs.exe down.js http://www.youku.com/
以上が本文のすべてですが、お好きになってください.
もちろん機能は簡単ですが、応答型設計や非同期ロードの場合、ダウンロードできないリソースが多いので、実際の状況に応じて処理する必要があります.
まず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 ');
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/
以上が本文のすべてですが、お好きになってください.