python爬虫运行过程中,爬取到的数据无法存储到MySQL是开发阶段的高频问题,这类问题通常不是单一因素导致的,需要从数据库连接、表结构、代码逻辑等多个维度排查。

常见故障原因及排查方法
1. 数据库连接配置错误
数据库连接参数填写错误是最基础也最容易忽略的问题,需要检查主机地址、端口、用户名、密码、数据库名是否正确,同时确认MySQL服务是否正常运行,对应数据库和表是否已经创建。
可以先通过以下代码测试数据库连接是否正常:
import pymysql
# 测试数据库连接
try:
conn = pymysql.connect(
host='127.0.0.1',
port=3306,
user='root',
password='your_password',
database='spider_db',
charset='utf8mb4'
)
print("数据库连接成功")
conn.close()
except Exception as e:
print(f"数据库连接失败,错误信息:{e}")
2. 表结构与爬取数据不匹配
如果爬虫爬取的数据字段数量、字段类型与MySQL表结构不匹配,也会导致存储失败。比如表字段是整型,但是传入了字符串类型的数据,或者爬取的数据字段比表字段多,缺少对应映射关系。
可以先查看表结构确认字段信息:
-- 查看表结构 DESC spider_table;
3. 未提交事务或未关闭游标
使用pymysql操作MySQL时,默认开启事务,如果执行插入语句后没有调用commit()方法提交事务,数据不会真正写入数据库。同时如果游标没有正确关闭,也可能导致资源占用和写入异常。
4. 特殊字符未转义
爬虫爬取的内容中可能包含单引号、反斜杠等特殊字符,如果没有做转义处理,会导致SQL语句语法错误,插入失败。建议使用参数化查询避免这类问题,不要直接拼接SQL字符串。
正确的存储示例代码
以下是一个完整的爬虫数据存储到MySQL的示例,包含异常处理和事务提交逻辑:
import pymysql
import traceback
def save_to_mysql(data_list):
"""
将爬虫数据存储到MySQL
:param data_list: 爬取到的数据列表,每个元素是包含title和content的字典
"""
conn = None
cursor = None
try:
# 建立数据库连接
conn = pymysql.connect(
host='127.0.0.1',
port=3306,
user='root',
password='your_password',
database='spider_db',
charset='utf8mb4'
)
cursor = conn.cursor()
# 参数化插入语句,避免SQL注入和特殊字符问题
insert_sql = "INSERT INTO spider_table (title, content) VALUES (%s, %s)"
# 批量插入数据
cursor.executemany(insert_sql, [(item['title'], item['content']) for item in data_list])
# 提交事务
conn.commit()
print(f"成功存储{len(data_list)}条数据")
except Exception as e:
# 出现异常回滚事务
if conn:
conn.rollback()
print(f"存储数据失败,错误信息:{e}")
traceback.print_exc()
finally:
# 关闭游标和连接
if cursor:
cursor.close()
if conn:
conn.close()
# 模拟爬虫爬取的数据
spider_data = [
{"title": "测试标题1", "content": "测试内容1"},
{"title": "测试标题2", "content": "测试内容2"}
]
save_to_mysql(spider_data)
排查流程总结
遇到存储问题时,可以按照以下顺序排查:
- 先测试数据库连接是否正常,确认参数和服务无误
- 检查表结构是否和爬取数据的字段、类型匹配
- 查看代码中是否有提交事务的逻辑,是否使用了参数化查询
- 打印插入时的错误信息,根据错误提示定位具体问题
只要按照上述步骤逐一排查,大部分python爬虫数据无法存储到MySQL的问题都可以快速解决。