base64 转文件_把HTML网页下载为单文件,可离线访问

1dcd28aecf0175832b678344e0c70da2.png

把网页下载下来使用,在日常工作中使用频率还是很高的,有时候确实能解一时之急,我自己就有很窘迫的经历。

我开会的时候,都会把准备好的文档存在局域网,到会议室直接打开就能直接用了。有一次到分公司,由于分公司刚刚成立,内网还没有和母公司连通。结果这下子懵逼了,上不去内网,看不到文档。又是叫同事发过来,又是提发送文件的安全申请,让人着急。

如果把网站保存下来,放在自己的电脑中,既不用担心信息泄露问题,又不用为了看不了文档而着急。

遇到问题,记录下来,然后解决问题,程序员的解决思路永远是自己创造轮子的,接下来就是不断的探索解决方案。

其实下载网页的方式有很多种,其中有几种办法使用的比较多,例如:如果你用Chrome,直接按 Ctrl+s 就可实现。使用这种方法,Chrome会把整个网站,按照编译完成的源码目录结构保存下来。像下面这样:

ce261728df3bebdd53711245adc96ac6.png

下载完成的文件直接点击 xxx.html 可以直接离线访问,但是这种方式对目录的依赖结构比较高,怎么理解呢?就是 html 文件和对应文件名的文件夹必须在同一个目录中,才能正常使用。拷贝到其他机器的时候必须要两个同时拷贝才可以,否则就会排版错乱。

如果有十个或者更多的网页需要拷贝或者删除,就会很麻烦,例如我想在其中找到其中几个,复制到其他地方,很容易弄错顺序。

HTML 是一种纯文本格式,它用于排版文字。纯文本文档的意思就是,文档中只包含文字内容,不包含二进制内容,举个例子:打印出的A4纸,只有文字没有图片。而 HTML 想要显示照片等二进制信息,通常都会链接到其他文件,也就是上面文件夹里面的内容。

不过 Chrome 下载文件这种方式也有优点,下载下来的文件可以保持独立性,比如说,我需要这个网页中的一张图片,那么就可以直接到文件夹里面寻找了。

490c2e933270a6846b965cd0f8f99800.png

另外还有一种办法,也有很多人再使用。Chrome 在打印网页的时候,会把网页转成 PDF ,然后在进行打印。那么就给我们提供了很明确的思路,把网页直接保存为 PDF ,这样保存下来的网页就只有一个文件。

使用Chrome,直接按下Ctrl+p就可以。然后目标打印机选择 另存为 PDF 。

这个功能很多浏览器都支持

d1a8493efa8484465693d1ef6c581a16.png

但是这种办法也有很明显的缺点,由于 PDF 是静态文档,网页上的一些动画可能不会正常显示,而且排版也有可能会错乱,这完全靠运气。个人觉得这不是一种很靠谱的方法。

这时候主角来了!有一个工具既可以把网页保存为 html 又可以保持是单文件。他就是 monolith ,你可以在 github 上面找到它,但是源码并没有编译为可执行文件,我把它编译了一下,下面会放上来链接,https://github.com/leconio/Repos/raw/master/monolith.7z。

那么下面就简单说说使用方法:如果你下载我的链接,那么里面有三个文件:

82bae2ca06e627b36b812aae6b7d65a6.png

第一个是Mac平台编译出来的,使用方式为:

./monolith 网站地址 > xxx.html

默认情况下 monolith 会把生成的 html 输出到标准输出流,也就是当前终端。使用 > 我们把输出的内容重定向并覆盖到文件。

执行完成之后,在这个目录下面就会有一个对应的文件:xxx.html 。

另外两个是 Windows 平台使用的。为了简化使用,我写了一个 CMD 脚本。直接点击 monolith.cmd ,然后粘贴地址就可以完成下载。

f9a92dec7a27b1c76979efe3c6649bbb.png

下载完成之后,在本地你会发现只有一个 html 文件。我们打开之后,发现图片和JS等信息都在,而且排版正常。那么就要思考了,我们之前说过,HTML 是放置纯文本信息的,那么图片在哪里呢?

答案显而易见,就在 HTML 文件里面。为了方便小图片传输,有一种叫 Base64 的东西,它可以把二进制信息变成成纯文本。这在使用 Json 传递数据的今天十分常见,它可以减少一次请求(题外话),这里就是用的这个原理。monolith 把图片等二进制内容转为了纯文本,保存在 HTML 文件中。我们在下载的文件源码可以看到:

5171f31762c25d5046f6adef2da05861.png

对比源代码,src 信息已经变成了 base64 格式的图片,就是那串乱码。复制那串乱码,从网上搜一个 base64 转图片工具,粘贴进去,这时会发现就是我们看到的那张图片。这样一来,无论这个网站上有多少个文件,都会保存到一个 HTML 文件里面,而且还能离线使用。

当然,base64 编码的图片比原生图片略大,这可能也是你现在在担心的问题。不过 monolith 会特殊处理文件体积。我们可以看看 Chrome 直接下载和使用 monolith 下载体积相差多少。我们把两种方式下载的网页都进行了 7-Zip 压缩。

057bec2b813e0a786f6f787715927a1a.png

我们可以看到,使用 monolith 下载会比 Chrome 直接下载小一倍还多!

最后要说的是局限性,无论那种方法,都几乎不能把视频网站中的视频下载下来。因为现在的视频地址都是 Token 加密的,同理,使用 Token 加密的其他请求信息也无法下载。

比如你可以试试下载其他网站的首页,Logo 和视频都是下载不了的。但是也有解决办法,那就是另外一个领域的事情了,以后有机会说给大家听。

如果这篇文章对您或者您的朋友有帮助,感谢您关注,转发。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要打开base64图片流,首先要将base64字符串换为二进制数据,然后将二进制数据保存为图片文件。在Python中,可以使用base64模块中的b64decode函数将base64字符串解码为二进制数据,然后使用open函数创建一个文件对象,将二进制数据写入文件即可。 示例代码如下: ```python import base64 # 将base64字符串解码为二进制数据 base64_str = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH5AUNEQsl0dysQwAAAYNJREFUOMvNk0EOwCAQhfc3v9+KCg0+QWtW0m1W9c7qKdDUe6HcJKECzA4C4g0PQ9gF/gDDZDwQZgC5g7gPwKka4B+BLgqwJY6NIEIcH5C5g7gPwKka4B+BLgqwJY6NIEIcH5C5g7gPwKka4B+BLgqwJY6NIEIcH5C5g7gPwKka4B+BLgqwJY6NIEIcH5C5g7gPwKka4B+BLgqwJY6NIEIcH5C5g7gPwKka4B+BLgqwJY6NIEIcH5C5g7gPwKka4B+BLgqwJY6NIEIcH5C5g7gPwKka4B+BLgqwJY6NIEIcH5C5g7gPwKka4B+BLgqwJY6NIEIcH5C5g7gPwKka4B+BLgqwJY6NIEIcL+Ll8fJm7pXCLAAAAAElFTkSuQmCC" img_data = base64.b64decode(base64_str.split(',')[1]) # 将二进制数据保存为图片文件 with open("test.png", "wb") as f: f.write(img_data) ``` 要将图片文件换为base64字符串,可以使用base64模块中的b64encode函数将二进制数据编码为base64字符串,然后将字符串拼接成data URI格式的字符串。 示例代码如下: ```python import base64 # 将图片文件读取为二进制数据 with open("test.png", "rb") as f: img_data = f.read() # 将二进制数据编码为base64字符串 base64_str = base64.b64encode(img_data).decode() # 将base64字符串拼接成data URI格式的字符串 data_uri = "data:image/png;base64," + base64_str print(data_uri) ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值