当前位置:首页 > 知识

整站图片下载工具

我写了一个能扒下整站图片的整站小工具,起因特简单——有个客户要改版老网站,图片原设计公司跑路了,下载只留下一堆FTP账号。工具登录一看,整站两千多张产品图散落在几十个文件夹里,图片命名全是下载IMG_20210423_093847.jpg这种鬼样子。手动一张张另存为?工具那得干到天亮。

我花了二十分钟写了段Python脚本。整站核心逻辑就三步:先递归遍历FTP目录,图片把所有.jpg、下载.png、工具.webp后缀的整站文件路径抓出来;再按文件大小和修改时间排序;最后用requests库批量下载,遇到404就跳过。图片跑完一看,下载两千一百三十七张图,总共4.2GB,用时六分半。中途断了三次网,脚本自动重试,没出幺蛾子。

这工具真正麻烦的不是下载,是处理“图片链接藏在JS里”的情况。静态页面好办,正则表达式一匹配就完事。但很多老站用了个什么懒加载插件,图片地址写在data-src属性里,直接抓HTML根本抓不到。我后来加了段模拟滚动页面的逻辑——用Selenium控制无头浏览器,每滚一屏就截取一次新加载的图片URL,这才把隐藏图给逼出来。

还有个坑是防盗链。有些服务器会检查Referer头,直接下载返回403。解决办法粗暴有效——把请求头里的Referer改成目标网站的首页地址。有的更狠,会校验Cookie,那只能先登录一次,把Cookie存下来带着走。我见过最绝的,图片本身是WebP格式,但后缀名写的是.jpg,下载下来打不开。后来我干脆不看后缀,直接读文件头判断真实格式。

写这个工具的过程中我悟了——所谓“整站下载”,真正的技术难点从来不是“下载”这个动作,而是“怎么拿到完整的图片清单”。网站结构越乱,越考验解析逻辑。有些站点用CDN,图片域名和页面域名不一样,你得把CDN域名也加进白名单。有些生成缩略图的系统,原图地址藏在接口返回的JSON里,得先模拟请求那个接口。

工具写完后我顺手做了个GUI界面,用tkinter包了一层。倒不是装逼,纯粹是客户里总有不懂命令行的。界面上就三个输入框:网址、保存路径、并发线程数。底下一个大按钮写着“开始扒”。进度条走完,弹个窗显示“共下载图片2374张,失败12张,失败列表已存到log.txt”。

后来这工具在公司内部传开了,市场部小姑娘拿它去扒竞品官网的素材图,设计部用它批量存图库网站的预览图。我有点心虚——这玩意儿要是用来扒付费图库,那可真叫侵权。所以我在代码里加了一行注释:仅供学习交流,请勿用于商业用途。但说实话,真有人要拿它干坏事,这行注释管不住谁。

工具本身不复杂,两百行代码的事。但每次用它的场景都不一样,这才是写代码有意思的地方。你永远猜不到下一个来求助的人,会给你出什么幺蛾子——比如有个兄弟要扒的网站图片全在SVG雪碧图里,那玩意儿根本没法用常规方式拆。

反正现在这工具躺在我GitHub私有仓库里,最后一次更新是三个月前。昨天又有同事来问能不能加个“按指定尺寸过滤”的功能。我嘴上说行,心里想的是——改需求可以,先请我喝杯咖啡再说。

分享到: