### 使用Python通过PyMySQL将爬取的电影数据存储到名为movie_info的MySQL数据库表中,并解决pymysql.err.OperationalError错误
为了将爬取的电影数据存储到MySQL数据库中的`movie_info`表,需要确保以下几点:正确配置数据库连接、创建目标表结构、处理异常情况以及解决`pymysql.err.OperationalError`问题。
#### 数据库连接配置
在建立数据库连接时,必须指定正确的数据库名称。如果数据库不存在,将抛出`pymysql.err.OperationalError: (1049, "Unknown database 'your_database'")`错误[^1]。为避免此问题,可以在连接前检查数据库是否存在或直接创建数据库。
以下是完整的数据库连接代码示例:
```python
import pymysql
try:
# 尝试连接到指定数据库
db = pymysql.connect(
host='localhost',
port=3306,
user='root',
password='your_password',
db='movie_db', # 替换为实际数据库名
charset='utf8mb4' # 确保支持中文字符
)
except pymysql.err.OperationalError as e:
if e.args[0] == 1049: # 如果数据库不存在
# 创建数据库
temp_db = pymysql.connect(
host='localhost',
port=3306,
user='root',
password='your_password',
charset='utf8mb4'
)
with temp_db.cursor() as cursor:
cursor.execute("CREATE DATABASE IF NOT EXISTS movie_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;")
temp_db.close()
# 重新连接到新创建的数据库
db = pymysql.connect(
host='localhost',
port=3306,
user='root',
password='your_password',
db='movie_db',
charset='utf8mb4'
)
cursor = db.cursor()
```
#### 创建表结构
在插入数据之前,确保`movie_info`表已经存在。可以通过执行SQL语句来创建表。例如:
```sql
CREATE TABLE IF NOT EXISTS movie_info (
id INT AUTO_INCREMENT PRIMARY KEY,
name_cn VARCHAR(255) NOT NULL,
name_en VARCHAR(255),
categories TEXT,
region VARCHAR(100),
duration VARCHAR(50),
release_date DATE,
score FLOAT,
director VARCHAR(255),
actors TEXT
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
```
上述SQL语句定义了`movie_info`表的结构,包括字段类型和编码设置[^2]。
#### 插入数据
假设爬取的数据存储在一个列表中,每个元素是一个字典,包含电影的相关信息。可以使用`INSERT INTO`语句将数据插入到`movie_info`表中。例如:
```python
movies = [
{"name_cn": "肖申克的救赎", "name_en": "The Shawshank Redemption", "categories": "剧情", "region": "美国", "duration": "142分钟", "release_date": "1994-09-23", "score": 9.3, "director": "弗兰克·德拉邦特", "actors": "蒂姆·罗宾斯, 摩根·弗里曼"},
{"name_cn": "阿甘正传", "name_en": "Forrest Gump", "categories": "剧情", "region": "美国", "duration": "142分钟", "release_date": "1994-07-06", "score": 9.5, "director": "罗伯特·泽米吉斯", "actors": "汤姆·汉克斯, 罗宾·怀特"}
]
insert_sql = """
INSERT INTO movie_info (name_cn, name_en, categories, region, duration, release_date, score, director, actors)
VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s);
"""
for movie in movies:
cursor.execute(insert_sql, (
movie['name_cn'],
movie['name_en'],
movie['categories'],
movie['region'],
movie['duration'],
movie['release_date'],
movie['score'],
movie['director'],
movie['actors']
))
db.commit()
```
#### 异常处理
为了保证程序的健壮性,建议添加异常处理机制。例如:
```python
try:
for movie in movies:
cursor.execute(insert_sql, (
movie['name_cn'],
movie['name_en'],
movie['categories'],
movie['region'],
movie['duration'],
movie['release_date'],
movie['score'],
movie['director'],
movie['actors']
))
db.commit()
except Exception as e:
db.rollback()
print(f"Error: {e}")
finally:
cursor.close()
db.close()
```
#### 注意事项
- 确保数据库编码为`utf8mb4`以支持中文字符[^3]。
- 在实际应用中,可以根据需求调整表结构和字段类型。
- 如果数据量较大,可以考虑使用批量插入以提高性能。
---
###