提取图片url时只拿到缩略图,是因为网页中img的src属性常指向低分辨率占位图,而高清图藏在data-src、data-original、srcset等属性中;需优先检查这些属性,解析srcset取最大尺寸,补全绝对路径,校验状态码与referer,并依据content-type确定真实扩展名。

用 requests + BeautifulSoup 提取图片 URL 时,为什么只拿到缩略图?
网页中常见的 <img src="..."> 往往指向低分辨率占位图或 CDN 缩略图(比如带 ?w=300、/thumb/ 或 @2x 后缀的地址)。真正高分辨率图通常藏在 data-src、data-original、srcset 或 data-zoom-image 这类属性里。
实操建议:
- 优先检查
img标签的data-src和data-original属性——电商、图库站最常用 - 解析
srcset时注意逗号分隔多个候选 URL,取最后一个(通常是最大尺寸)或匹配2x/3x后缀 - 某些站点用 JS 动态加载高清图,此时
BeautifulSoup拿不到,得换selenium或分析 AJAX 接口 - 示例:从
srcset="small.jpg 1x, large.jpg 2x"中提取large.jpg
下载前必须校验 URL 合法性与可访问性
直接拼接相对路径、忽略协议、跳过 403/404 是批量下载失败主因。很多图片 URL 是相对路径(如 /uploads/photo.jpg),需补全为绝对 URL;部分资源加了 Referer 或 User-Agent 限制。
实操建议:
- 用
urllib.parse.urljoin(base_url, img_src)统一转成绝对 URL,base_url取自原始页面 URL - 发起 HEAD 请求预检状态码(
response.status_code == 200),跳过 403/404/405 - 设置请求头:
{"User-Agent": "Mozilla/5.0", "Referer": base_url},绕过基础防盗链 - 对
content-type做白名单过滤(只保留image/jpeg、image/png、image/webp)
保存高清图时如何避免文件名冲突和格式错乱?
原始 URL 中的文件名常含参数(如 photo.jpg?version=2)或无扩展名,直接保存会导致打开失败或覆盖。同时 WebP、AVIF 等新格式可能不被默认工具识别。
仅使用 Python 将 Claw Code 虚拟化框架与 OpenClaw 集成,提供 184 种工具和 200 多条命令,用于安全分析和代码质量...
实操建议:
- 用
response.headers.get("content-type")获取真实 MIME 类型,映射为扩展名(如"image/webp" → ".webp") - 生成唯一文件名:用
hashlib.md5(url.encode()).hexdigest()[:8]+ 扩展名,避免重复 - 不信任 URL 后缀——曾见
xxx.png?v=123实际返回 JPEG,靠 header 判定更稳 - 若需统一转存为 JPG/PNG,用
PIL.Image.open(BytesIO(content)).convert("RGB").save(...),但会损失透明通道和元数据
并发下载时怎样控制速率又不触发反爬?
开太多线程/协程容易被封 IP 或返回空响应;单纯用 time.sleep() 效率太低。关键是平衡速度与隐蔽性。
实操建议:
- 用
concurrent.futures.ThreadPoolExecutor(max_workers=3)—— 大多数中小型网站 3–5 线程足够,再高易被限流 - 每个请求后随机延时:
time.sleep(random.uniform(0.5, 2.0)),比固定间隔更自然 - 捕获
requests.exceptions.RequestException并重试 1 次(带指数退避),不因单张图失败中断整个流程 - 记录失败 URL 到
failed_urls.txt,方便后续人工排查或换 UA 重试
真正麻烦的是 JavaScript 渲染页、登录态保护图、签名 URL(含 timestamp/expiry 参数)——这些没法靠静态解析解决,得逆向接口或模拟登录。别指望一个脚本通吃所有网站。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










