当人们提到 "Python 网页图片" 时,他们可能想做以下几件事之一:

- 从网页上下载图片:这是最常见的需求,即编写一个 Python 脚本,自动访问某个网页,并找到其中的图片链接,然后将图片下载到本地。
- 分析网页中图片的信息:获取图片的 URL、文件名、尺寸、alt 文本等元数据。
- 为网页生成缩略图:将网页保存为图片,或者将网页中的图片处理成缩略图。
下面我将重点讲解第一种和第二种情况,因为它们最为实用。
从网页上批量下载图片
这是最经典的网络爬虫任务,我们将使用两个非常流行的 Python 库:
requests: 用于发送 HTTP 请求,获取网页的 HTML 内容。BeautifulSoup: 用于解析 HTML 内容,轻松地找到我们需要的元素(比如图片标签)。
步骤 1:安装必要的库
如果你还没有安装这两个库,可以通过 pip 来安装:
pip install requests pip install beautifulsoup4
步骤 2:编写 Python 脚本
下面是一个完整的示例,它会访问一个示例网页(这里用 unsplash.com 作为例子,因为它图片质量高且结构相对简单),并下载所有它找到的图片。

import requests
from bs4 import BeautifulSoup
import os
import time
def download_images_from_webpage(url, folder_name='downloaded_images'):
"""
从指定URL的网页上下载所有图片。
"""
# 1. 创建保存图片的文件夹
if not os.path.exists(folder_name):
os.makedirs(folder_name)
print(f"文件夹 '{folder_name}' 已创建。")
# 2. 发送 HTTP 请求获取网页内容
try:
# 添加 User-Agent 模拟浏览器访问,避免被某些网站阻止
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
}
response = requests.get(url, headers=headers, timeout=10)
response.raise_for_status() # 如果请求失败 (404, 500),则抛出异常
except requests.exceptions.RequestException as e:
print(f"无法获取网页内容: {e}")
return
# 3. 使用 BeautifulSoup 解析 HTML
soup = BeautifulSoup(response.text, 'html.parser')
# 4. 查找所有的 <img> 标签
img_tags = soup.find_all('img')
if not img_tags:
print("在网页上没有找到任何图片。")
return
print(f"找到 {len(img_tags)} 张图片,开始下载...")
# 5. 遍历所有图片标签并下载
for index, img_tag in enumerate(img_tags):
# 获取图片的 src 属性
img_url = img_tag.get('src')
# 有些图片可能是相对路径,需要转换为绝对路径
if img_url and not img_url.startswith('http'):
img_url = requests.compat.urljoin(url, img_url)
if not img_url:
continue
# 获取图片的文件名,如果URL中没有,则使用一个默认名
try:
filename = os.path.basename(img_url.split('?')[0]) # 去掉URL中的查询参数
if not filename or '.' not in filename:
filename = f"image_{index + 1}.jpg"
except:
filename = f"image_{index + 1}.jpg"
filepath = os.path.join(folder_name, filename)
try:
# 下载图片
img_response = requests.get(img_url, headers=headers, stream=True, timeout=10)
img_response.raise_for_status()
# 保存图片到文件
with open(filepath, 'wb') as f:
for chunk in img_response.iter_content(8192):
f.write(chunk)
print(f"已成功下载: {filename}")
except requests.exceptions.RequestException as e:
print(f"下载图片失败 {img_url}: {e}")
# 添加一个小的延时,避免请求过于频繁
time.sleep(0.5)
# --- 使用示例 ---
if __name__ == "__main__":
# 替换成你想要爬取的网页URL
# 注意:爬取他人网站前,请务必查看其 'robots.txt' 和 '服务条款'
target_url = "https://unsplash.com/t/nature"
download_images_from_webpage(target_url)
代码解释:
- 创建文件夹:使用
os.makedirs()创建一个用于存放下载图片的文件夹,如果文件夹不存在的话。 - 发送请求:
requests.get()用于获取网页的 HTML,我们设置了headers来模拟浏览器,这是很多网站反爬虫的简单策略。timeout设置了请求超时时间。 - 解析 HTML:
BeautifulSoup(response.text, 'html.parser')将获取到的 HTML 文本解析成一个对象,方便我们后续查找元素。 - 查找图片:
soup.find_all('img')会找到页面中所有的<img>标签,并返回一个列表。 - 处理图片 URL:
img_tag.get('src')获取<img>标签中的src属性,这个属性就是图片的链接。requests.compat.urljoin(url, img_url)用于处理相对路径,如果src是/images/logo.png,urljoin会自动把它补全成https://example.com/images/logo.png。- 我们从 URL 中提取文件名,并处理一些特殊情况(如没有后缀名)。
- 下载并保存:
requests.get(..., stream=True)使用流式下载,对于大文件更节省内存。with open(...)以二进制写入模式 ('wb') 打开文件。iter_content(8192)分块读取下载内容,并写入文件。time.sleep(0.5)是一个礼貌的延时,避免对目标服务器造成过大压力。
获取网页中图片的元数据
有时候我们不想下载图片,只是想获取它们的 URL、alt 文本等信息,这非常简单,只需修改上面的代码,去掉下载部分即可。
import requests
from bs4 import BeautifulSoup
def get_image_info_from_webpage(url):
"""
获取网页中所有图片的URL和alt文本。
"""
try:
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
}
response = requests.get(url, headers=headers)
response.raise_for_status()
except requests.exceptions.RequestException as e:
print(f"无法获取网页内容: {e}")
return
soup = BeautifulSoup(response.text, 'html.parser')
img_tags = soup.find_all('img')
image_data = []
for img_tag in img_tags:
img_info = {
'src': img_tag.get('src'),
'alt': img_tag.get('alt', 'N/A'), # 获取alt文本,如果不存在则返回'N/A'
'title': img_tag.get('title', 'N/A') # 获取title文本
}
image_data.append(img_info)
return image_data
# --- 使用示例 ---
if __name__ == "__main__":
target_url = "https://www.python.org/"
image_info_list = get_image_info_from_webpage(target_url)
if image_info_list:
print(f"在网页上找到 {len(image_info_list)} 张图片的信息:")
for i, info in enumerate(image_info_list):
print(f"--- 图片 {i+1} ---")
print(f"URL: {info['src']}")
print(f"Alt文本: {info['alt']}")
print(f"Title文本: {info['title']}")
print("-" * 20)
else:
print("未找到图片信息。")
⚠️ 重要提醒:合法性与道德规范
在编写爬虫脚本时,请务必遵守以下几点:
- 检查
robots.txt:几乎所有网站都有一个robots.txt文件(https://www.example.com/robots.txt),它规定了哪些页面可以爬取,哪些不可以,请尊重网站的规定。 - 查看服务条款:有些网站的服务条款明确禁止自动化访问,在爬取前,最好快速浏览一下。
- 不要过于频繁地请求:过高的请求频率会给目标服务器带来巨大压力,可能导致你的 IP 被封禁,在脚本中加入
time.sleep()是一个好习惯。 - 注明身份:在
headers中可以加入一个联系邮箱,表明你的身份和用途,'From': 'your_email@example.com'。
希望这个详细的解答能帮助你解决问题!如果你有更具体的需求(比如处理 JavaScript 渲染的页面),可以再提问,我们可以使用 Selenium 或 Playwright 等更强大的工具来解决。

