美文网首页
如何下载网页所有资源(附源码)

如何下载网页所有资源(附源码)

作者: 三省吾身_9862 | 来源:发表于2019-01-31 11:50 被阅读50次

nodejs扒取html页面中所有链接资源

前言:

总有些人,想下载一个插件,能直接获取浏览器显示页面的所有资源。也就是下载一个其他人的网站,但是不想一个个复制链接的内容,原因大致有二:
1、链接多,打卡每个链接去下载十分繁琐
2、复制好了,还要重新改html中每个链接指向的新资源路径(下载好的路径)

分析:

1、js在浏览器上是不可能实现,本地生成文件的(下载资源),因为浏览器没有这个权限,那么就需要服务器配合
2、服务器如何知道html浏览器中,到底有哪些文件需要下载,服务器本身没有document对象,那么就返回来需要浏览器配合

结论:

靠浏览器获取所有需要下载的资源,把需要下载的资源通过ajax请求方式,告诉服务器,服务器去实现下载资源

项目文件夹结构
root根目录
   | static文件夹
        | file 文件夹(这个可以不创建,下载资源会生成这个文件夹)
        | jquery-1.8.3.js
   | app.js
代码展示

1、app.js(先执行这个js,cmd命令窗口输入: node app.js)

var express = require('express');
var fs = require('fs');
var bodyParser = require('body-parser');
var request = require('request ');
var path= require('path');

var app = express();
app.use(bodyParser.json());

app.use('/urlDownLoadFile', (req, res) => {
  var filePaths = req.body.filepaths,
      dirPath = req.body.dirPath;
  var fileDirPath = path.join(__dirname, './static/', dirPath);
  if (!fs.existsSync(fileDirPath)) {
    fs.mkdirSync(fileDirPath);
  }
  filePaths.forEach(item => {
    if (item !== '') {
      var lastIndex = item.lastIndexOf('/'),
          fileName = item.substr(lastIndex + 1);
      var stream = fs.createWriteStream(path.join(fileDirPath, fileName));
      request(item).pipe(stream).on('close', (err) => {
         if (err) {
          console.log(err);
         }
      });
    }
  });
  res.send('');
});

app.use('/', express.static('./static'));
app.listen(3000);

2、然后,F12打开要下载网页的控制台,把下面这段代码复制进去

var dirPath = 'file/', // 资源目录(下载到服务器 static/里面的 哪个文件夹)
    allUrls = [localhost.href]; // 所有要下载的路径

var scriptNode = document.createElement('script');
scriptNode.src = 'http://127.0.0.1:3000/jquery-1.8.3.js';
document.body.appendChild(scriptNode);
scriptNode.onload = () => {
  $('link').each((index, ele) => {
    allUrls.push(ele.href);
  });
  $('script').each((index, ele) => {
    allUrls.push(ele.src);
  });
  $('img').each((index, ele) => {
    allUrls.push(ele.src);
  });

  $.ajax({
    url: 'http://127.0.0.1:3000/urlDownLoadFile',
    dataType: 'jsonP',
    data: {
       filepaths: allUrls,
       dirPath: dirPath 
    }
  });
}

3、打开“file 文件夹”,里面已经有了所有网页的资源:html、js、css、jpg...

root根目录
   | static文件夹
        | file 文件夹(这个可以不创建,下载资源会生成这个文件夹)
        | jquery-1.8.3.js
   | app.js

4、打开html修改引用资源路径

<script src="../jquery-1.8.3.js"></script>
<script>
  $('link').each((index, ele) => {
    var filePath = ele.href,
        lastIndex = filePath.lastIndexOf('/'),
        fileName = filePath.substr(lastIndex + 1);
    ele.href = fileName;
  });
  $('script').each((index, ele) => {
    var filePath = ele.src,
        lastIndex = filePath.lastIndexOf('/'),
        fileName = filePath.substr(lastIndex + 1);
    ele.src= fileName;
  });
  $('img').each((index, ele) => {
    var filePath = ele.src,
        lastIndex = filePath.lastIndexOf('/'),
        fileName = filePath.substr(lastIndex + 1);
    ele.src= fileName;
  });
</script>

---------------------------下面作废--------------------

...
网上复制下来的html内容
...
<script>
var dirPath = 'file/', // 资源目录(下载到服务器 static/里面的 哪个文件夹)
    linkNodes = document.getElementsByTagName('link'), // 所有css node节点
    scriptNodes = document.getElementsByTagName('script'), // 所有js node节点
    linkUrls = [], // 所有css node节点和新路径
    scriptUrls = [],  // 所有js node节点和新路径
    allUrls = []; // 所有要下载的路径

for (var i=0; i < linkNodes.length; i++) {
  var filePath = linkNodes[i].href,
    lastIndex = filePath .lastIndexOf('/'),
    fileName = filePath .substr(lastIndex + 1);
  allUrls.push(filePath);
  linkUrls.push({
    node: linkNodes[i],
    url: dirPath + fileName
  });
}

for (var i=0; i < scriptNodes.length; i++) {
  var filePath = scriptNodes[i].src,
    lastIndex = filePath .lastIndexOf('/'),
    fileName = filePath .substr(lastIndex + 1);
  filePath === '' && continue;
  allUrls.push(filePath);
  scriptUrls.push({
    node: scriptNodes[i],
    url: dirPath + fileName
  });
}

var xhr = new XMLHttpRequest();
xhr.open('POST', '/urlDownLoadFile');
xhr.setRequestHeader('Content-Type', 'application/json; charset=UTF-8');
xhr.send(JSON.stringify({
  filepaths: allUrls,
  dirPath: dirPath 
}))
xhr.onreadystatechange = function () {
  if (xhr.readyState === 4 && xhr.status === 200) {
     linkUrls.forEach(item => {
        item.node.href = item.url;
     });
     scriptUrls.forEach(item => {
        item.node.src= item.url;
     });
  }
}
</script>
</body>
</html>

相关文章

网友评论

      本文标题:如何下载网页所有资源(附源码)

      本文链接:https://www.haomeiwen.com/subject/xljksqtx.html