惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

A
About on SuperTechFans
Y
Y Combinator Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Microsoft Security Blog
Microsoft Security Blog
aimingoo的专栏
aimingoo的专栏
I
InfoQ
C
Check Point Blog
IT之家
IT之家
MyScale Blog
MyScale Blog
Apple Machine Learning Research
Apple Machine Learning Research
Vercel News
Vercel News
Last Week in AI
Last Week in AI
GbyAI
GbyAI
P
Proofpoint News Feed
量子位
Stack Overflow Blog
Stack Overflow Blog
Microsoft Azure Blog
Microsoft Azure Blog
月光博客
月光博客
阮一峰的网络日志
阮一峰的网络日志
人人都是产品经理
人人都是产品经理
B
Blog
T
The Blog of Author Tim Ferriss
H
Help Net Security
云风的 BLOG
云风的 BLOG

依云's Blog

Wayfire支持不缩放Xwayland啦 - 依云's Blog 使用wayvnc远程访问无头Wayfire会话 - 依云's Blog pacfiles: 高速的 pacman -F 替代品 用 Android 手机当电脑的话筒 - 依云's Blog 使用 ffmpeg 对音频文件进行响度归一化 - 依云's Blog 使用 nftables 屏蔽大量 IP - 依云's Blog YubiKey 初体验 - 依云's Blog fcitx5 码表同步方案 - 依云's Blog 我正在使用的火狐扩展(2024年版) - 依云's Blog 使用 PipeWire 实现自动应用均衡器 如果你发现你的 OOM Killer 在乱杀进程 使用 atuin 管理 shell 命令历史 btrfs 元数据满了怎么办 btrfs 翻车记 在 nspawn 里运行 docker Linux 上的字体配置与故障排除 新的 PaddleOCR 部署方案 使用 EasyEffects 调整 Bose 音箱的体验 让离线软件真正离线 我所讨厌的网页行为 tmux 状态栏优化 Google Chrome 中的字体设置 从 getmail6 到 offlineimap 微信消息通知的困扰 Qt 的字体渲染问题 Wayfire 迁移进展(四):不那么 high 的 DPI Wayfire 迁移进展(二):Xwayland HiDPI 以及 waybar Wayfire 迁移进展 不同情况下的图形效果 Wayland 初体验
利用 mitmproxy 保存网页中的所有图片
依云 · 2015-05-30 · via 依云's Blog

有个需求,保存一个网页里的所有图片。

看上去是件简单的事情,拿火狐DownThemAll 扩展下载不就好了么。

然后发现那个网页仅限移动版访问。好吧,装个 UserAgent Switcher。然后发现它是通过 JavaScript 检测 UA 的,而 UserAgent Switcher 只改了 HTTP 头里的 UA。好吧,换个 muzuiget 的 User Agent Overrider。然后发现那些图片是动态加载的,DownThemAll 根本看不到地址。后来知道「查看网页信息」的「媒体」选项卡里也是可以保存图片的,不过那里显示的图片也不全……

于是我怒了,放弃继续尝试不同的工具,决定用程序员的方式来解决问题。

我管你怎么加载的,你总归是要从网络上下载图片不是么?那我就拿个代理把你访问过的所有图片全部保存下来好了 :-)

打开 mitmproxy 文档页,发现并没有现成的保存文件的功能。但是没关系,可以写脚本。看看示例,迅速写了以下不到二十行代码:

#!/usr/bin/mitmdump -s

from __future__ import print_function

import os
from urlparse import urlsplit

from libmproxy.protocol.http import decoded

def response(context, flow):
  with decoded(flow.response):
    if flow.response.headers['Content-Type'][0].startswith('image/'):
      url = urlsplit(flow.request.url)
      name = os.path.basename(url.path)
      with open(name, 'wb') as f:
        f.write(flow.response.content)
      print(name, 'written')

当然这是最终结果。不过和初版差别不大,毕竟就这么点儿代码。思路也很简单,凡是经过代理的图片都存起来。有点粗暴,但是好用。

代理脚本跑起来。然后启动一个全新的 Google Chrome,一个没有任何缓存存在的实例:

google-chrome-stable --proxy-server=http://localhost:8080 --user-data-dir=new

访问目标页面,启用移动版模拟并刷新,就可以看到各种图片都被保存下来了~~