使用Beautiful Soup获取网页图片,部分图片无法保存的问题求助
解决方法
你打印出的'src'并不是有效的图片URL,这说明这些图片要么是懒加载机制(真实链接存在于其他属性而非src),要么是页面通过JavaScript动态渲染的内容——静态的requests请求只能获取页面初始HTML,无法执行JS加载后续内容。以下是具体解决步骤:
1. 检查并替换懒加载图片的属性
很多网站用懒加载优化加载速度,会把真实图片链接放在data-src、data-original这类data-*属性里,而src仅作为占位符(你的情况里可能占位符被设成了'src'字符串)。修改代码优先读取这些属性:
from urllib.parse import urljoin # ... 原有代码 ... for i,img in enumerate(images): try: # 优先取懒加载属性,再回退到src img_url = img.get('data-src') or img.get('data-original') or img.get('src') if not img_url: continue # 把相对路径转为绝对URL(避免无法访问的情况) img_url = urljoin(url, img_url) # 更精准的图片格式判断 if img_url.lower().endswith(('jpg', 'jpeg', 'png', 'gif')): res = requests.get(img_url, headers=headers) # 用with语句自动关闭文件,避免资源泄漏 with open(f"{name}/image_{i}.jpg", "wb") as f: f.write(res.content) except Exception as e: print(e)
2. 处理JS动态渲染的图片
如果图片是通过滚动、AJAX等JS行为加载的,requests无法获取到这些动态生成的内容,需要用能执行JavaScript的工具(比如Selenium):
from selenium import webdriver from selenium.webdriver.common.by import By from urllib.parse import urljoin import requests import time driver = webdriver.Chrome() driver.get(url) # 等待页面完全加载,或者滚动到底部触发所有图片加载 time.sleep(3) # 生产环境建议用显式等待,比如等待某个元素加载完成 images = driver.find_elements(By.TAG_NAME, 'img') for i, img in enumerate(images): try: img_url = img.get_attribute('data-src') or img.get_attribute('src') if not img_url or not img_url.lower().endswith(('jpg', 'jpeg', 'png', 'gif')): continue img_url = urljoin(url, img_url) res = requests.get(img_url, headers=headers) with open(f"{name}/image_{i}.jpg", "wb") as f: f.write(res.content) except Exception as e: print(e) driver.quit()
3. 完善原有代码的容错逻辑
- 替换粗糙的
img_url[-1]=="g"判断,改为匹配常见图片后缀,避免误判。 - 用
with语句管理文件,自动释放资源。 - 处理相对路径转绝对路径,避免因URL不完整导致的请求失败。
内容的提问来源于stack exchange,提问作者FatemeZamanian
相关产品推荐
相关产品推荐

