我的编程空间,编程开发者的网络收藏夹
学习永远不晚

nodejs通过phantomjs实现下载网页

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

nodejs通过phantomjs实现下载网页

功能其实很见简单,通过 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-windowsbinphantomjs.exe down.js http://www.youku.com/

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

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

nodejs通过phantomjs实现下载网页

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

nodejs通过phantomjs实现下载网页

功能其实很见简单,通过 phantomjs.exe 采集 url 加载的资源,通过子进程的方式,启动nodejs 加载所有的资源,对于css的资源,匹配css内容,下载里面的url资源 当然功能还是很简单的,在响应式设计和异步加载的情况下,
2022-06-04

android通过okhttpClient下载网页内容的实例代码

有时候我们需要通过自己的缓存机制来缓存网页内容,当没有网的时候显示本地的缓存,当有网的时候取最新的继续缓存到本地。主要机制:通过AsyncTask异步AsyncTask请求,将得到的response.body()缓存起来。主要代码如下://
2023-05-30

Python3实现Web网页图片下载

先来介绍一些python web编程基础知识 1. GET与POST区别 1)POST是被设计用来向web服务器上放东西的,而GET是被设计用来从服务器取东西的,GET也能够向服务器传送较少的数据,而Get之所以也能传送数据,只是用来设计告
2022-06-04

如何通过vbscript实现文件下载

这篇文章主要介绍了如何通过vbscript实现文件下载,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、VBS下载者:代码如下:Set Post = CreateObject
2023-06-08

nodejs+express实现文件上传下载管理网站

nodejs+express-实现文件上传下载管理的网站 项目Github地址:https://github.com/qcer/updo 后端:基于nodejs的express的web框架. 前端:bootstrap框架+vuejs、jqu
2022-06-04

Android通过startService实现文件批量下载

关于startService的基本使用概述及其生命周期可参见《Android中startService基本使用方法概述》。 本文通过批量下载文件的简单示例,演示startService以及stopService(startId)的使用流程,
2022-06-06

Android通过HTTP协议实现断点续传下载实例

整理文档,搜刮出一个Android通过HTTP协议实现断点续传下载的代码,稍微整理精简一下做下分享。FileDownloader.java
2022-06-06

如何通过CSS实现网页的平滑滚动导航

导航是网页中非常重要的一部分,是用户浏览网页内容的入口。而在一个较长的网页中,平滑滚动导航可以让用户快速定位到所需内容,并提升用户体验。要通过CSS实现平滑滚动导航,可以使用一些CSS特性和技巧。以下是具体的代码示例:HTML结构:
2023-10-21

ffmpeg网页视频流m3u8 ts怎么实现视频下载

这篇“ffmpeg网页视频流m3u8 ts怎么实现视频下载”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“ffmpeg网页视频
2023-07-02

如何通过CSS实现网页的平滑滚动导航条

导航条是网页中非常重要的组成部分之一,它不仅提供了页面导航的功能,还能使网页更加美观。而在网页中实现平滑滚动导航条,可以为用户提供更好的体验。本文将介绍如何通过CSS实现网页的平滑滚动导航条,并提供具体的代码示例。一、HTML结构首先,在H
2023-10-21

如何通过纯CSS实现网页的平滑滚动效果

在网页设计中,平滑滚动效果可以为用户提供良好的浏览体验,使页面切换更加流畅。而在纯CSS中实现平滑滚动效果可以避免使用JavaScript,进一步优化页面加载速度和性能。本文将详细介绍如何使用纯CSS实现网页的平滑滚动效果,并提供具体的代码
2023-10-21

单步调试理解webpack里通过require加载nodejs原生模块实现原理

在webpack和nodejs里,我们经常使用require函数加载原生模块或者开发人员自定义的模块。原生模块的加载,比如:const path = require("path");这个语句是webpack和nodejs应用里经常使用到的。
2023-06-03

Android如何通过XListView实现上拉加载下拉刷新功能

小编给大家分享一下Android如何通过XListView实现上拉加载下拉刷新功能,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!具体内容如下## 导入XListVIew第三方库文件。通过LinkedList将刷新数据插入到
2023-05-30

如何通过纯CSS实现网页的平滑滚动导航菜单

引导用户在网页中进行导航是一个重要的设计元素,而平滑滚动导航菜单是提供用户友好的导航体验的一种方式。本文将介绍如何通过纯CSS来实现这样的导航菜单,并提供相应的代码示例。一、HTML结构首先,我们需要在HTML中创建导航菜单的基本结构。以下
2023-10-21

如何通过纯CSS实现网页的平滑滚动背景效果

如何通过纯CSS实现网页的平滑滚动背景效果背景是网页设计中非常重要的一部分,可以增强页面的视觉效果和用户体验。传统的网页背景通常是静态的,但是通过使用纯CSS技术,我们可以实现一种平滑滚动背景效果,从而为网页添加更加动感和生动的视觉效果。在
2023-10-24

如何通过纯CSS实现网页的平滑滚动背景淡入

如何通过纯CSS实现网页的平滑滚动背景淡入一、引言当今的网页设计越来越注重用户体验,而动态的效果往往能给用户带来更好的视觉效果和交互体验。本文将详细介绍如何通过纯CSS实现网页的平滑滚动背景淡入效果,并提供具体的代码示例,帮助读者快速掌握实
2023-10-26

编程热搜

目录