wget默认只跟踪a标签超链接,不抓img src图片;需用-r -p -A指定后缀并配合--span-hosts等参数才能下载图片。

wget递归下载图片时为什么只下到HTML,不抓图?
因为默认 wget 不识别图片链接——它只按超链接(a href)递归,而网页中图片多是 img src,不在默认抓取路径里。必须显式告诉它哪些后缀要当“资源”拉下来,并启用页面内资源下载。
关键参数组合:--recursive(或 -r)控制层级,--page-requisites(或 -p)拉取页面依赖(CSS/JS/图片),--accept 限定文件类型。
wget -r -p -A "*.jpg,*.jpeg,*.png,*.gif" https://example.com/gallery/- 加
-nH --cut-dirs=1可避免生成嵌套过深的本地目录 - 若目标站用相对路径引用图片(比如
src="images/photo.jpg"),-p能自动补全并下载;但若图片在 CDN 域名上(如src="https://cdn.example.net/pic.png"),默认不会跨域抓——得加--span-hosts并配合--domains白名单
如何防止 wget 下载整站或触发反爬?
递归没约束极易失控:可能顺着导航栏、分页链接一路扫到后台路径,甚至撞上 /wp-admin/ 或 /api/ 接口。不是所有链接都该进队列。
- 用
--level=2限制递归深度(例如只下当前页 + 链接页,共两层) - 用
--exclude-directories排除敏感路径:--exclude-directories="/admin,/cgi-bin,/phpmyadmin" - 加
--random-wait让请求间隔随机(0.5–1.5秒),比固定--wait=1更不易被封 - 务必加
--user-agent模拟浏览器,否则很多站直接 403:--user-agent="Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36"
下载的图片文件名乱码或重复怎么办?
网页里 img src 的 URL 可能含中文、空格、查询参数(如 ?v=123),wget 默认按原始 URL 命名,导致文件不可读或冲突。
- 用
--restrict-file-names=windows自动转义非法字符(斜杠→下划线,问号→@等),兼容性最好 - 加
--convert-links会重写 HTML 中的链接指向本地文件,方便离线浏览(但仅对-p下载的页面有效) - 如果发现大量同名文件(如全是
image.jpg),说明服务器返回的响应头没带Content-Disposition,此时靠wget无法区分——得换方案,比如先用curl抓 HTML,再用grep -o 'src="[^"]*"' | sed 's/src="//;s/"$//' | xargs -I{} wget {}手动提取并去重
为什么有些图片明明在网页里却死活不下载?
常见于懒加载(data-src)、JS 渲染图片、Base64 内联图,或图片 URL 被动态拼接。这些 wget 完全看不见——它只处理静态 HTML 文本,不执行 JS。
这时候别硬刚递归参数。确认是否真需要这些图:
- 如果是懒加载,查看源码里是否有
data-src,手动替换成src再试-p - 如果是 JS 渲染(如 React/Vue 页面),
wget无解,得用Puppeteer或Selenium渲染后提取img标签 - Base64 图片不用下,它们已编码在 HTML 里,提取出来 base64 decode 即可
递归下载本质是“静态快照”,对现代前端架构天然有盲区。判断是否适用,先右键“查看网页源代码”,搜 ——如果图片 URL 在源码里明文存在,
wget 才靠谱;否则,换工具更省时间。











