如何用 Python 采集图片素材并下载保存到数据库

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

如何用 Python 采集图片素材并下载保存到数据库一、准备工作1. 安装依赖库代码语言:javascript复制bash编辑pip install requests beautifulsoup4 pillowrequests:用于发送 HTTP 请求;beautifulsoup4:用于解析 HTML 页面,提取图片链接;Pillow(可选):用于验证或处理图片(如缩放、格式转换等)。注意:如果目标网站有反爬机制(如验证码、User-Agent 检测等),可能还需使用 selenium 或设置请求头模拟浏览器行为。

二、基本流程概述发送请求 获取目标网页 HTML 内容;解析 HTML 提取所有 标签的 src 属性;过滤有效图片链接(如 http/https 开头、常见图片格式);下载图片 并读取为二进制数据;连接数据库,创建表结构;将图片二进制数据插入数据库。三、代码实现1. 创建数据库表我们使用 SQLite 存储图片(也可替换为 MySQL、PostgreSQL 等):

代码语言:javascript复制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()2. 下载并保存图片到数据库代码语言:javascript复制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 False3. 从网页提取图片链接并批量下载代码语言:javascript复制python编辑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}")4. 主程序入口代码语言:javascript复制python编辑if __name__ == "__main__":

init_db()

target_url = "https://www.jsonla.com/tupian/" # 替换为目标网页

scrape_images_from_page(target_url)四、注意事项与优化建议1. 合法性与道德请确保你有权采集目标网站的图片(遵守 robots.txt 和版权法规);避免高频请求,可添加 time.sleep() 控制频率;尊重网站服务器负载,建议使用 Session 复用连接。2. 图片去重可在数据库中对 url 字段加唯一索引,避免重复下载:

代码语言:javascript复制sql编辑CREATE UNIQUE INDEX IF NOT EXISTS idx_url ON images(url);3. 大图处理若图片过大,可先检查 Content-Length,或限制文件大小:

代码语言:javascript复制python编辑if int(response.headers.get('content-length', 0)) > 5 * 1024 * 1024: # 5MB

print("图片过大,跳过")

return False4. 替代方案:保存路径而非二进制对于大量图片,直接存二进制到数据库可能导致性能下降。更常见的做法是:

下载图片到本地文件夹(如 ./images/xxx.jpg);数据库存储文件路径和元信息。五、总结本文展示了如何使用 Python 从网页采集图片并保存到 SQLite 数据库的完整流程。核心在于:

使用 requests + BeautifulSoup 解析页面;通过 BLOB 类型将图片二进制数据存入数据库;注意反爬策略、错误处理与资源合法性。你可以根据实际需求扩展功能,例如支持多线程下载、对接云存储、自动打标签等。

📌 提示:生产环境中建议使用更健壮的数据库(如 PostgreSQL 的 bytea 类型)或对象存储(如 AWS S3 + 数据库存储 URL)。

希望这篇文章对你有所帮助!如有疑问,欢迎继续探讨。

Copyright © 2088 一键全脑游戏活动站 - 脑力挑战专属福利 All Rights Reserved.
友情链接