在日常工作和学习中,我们常会遇到需要批量获取网页图片的场景,手动保存不仅耗时还容易出错。本文将以 Python 为工具,通过两种主流方案,带您快速掌握网页图片的自动抓取与本地下载,从环境搭建到代码运行全程详解,即使是编程新手也能轻松上手。
方案一:使用 requests+BeautifulSoup 实现基础抓取
此方案适用于结构简单、图片链接可直接获取的静态网页,核心是通过请求网页数据、解析 HTML 结构提取图片链接,再批量下载图片。
1. 环境搭建
首先需安装必备的 Python 库,打开电脑终端(Windows 用 CMD,Mac 用终端),输入以下命令并回车:
安装requests库:用于向网页发送请求,获取网页源代码,命令为pip install requests安装beautifulsoup4库:用于解析 HTML 代码,提取图片链接,命令为pip install beautifulsoup4
2. 完整代码与步骤解析
以下代码以抓取某静态图片展示页为例,您只需替换目标网页 URL 即可复用:
python
import requests
from bs4 import BeautifulSoup
import os
# 1. 定义目标网页URL和本地保存路径
target_url = "https://example.com/image-page" # 替换为您要抓取的网页URL
save_folder = "web_images" # 本地保存文件夹名称,会自动创建
# 2. 创建本地保存文件夹(不存在则创建)
if not os.path.exists(save_folder):
os.makedirs(save_folder)
# 3. 发送请求获取网页源代码
try:
# 添加请求头,模拟浏览器访问,避免被网站拦截
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36"
}
response = requests.get(target_url, headers=headers, timeout=10)
response.raise_for_status() # 若请求失败(如404、500),直接抛出错误
except Exception as e:
print(f"获取网页失败:{e}")
exit()
# 4. 解析HTML,提取所有图片链接
soup = BeautifulSoup(response.text, "html.parser") # 用HTML解析器处理网页内容
img_tags = soup.find_all("img") # 查找所有标签,这是网页中图片的核心标签
# 5. 批量下载图片到本地
img_count = 0
for img in img_tags:
# 从标签的"src"属性中获取图片链接,部分网站可能用"data-src",需根据实际调整
img_url = img.get("src")
if not img_url:
continue # 若没有图片链接,跳过当前标签
# 处理相对链接(如"/images/1.jpg"),补全为完整URL
if not img_url.startswith(("http://", "https://")):
from urllib.parse import urljoin
img_url = urljoin(target_url, img_url)
# 提取图片文件名(如从"https://example.com/1.jpg"中提取"1.jpg")
img_name = img_url.split("/")[-1]
save_path = os.path.join(save_folder, img_name)
# 下载图片并保存
try:
img_response = requests.get(img_url, headers=headers, timeout=10)
img_response.raise_for_status()
with open(save_path, "wb") as f: # 以二进制模式写入文件(图片为二进制数据)
f.write(img_response.content)
img_count += 1
print(f"成功下载:{img_name}")
except Exception as e:
print(f"下载失败{img_url}:{e}")
print(f"\n抓取完成!共成功下载{img_count}张图片,保存路径:{os.path.abspath(save_folder)}")
3. 关键注意事项
请求头设置:必须添加User-Agent,否则部分网站会识别为爬虫并拒绝请求,可通过浏览器 “开发者工具 - 网络 - 刷新页面 - 查看任意请求的请求头” 获取自己的User-Agent。链接补全:若图片链接是相对路径(不含http),需用urljoin函数结合网页 URL 补全为完整链接,否则无法下载。错误处理:代码中加入try-except块,可避免因单个图片下载失败导致整个程序崩溃,同时能清晰看到失败原因。
方案二:使用 Selenium 抓取动态加载图片
部分网页(如滚动加载、JS 渲染的页面)的图片链接不会直接出现在初始 HTML 中,此时需用 Selenium 模拟浏览器行为,等待图片加载完成后再抓取。
1. 环境搭建
安装 Selenium 库:终端输入pip install selenium下载浏览器驱动:根据您使用的浏览器(Chrome、Edge 等)下载对应版本的驱动,以 Chrome 为例:
打开 Chrome,在地址栏输入chrome://settings/help查看浏览器版本(如 114.0.5735.199)访问Chrome 驱动下载页,下载与版本匹配的驱动将驱动文件解压后,放在 Python 安装目录(或在代码中指定驱动路径)
2. 完整代码与步骤解析
python
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import requests
import os
# 1. 配置Selenium浏览器(以Chrome为例)
driver = webdriver.Chrome() # 若驱动未在Python目录,需加参数:executable_path="驱动文件路径"
target_url = "https://example.com/dynamic-images" # 替换为动态加载图片的网页URL
save_folder = "dynamic_web_images"
os.makedirs(save_folder, exist_ok=True) # 简化文件夹创建方式
# 2. 打开网页并等待图片加载(模拟滚动到底部,触发动态加载)
driver.get(target_url)
try:
# 等待10秒,直到至少有1张图片加载完成
WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.TAG_NAME, "img"))
)
# 模拟滚动到底部(部分页面需滚动才加载更多图片)
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
WebDriverWait(driver, 5).until(
EC.presence_of_all_elements_located((By.TAG_NAME, "img"))
)
except Exception as e:
print(f"等待图片加载失败:{e}")
driver.quit()
exit()
# 3. 提取图片链接并下载(逻辑与方案一类似)
img_elements = driver.find_elements(By.TAG_NAME, "img")
img_count = 0
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36"
}
for img in img_elements:
img_url = img.get_attribute("src") # Selenium用get_attribute获取标签属性
if not img_url:
continue
# 补全链接、提取文件名、下载图片(代码与方案一相同,此处省略,直接复用即可)
# ...(同方案一的下载逻辑)
# 4. 关闭浏览器,完成抓取
driver.quit()
print(f"动态抓取完成!共下载{img_count}张图片,路径:{os.path.abspath(save_folder)}")
3. 关键注意事项
驱动匹配:浏览器驱动版本必须与浏览器版本一致,否则会报错,若浏览器自动更新,需重新下载对应驱动。等待策略:使用WebDriverWait而非固定time.sleep(),能更智能地等待图片加载,避免因加载慢导致漏抓,同时节省时间。浏览器模式:若需隐藏浏览器运行(无头模式),可在初始化 driver 时添加配置,减少资源占用,具体可搜索 “Selenium Chrome 无头模式” 获取代码。
法律与伦理边界:避免违规抓取
在进行网页图片抓取前,必须遵守以下原则,避免法律风险:
查看 robots.txt:访问目标网站的https://网站域名/robots.txt,若文件中明确禁止抓取图片(如Disallow: /*.jpg),则不可进行抓取。尊重版权:抓取的图片仅可用于个人学习、研究,不可用于商业用途,若需商用,必须获得版权方授权。控制抓取频率:避免短时间内发送大量请求,可在代码中加入time.sleep(1)(每次请求后停顿 1 秒),减轻网站服务器压力,避免被封禁 IP。
通过以上两种方案,您可应对绝大多数网页图片的抓取需求。方案一适合静态页面,代码简单、运行速度快;方案二适合动态页面,能处理 JS 渲染的内容。实际使用时,可根据网页类型选择对应的方案,再根据具体网页的 HTML 结构微调代码中的标签属性(如src改为data-src)即可。
💡 关键要点
在日常工作和学习中,我们常会遇到需要批量获取网页图片的场景,手动保存不仅耗时还容易出错。本文将以 Python 为工具,通过两种主流方案