你遇到的 “Python 网络爬虫获取图片失败” 的问题,在抓取网页图片时很常见,尤其是针对不同网站的结构、防爬机制、懒加载等问题。以下是常见失败原因+解决方案,并附上网页图片抓取的通用方法代码,帮助你从原理到实践一次搞定。
❗ 常见图片抓取失败原因及解决办法
❌ 失败原因 | ✅ 解决方法 |
---|---|
img 标签使用 data-src 而非 src | 获取 data-src 或 srcset |
图片链接为相对路径 | 使用 urljoin 拼接为绝对路径 |
网站禁止爬虫或需登录 | 设置 User-Agent ,或使用 cookies/session |
图片动态加载(JS 渲染) | 用 selenium 或查看 Network 抓包找到真实 URL |
图片链接无后缀 | 伪造 .jpg 存储或使用 Content-Type 判断 |
图片被 CDN 防盗链保护 | 添加 Referer 请求头 |
下载图片被拒绝 (403, 404) | 检查 headers、重试机制、是否是资源错误链接 |
✅ 通用网页图片抓取代码(含错误处理)
import os
import requests
from bs4 import BeautifulSoup
from urllib.parse import urljoin
# 网页 URL(请替换)
url = 'https://example.com'
# 本地保存文件夹
folder = 'images'
os.makedirs(folder, exist_ok=True)
# 请求头
headers = {
'User-Agent': 'Mozilla/5.0',
'Referer': url # 有些网站要求加 Referer
}
# 请求页面
res = requests.get(url, headers=headers, timeout=10)
soup = BeautifulSoup(res.text, 'html.parser')
# 获取所有 img 标签
img_tags = soup.find_all('img')
# 图片下载
for i, img in enumerate(img_tags):
src = img.get('src') or img.get('data-src') or img.get('srcset')
if not src:
continue
# 拼接完整 URL
img_url = urljoin(url, src.split()[0]) # 去除 srcset 中多个地址
try:
# 请求图片内容
img_res = requests.get(img_url, headers=headers, timeout=10)
img_res.raise_for_status()
# 获取文件扩展名
ext = os.path.splitext(img_url)[1]
if not ext or len(ext) > 5:
ext = '.jpg' # 默认扩展名
# 保存文件
file_path = os.path.join(folder, f'image_{i}{ext}')
with open(file_path, 'wb') as f:
f.write(img_res.content)
print(f'[✓] 下载成功:{img_url}')
except Exception as e:
print(f'[✗] 下载失败:{img_url},原因:{e}')
🧪 故障排查技巧
- 打印调试信息:在代码中
print(img_url)
看是否为完整有效 URL。 - 用浏览器打开 img_url:手动验证图片是否可访问。
- 使用 Chrome 开发者工具 (F12):查看图片真实加载地址。
- 使用
response.status_code
判断错误类型:常见如 403、404、500。
🧠 进阶提示
- 多线程下载:
threading
或concurrent.futures
- 异步下载:
aiohttp
+asyncio
- 动态网站抓图:使用
selenium
、Playwright
- 批量抓图:抓分页
page=1,2,3...
发表回复