在数据爬取、图像识别、内容聚合等项目中,常常需要从网络上采集图片素材,并将其保存到本地或数据库中。本文将详细介绍如何使用 Python 实现这一流程:包括发送 HTTP 请求获取网页内容、解析图片链接、下载图片,并最终将图片以二进制形式存储到数据库(以 SQLite 为例)。

bash编辑pip install requests beautifulsoup4 pillowrequests:用于发送 HTTP 请求;beautifulsoup4:用于解析 HTML 页面,提取图片链接;Pillow(可选):用于验证或处理图片(如缩放、格式转换等)。注意:如果目标网站有反爬机制(如验证码、User-Agent 检测等),可能还需使用
selenium或设置请求头模拟浏览器行为。
<img> 标签的 src 属性;我们使用 SQLite 存储图片(也可替换为 MySQL、PostgreSQL 等):
python编辑import sqlite3
def init_db():
conn = sqlite3.connect('images.db')
cursor = conn.cursor()
cursor.execute('''
CREATE TABLE IF NOT EXISTS images (
id INTEGER PRIMARY KEY AUTOINCREMENT,
url TEXT NOT NULL,
filename TEXT,
data BLOB NOT NULL
)
''')
conn.commit()
conn.close()python编辑import requests
import os
from urllib.parse import urljoin, urlparse
def download_image_to_db(session, img_url, base_url=None):
try:
# 处理相对链接
if base_url and not img_url.startswith(('http://', 'https://')):
img_url = urljoin(base_url, img_url)
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
}
response = session.get(img_url, headers=headers, timeout=10)
response.raise_for_status()
# 简单判断是否为图片(通过 Content-Type 或扩展名)
content_type = response.headers.get('content-type', '')
if 'image' not in content_type:
print(f"跳过非图片资源: {img_url}")
return False
# 获取文件名
parsed = urlparse(img_url)
filename = os.path.basename(parsed.path) or "unknown.jpg"
# 保存到数据库
conn = sqlite3.connect('images.db')
cursor = conn.cursor()
cursor.execute(
"INSERT INTO images (url, filename, data) VALUES (?, ?, ?)",
(img_url, filename, response.content)
)
conn.commit()
conn.close()
print(f"✅ 已保存: {filename}")
return True
except Exception as e:
print(f"❌ 下载失败 {img_url}: {e}")
return Falsepython编辑from bs4 import BeautifulSoup
def scrape_images_from_page(url):
session = requests.Session()
try:
headers = {'User-Agent': 'Mozilla/5.0'}
res = session.get(url, headers=headers)
res.raise_for_status()
soup = BeautifulSoup(res.text, 'html.parser')
img_tags = soup.find_all('img')
img_urls = [img.get('src') for img in img_tags if img.get('src')]
print(f"共找到 {len(img_urls)} 个图片链接")
for img_url in img_urls:
download_image_to_db(session, img_url, base_url=url)
except Exception as e:
print(f"页面解析失败: {e}")python编辑if __name__ == "__main__":
init_db()
target_url = "https://www.jsonla.com/tupian/" # 替换为目标网页
scrape_images_from_page(target_url)robots.txt 和版权法规);time.sleep() 控制频率;Session 复用连接。可在数据库中对 url 字段加唯一索引,避免重复下载:
sql编辑CREATE UNIQUE INDEX IF NOT EXISTS idx_url ON images(url);若图片过大,可先检查 Content-Length,或限制文件大小:
python编辑if int(response.headers.get('content-length', 0)) > 5 * 1024 * 1024: # 5MB
print("图片过大,跳过")
return False对于大量图片,直接存二进制到数据库可能导致性能下降。更常见的做法是:
./images/xxx.jpg);本文展示了如何使用 Python 从网页采集图片并保存到 SQLite 数据库的完整流程。核心在于:
requests + BeautifulSoup 解析页面;BLOB 类型将图片二进制数据存入数据库;你可以根据实际需求扩展功能,例如支持多线程下载、对接云存储、自动打标签等。
📌 提示:生产环境中建议使用更健壮的数据库(如 PostgreSQL 的
bytea类型)或对象存储(如 AWS S3 + 数据库存储 URL)。
希望这篇文章对你有所帮助!如有疑问,欢迎继续探讨。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。