你遇到的 “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}')

🧪 故障排查技巧

  1. 打印调试信息:在代码中 print(img_url) 看是否为完整有效 URL。
  2. 用浏览器打开 img_url:手动验证图片是否可访问。
  3. 使用 Chrome 开发者工具 (F12):查看图片真实加载地址。
  4. 使用 response.status_code 判断错误类型:常见如 403、404、500。

🧠 进阶提示

  • 多线程下载:threading 或 concurrent.futures
  • 异步下载:aiohttp + asyncio
  • 动态网站抓图:使用 seleniumPlaywright
  • 批量抓图:抓分页 page=1,2,3...