你遇到的 “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 osimport requestsfrom bs4 import BeautifulSoupfrom 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}')php1.16 KB© 菜鸟-创作你的创作print(img_url) 看是否为完整有效 URL。response.status_code 判断错误类型:常见如 403、404、500。threading 或 concurrent.futuresaiohttp + asyncioselenium、Playwrightpage=1,2,3... 原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。