用 beautifulsoup.find_all('img') 提取所有图片标签是最直接稳定的方法,需检查属性存在性、处理懒加载字段、用 urljoin 转换相对路径,并补充提取 css 和 js 中的图片,同时过滤无效链接。

用 BeautifulSoup.find_all('img') 提取所有图片标签
这是最直接、最稳定的起点。只要 HTML 结构没被严重破坏,find_all('img') 就能返回全部 <img> 元素对象,比正则更可靠,也不会漏掉嵌套在 <picture></picture> 或 <noscript></noscript> 里的图片。
常见错误现象:只取 img['src'] 却没检查 key 是否存在,导致 KeyError;或忽略 data-src、data-lazy-src 等懒加载属性。
- 务必先判断
'src' in img.attrs,再取值;否则加个get('src', '')更安全 - 顺手补上常见懒加载字段:
img.get('data-src') or img.get('data-lazy-src') or img.get('src') - 如果页面用了
<source></source>标签(如响应式图片),需额外遍历soup.find_all(['img', 'source'])
处理相对路径必须用 urljoin,不能拼字符串
拿到 src="images/logo.png" 或 src="/assets/photo.jpg" 后,直接请求会 404。Python 的 urllib.parse.urljoin() 是唯一推荐方式,它能正确处理协议、域名、路径层级和 trailing slash 等边界情况。
容易踩的坑:用 base_url + src 硬拼,遇到 src="../icon.svg" 或 src="//cdn.example.com/a.jpg" 时直接崩;或忘记传入原始响应的 response.url 作为 base,而误用首页 URL。
- 正确写法:
from urllib.parse import urljoin; full_url = urljoin(response.url, img_src) -
response.url是关键——它带完整协议+域名+路径,比手动构造https://example.com更鲁棒 - 若
img_src已是绝对 URL(含http://或//),urljoin会原样返回,无需额外判断
别漏掉 CSS background-image 和 JS 动态插入的图
纯 <img> 只覆盖静态图。现代页面大量使用 style="max-width:90%" 或通过 JS 插入 document.createElement('img'),这些在初始 HTML 里根本不存在。
使用场景:电商商品图轮播、Banner 区、头像墙、数据可视化图表背景等,往往藏在内联样式或外部 CSS 里。
- 提取内联 background:
elem.get('style')后用正则r"background[-image]*\s*:\s*url\(([^)]+)\)"匹配 - 外部 CSS 需单独下载并解析,优先查
<link rel="stylesheet">,再对 CSS 内容做url\(([^)]+)\)扫描 - JS 动态图无法靠 requests + BeautifulSoup 解决,必须上
Selenium或Playwright渲染后取document.querySelectorAll('img')
过滤无效图要早做,别等下载完再删
批量抓图时,10% 以上链接常是 tracker 像素、空白 GIF、base64 占位符或 404。不提前筛,硬盘和时间都浪费在无意义请求上。
性能影响明显:每多一次 requests.get() 就多一次 TCP 握手+DNS 查询,尤其在并发高时拖慢整体吞吐。
- URL 层面过滤关键词:
if 'pixel' in src or 'tracker' in src or 'blank' in src: continue - 跳过 data URI:
if src.startswith('data:image/'):直接跳过(除非你真需要解 base64) - 扩展名白名单优先:
if not src.lower().endswith(('.jpg', '.jpeg', '.png', '.webp', '.gif')): - 真正要验证可用性,用 HEAD 请求代替 GET,响应码 200 再进下载队列
src、data-srcset、CSS background 和 JS 数组里。这时候得按优先级定规则,而不是盲目全收。前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











