Python爬虫与数据存储:如何将数据存入MySQL
·
📌 为什么要将爬虫数据存入 MySQL?
在实际项目中,爬取的数据需要:
- 持久化保存(避免丢失)
- 可查询、可统计
- 与后续分析/展示系统结合
使用数据库(如 MySQL)可实现:
✅ 高效读写
✅ 数据结构清晰
✅ 支持数据清洗与分析
🧰 一、环境准备
1. 安装依赖库
pip install pymysql
2. 准备 MySQL 数据库
假设你已安装并启动 MySQL 服务,以下是示例建库建表语句:
CREATE DATABASE IF NOT EXISTS spider_data DEFAULT CHARSET utf8mb4;
USE spider_data;
CREATE TABLE articles (
id INT PRIMARY KEY AUTO_INCREMENT,
title VARCHAR(255),
author VARCHAR(100),
content TEXT,
publish_date DATETIME
);
🕸️ 二、爬取目标网页数据
下面以抓取某博客网站文章数据为例:
import requests
from bs4 import BeautifulSoup
def crawl_article(url):
headers = {"User-Agent": "Mozilla/5.0"}
res = requests.get(url, headers=headers)
soup = BeautifulSoup(res.text, "html.parser")
title = soup.find("h1").text.strip()
author = soup.find("span", class_="author").text.strip()
content = soup.find("div", class_="content").text.strip()
date = soup.find("time")["datetime"] # e.g., "2025-07-06T10:00:00"
return {
"title": title,
"author": author,
"content": content,
"publish_date": date
}
# 示例
data = crawl_article("https://example.com/blog/123")
🗃️ 三、将数据写入 MySQL
方式一:直接插入单条数据
import pymysql
def save_to_mysql(data):
conn = pymysql.connect(
host="localhost",
user="root",
password="your_password",
database="spider_data",
charset="utf8mb4"
)
cursor = conn.cursor()
sql = """
INSERT INTO articles (title, author, content, publish_date)
VALUES (%s, %s, %s, %s)
"""
cursor.execute(sql, (
data["title"],
data["author"],
data["content"],
data["publish_date"]
))
conn.commit()
cursor.close()
conn.close()
方式二:批量插入(推荐)
当你抓取多条记录时,使用 executemany() 性能更好:
def save_many_to_mysql(data_list):
conn = pymysql.connect(host="localhost", user="root", password="your_password",
database="spider_data", charset="utf8mb4")
cursor = conn.cursor()
sql = """
INSERT INTO articles (title, author, content, publish_date)
VALUES (%s, %s, %s, %s)
"""
values = [
(item["title"], item["author"], item["content"], item["publish_date"])
for item in data_list
]
cursor.executemany(sql, values)
conn.commit()
cursor.close()
conn.close()
🧱 四、推荐封装方式:创建数据库管理类
为了让项目更可维护,建议封装为数据库操作类:
class MySQLClient:
def __init__(self):
self.conn = pymysql.connect(
host="localhost",
user="root",
password="your_password",
database="spider_data",
charset="utf8mb4"
)
self.cursor = self.conn.cursor()
def insert_article(self, data):
sql = """
INSERT INTO articles (title, author, content, publish_date)
VALUES (%s, %s, %s, %s)
"""
self.cursor.execute(sql, (
data["title"],
data["author"],
data["content"],
data["publish_date"]
))
self.conn.commit()
def close(self):
self.cursor.close()
self.conn.close()
✅ 五、常见问题与优化建议
| 问题 | 说明 | 解决方案 |
|---|---|---|
| 中文乱码 | 编码未设置 utf8mb4 | 建库和连接都使用 utf8mb4 |
| 数据重复 | 多次插入相同数据 | 设置唯一索引或加逻辑判断 |
| 性能慢 | 大量单条插入 | 使用批量插入 executemany() |
| 数据不完整 | 网页数据缺失 | 做好 try-except 捕获和字段判断 |
💡 实战小贴士
- 使用 SQLAlchemy ORM 可进一步解耦数据操作(推荐大型项目)
- 将爬虫数据写入 Redis/MongoDB 作缓冲,然后批量导入 MySQL(提升效率)
- 结合 Pandas 实现数据预处理后导入数据库更灵活
🧪 示例整合代码(完整流程)
if __name__ == "__main__":
urls = [
"https://example.com/blog/1",
"https://example.com/blog/2",
# ...
]
mysql_client = MySQLClient()
for url in urls:
try:
data = crawl_article(url)
mysql_client.insert_article(data)
print(f"已写入:{data['title']}")
except Exception as e:
print(f"抓取或写入失败:{url} - {e}")
mysql_client.close()
✅ 总结
本篇文章你学会了:
✅ 如何连接并操作 MySQL
✅ 如何将单条和多条数据写入数据库
✅ 如何使用 requests + BeautifulSoup + pymysql 构建完整数据抓取流程
✅ 如何封装高可维护的数据库操作逻辑
更多推荐
所有评论(0)