首页 > 语言 > JavaScript > 正文

nodejs通过phantomjs实现下载网页

2024-05-06 16:19:12
字体:
来源:转载
供稿:网友

这篇文章主要介绍了nodejs通过phantomjs实现下载网页的方法,有需要的小伙伴可以参考下。

功能其实很见简单,通过 phantomjs.exe 采集 url 加载的资源,通过子进程的方式,启动nodejs 加载所有的资源,对于css的资源,匹配css内容,下载里面的url资源

当然功能还是很简单的,在响应式设计和异步加载的情况下,还是有很多资源没有能够下载,需要根据实际情况处理下

首先当然是下载 nodejs 和 phantomjs

下面是 phantomjs.exe 执行的 down.js

 

 
  1. var page = require('webpage').create(), 
  2. system = require('system'); 
  3. var spawn = require("child_process").spawn 
  4.  
  5. if (system.args.length === 1) { 
  6. console.log('Usage: netsniff.js <some URL>'); 
  7. phantom.exit(1); 
  8. else { 
  9. var urls = []; 
  10. page.address = system.args[1]; 
  11. page.onResourceReceived = function (res) { 
  12. if (res.stage === 'start') { 
  13. urls.push(res.url); 
  14. }; 
  15. page.open(page.address, function (status) { 
  16. var har; 
  17. if (status !== 'success') { 
  18. console.log('FAIL to load the address'); 
  19. phantom.exit(1); 
  20. else { 
  21. console.log('down resource ' + urls.length + ' urls.'); 
  22. var child = spawn("node", ["--harmony""downHtml.js", urls.join(',')]) 
  23. child.stdout.on("data"function (data) { 
  24. console.log(data); 
  25. }) 
  26. child.stderr.on("data"function (data) { 
  27. console.log(data); 
  28. }) 
  29. child.on("exit"function (code) { 
  30. phantom.exit(); 
  31. })  
  32. }); 

下面是对应的node运行的 downHtml.js

 

 
  1. "use strict"
  2. var fs = require('fs'); 
  3. var http = require('http'); 
  4. var path = require('path'); 
  5. var r_url = require('url'); 
  6.  
  7. var dirCache = {};//缓存减少判断 
  8. function makedir (pathStr, callback) { 
  9. if (dirCache[pathStr] == 1) { 
  10. callback(); 
  11. else { 
  12. fs.exists(pathStr, function (exists) { 
  13. if (exists == true) { 
  14. dirCache[pathStr] == 1; 
  15. callback(); 
  16. else { 
  17. makedir(path.dirname(pathStr), function () { 
  18. fs.mkdir(pathStr, function () { 
  19. dirCache[pathStr] == 1; 
  20. callback(); 
  21. }) 
  22. }); 
  23. }) 
  24. }; 
  25.  
  26. var reg = /[:,]/s*url/(['"]?.*?(/1)/)/g 
  27. var reg2 = //((['"]?)(.*?)(/1)/)/ 
  28. var isDownMap = {}; 
  29. var downImgFromCss = function (URL) { 
  30. http.get(URL, function(res) { 
  31. //console.log(path.resolve(process.cwd(), 'index.min.css')) 
  32. //res.pipe(fs.createWriteStream(path.resolve(process.cwd(), 'index.min.css'))); 
  33. var body = ""
  34. res.setEncoding('utf8'); 
  35. res.on('data'function (chunk) { 
  36. body += chunk; 
  37. }); 
  38. res.on('end'function () { 
  39. var match = body.match(reg); 
  40. for (var i = 0, len = match.length; i < len; i++){ 
  41. var m = match[i].match(reg2); 
  42. if (m && m[2]) { 
  43. var url = m[2]; 
  44. let imgUrl = r_url.resolve(URL, url); 
  45. if (!isDownMap[imgUrl]) { 
  46. var uo = r_url.parse(imgUrl); 
  47. let filepath = CWD + '/' + uo.hostname + uo.pathname; 
  48. makedir(path.dirname(filepath), function () { 
  49. http.get(imgUrl, function (res) { 
  50. res.pipe(fs.createWriteStream(filepath)); 
  51. }) 
  52. }) 
  53. isDownMap[imgUrl] = 1; 
  54. }); 
  55. }); 
  56.  
  57. var URLS = process.argv[2].split(','); 
  58. var CWD = process.cwd(); 
  59. //下载资源 
  60. URLS.forEach(function (URL) { 
  61. var uo = r_url.parse(URL); 
  62. var filepath; 
  63. if (uo.pathname == '/' || uo.pathname == '') { 
  64. filepath = CWD + '/' + uo.hostname + '/index.html'
  65. else { 
  66. filepath = CWD + '/' + uo.hostname + uo.pathname; 
  67. makedir(path.dirname(filepath), function () { 
  68. http.get(URL, function (res) { 
  69. if (URL.indexOf('.css') != -1 || (res.headers["content-type"] && res.headers["content-type"].indexOf('text/css')!= -1)) { 
  70. console.log('down images form css file:' + URL + '.'); 
  71. downImgFromCss(URL); 
  72. res.pipe(fs.createWriteStream(filepath)); 
  73. }) 
  74. }); 
  75. }); 

down.js downHtml.js 放在同一个文件夹下 通过下列 cmd 运行

D:/phantomjs-2.0.0-windows/bin/phantomjs.exe down.jshttp://www.youku.com/

以上所述就是本文的全部内容了,希望大家能够喜欢。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

图片精选