用 BeautifulSoup 提取 img 的 src 最稳妥:用 response.text 配 html.parser 解析器,容错获取 src 后用 urljoin 补全、过滤伪协议,下载时设超时和 User-Agent,文件名需清洗非法字符并保留扩展名。

用 BeautifulSoup 提取所有 img 标签的 src 属性最稳
直接上手就用 BeautifulSoup,别先想着正则或 lxml。它对 HTML 容错强,能自动修复错位闭合、缺失引号等常见网页脏数据,而正则一遇到换行或属性顺序变化就漏图。
实操建议:
- 用
response.text(不是response.content)喂给BeautifulSoup,避免编码错乱导致src解析为空 - 统一指定解析器:优先用
html.parser(标准库自带),别默认用lxml——后者在某些服务器返回的半截 HTML 上反而会静默丢掉末尾的img - 查
src时加容错:img.get("src")比img["src"]安全,避免因某个img缺src报KeyError
requests 请求后图片链接是相对路径?立刻补全
抓回来的 src 经常是 /images/logo.png 或 images/avatar.jpg,直接下载会 404。必须拼成完整 URL,但不能硬编码域名——页面可能跳转、反爬会改 referer、甚至用 CDN 子域。
实操建议:
- 用
urllib.parse.urljoin(base_url, src),其中base_url是你requests.get()的原始 URL,不是当前页面document.URL - 警惕
标签:如果页面里有这个标签,urljoin仍以请求 URL 为准,但浏览器渲染时会按它来解析;此时应先用soup.find("base")提取href,再用它做urljoin的 base - 过滤空值和 javascript 伪协议:
if src and not src.startswith(("javascript:", "data:"))
批量下载图片时,requests.get() 要设超时和 headers
不设超时,某个大图卡住会让整个流程挂死;不带 User-Agent,很多网站直接返回 403 或空白响应。
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
实操建议:
- 必须加
timeout=(3, 10):连接 3 秒,读取 10 秒,避免单张图拖垮整批 -
headers至少包含{"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)..."},字符串可复用,不用每次生成 - 下载前检查
response.status_code == 200和response.headers.get("content-type", "").startswith("image/"),跳过 HTML 错误页或文本响应
保存文件名怎么处理才不撞车、不乱码
直接用 src 最后一段当文件名?https://a.com/pic?w=200&h=150 这种会生成非法文件名,中文路径在 Windows 下还容易编码异常。
实操建议:
- 从 URL 提取文件名用
urllib.parse.urlparse(src).path.split("/")[-1],再用re.sub(r"[^\w.-]", "_", filename)清洗非法字符 - 保留原始扩展名很重要:如果清洗后没点号,手动补上
.jpg(根据Content-Type推断更准,但简单场景够用) - 路径用
os.path.join(save_dir, safe_filename),别拼字符串;save_dir提前os.makedirs(save_dir, exist_ok=True)
真正麻烦的是动态图地址带签名参数、防盗链 token 或需要 session 复用。那种情况光扒 src 不够,得逆向 JS 或复用登录态——但那是另一个问题了。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










