上一篇
html保存到mysql
- 行业动态
- 2025-05-13
- 2
存入MySQL时,需用TEXT/LONGTEXT字段存储,注意转义特殊字符(如),并设置utf8mb4编码,大文本可考虑分表存储以优化性能
数据库设计
表结构规划
字段名 | 数据类型 | 说明 |
---|---|---|
id | INT AUTO_INCREMENT | 主键ID |
html_content | TEXT | 存储完整HTML内容 |
created_at | TIMESTAMP | 创建时间 |
updated_at | TIMESTAMP | 更新时间 |
可选扩展字段
| 字段名 | 数据类型 | 说明 |
|————–|—————|————————–| | VARCHAR(255) | HTML标题(通过解析获取) |
| text_content | TEXT | 纯文本内容(通过解析获取)|
技术实现步骤
建立MySQL连接
import pymysql # 连接参数配置 connection = pymysql.connect( host='localhost', user='root', password='password', db='web_data', charset='utf8mb4' # 支持中文和特殊字符 )
数据提取与处理
from bs4 import BeautifulSoup # 示例HTML内容 html_string = """ <!DOCTYPE html> <html> <head><title>测试页面</title></head> <body> <h1>欢迎使用</h1> <p>这是一个示例段落</p> </body> </html> """ # 解析HTML(可选) soup = BeautifulSoup(html_string, 'html.parser')= soup.title.string if soup.title else '' text = soup.get_text(separator=' ', strip=True)
插入数据到MySQL
with connection.cursor() as cursor: # 基础插入(存储原始HTML) sql_base = "INSERT INTO html_table (html_content) VALUES (%s)" cursor.execute(sql_base, (html_string,)) # 扩展插入(存储解析后的数据) sql_extend = """ INSERT INTO html_table (html_content, title, text_content) VALUES (%s, %s, %s) """ cursor.execute(sql_extend, (html_string, title, text)) connection.commit()
关键注意事项
项目 | 说明 |
---|---|
字符编码 | 使用utf8mb4 支持全Unicode字符 |
SQL注入防护 | 使用参数化查询(%s占位符)代替字符串拼接 |
数据长度限制 | TEXT类型最大存储65,535字节,如需更长可使用MEDIUMTEXT(16MB) |
特殊字符处理 | 对< 、> 、等符号进行转义或使用预处理函数 |
性能优化方案
优化策略 | 实施方法 |
---|---|
批量插入 | 使用executemany() 一次插入多条记录 |
连接池管理 | 使用DBUtils 或SQLAlchemy 的连接池功能 |
压缩存储 | 对重复数据进行压缩(如使用zlib压缩HTML字符串) |
索引优化 | 对created_at 等查询字段建立索引 |
常见问题与解决方案
问题描述 | 解决方案 |
---|---|
插入超长HTML导致失败 | 切换为MEDIUMTEXT类型 为多条记录 |
中文乱码问题 | 设置charset='utf8mb4' 使用 mysql_real_escape_string 处理 |
并发写入冲突 | 启用表级锁 使用 REPLACE INTO 替代INSERT |
相关问题与解答
问题1:如何判断该用TEXT还是MEDIUMTEXT?
解答:
根据数据量选择:
TEXT
:适合存储小于64KB的HTML片段(如文章段落)MEDIUMTEXT
:适合存储完整网页(平均大小约200KB-5MB)
可通过以下SQL查询当前字段最大长度:SELECT @@max_allowed_packet; -查看服务器允许的最大包大小
问题2:如何实现HTML内容的增量更新?
解答:
方案1(时间戳比对):
UPDATE html_table SET html_content = NEW_DATA, updated_at = NOW() WHERE url = '目标URL' AND updated_at < LAST_CRAWL_TIME;
方案2(哈希校验):
- 计算
md5(html_content)
哈希 - 仅当新哈希值≠旧哈希值时执行更新
- 需新增
content_hash
字段存储哈希值