功能其实很见简单,通过 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/
以上所述就是本文的全部内容了,希望大家能够喜欢。
我的客户机有一个GraphQL API运行在Google cloud Run上。 我已经使用了一个服务帐户进行身份验证,并访问了gcloud命令行工具。 当使用gcloud命令行时,如下所示: 我可以生成一个令牌,用于向API发出post请求。这工作,我可以成功地从邮递员,失眠和从我的nodejs应用程序的api发布请求。 这将输出一个“承载”令牌: 但是,这个承载令牌并不像上面的那样工作,并且在
本文向大家介绍Nodejs实现批量下载妹纸图,包括了Nodejs实现批量下载妹纸图的使用技巧和注意事项,需要的朋友参考一下 听说最近下载妹子图很火? Nodejs (javascrpt)自然不能落后~ 虽然从没写过像样的Nodejs程序,但作为至少翻过书的前端同学来说,Nodejs用得还蛮顺手的哈~ 花了一点事件学习了下Nodejs的网页获取和文件下载方法,没事乱捣腾就写了这个半成品的下载器 使用
问题内容: 我正在使用selenium对超链接执行单击功能,该超链接已加载在特定页面上。该脚本适用于Google chrome,但不适用于phantomjs。为什么这不起作用? 这在chrome中有效,但始终会打开一个新的chrome窗口以完成任务。我读到我应该使用phantomjs使其在后台运行,但是当我将驱动程序切换到phantomjs时,下载似乎没有完成。屏幕截图已抓取,并且确实在正确的页面
我已经尝试了。所有的失败都表明协议必须是HTTP或HTTPS。 Node有可用的FTP客户端(在npmjs上可用)。但是,根据他们的文档,他们需要创建一个到FTP服务器的连接,更改目录,然后下载它。 有什么简单的解决方法吗?
本文向大家介绍android通过okhttpClient下载网页内容的实例代码,包括了android通过okhttpClient下载网页内容的实例代码的使用技巧和注意事项,需要的朋友参考一下 有时候我们需要通过自己的缓存机制来缓存网页内容,当没有网的时候显示本地的缓存,当有网的时候取最新的继续缓存到本地。 主要机制: 通过AsyncTask异步AsyncTask请求,将得到的response.bo
本文向大家介绍ASP下通过Adodb.Stream实现多线程下载大文件,包括了ASP下通过Adodb.Stream实现多线程下载大文件的使用技巧和注意事项,需要的朋友参考一下 有个朋友 做 某种小众音乐交换站的(他们那个行业的昵图网),需要用到付费下载。尝试过 防盗链,不太理想,最终使用了 Adodb.Stream 读取,直接输出。 解决了 盗版的问题,但是新的问题又来了。Adodb.Stream