爬取豆瓣电影评分数据导出csv和数据库
时间: 2025-03-26 09:24:46 浏览: 66
### 使用Python爬虫抓取豆瓣电影评分
为了实现这一目标,可以分为几个部分来完成:首先是利用`requests`或`selenium`库获取网页内容;其次解析HTML页面提取所需信息;最后将数据保存到CSV文件以及不同的数据库中。
#### 抓取豆瓣电影评分
对于动态加载的内容可能需要借助于浏览器自动化工具如Selenium模拟真实用户的浏览行为。这里假设目标网站允许简单HTTP请求访问,则可采用如下方式:
```python
import requests
from bs4 import BeautifulSoup
url = "https://movie.douban.com/top250"
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)',
}
response = requests.get(url, headers=headers)
soup = BeautifulSoup(response.text, 'html.parser')
movies = soup.find_all('div', class_='item')
data_list = []
for movie in movies:
title = movie.find('span', class_='title').get_text()
rating_num = float(movie.find('span', class_='rating_num').get_text())
data_dict = {'Title': title,
'Rating': rating_num}
data_list.append(data_dict)
```
此段代码用于从指定URL下载页面源码,并从中抽取每部影片的名字及其对应的分数存入列表当中[^1]。
#### 将结果保存至CSV文件
当已经获得了想要的信息之后就可以考虑如何将其记录下来了。下面展示的是怎样把之前收集好的字典形式的数据写入CSV文档内:
```python
import csv
with open("douban_movie_ratings.csv", mode='w', newline='', encoding="utf-8") as file_obj:
fieldnames = ['Title', 'Rating']
writer = csv.DictWriter(file_obj, fieldnames=fieldnames)
writer.writeheader() # 写表头
for row in data_list:
writer.writerow(row) # 写数据行
```
这段脚本会创建一个新的名为"douban_movie_ratings.csv"的文件,在其中按照列名顺序依次写出标题和评价数值[^2]。
#### 存储到关系型数据库(MySQL / SQLite)
如果希望进一步处理这些数据或将它们与其他应用程序集成起来的话,那么可以选择将之导入关系型数据库里边去。以下是针对两种不同类型的RDBMS——MySQL与SQLite的具体做法说明:
##### MySQL 数据库存储方法
先安装必要的驱动程序包 `mysql-connector-python` 或者其他兼容版本,接着建立连接对象并执行插入语句:
```python
import mysql.connector
db_config = {"host": "localhost",
"user": "root",
"password": "",
"database": "test"}
conn = mysql.connector.connect(**db_config)
cursor = conn.cursor()
create_table_query = """
CREATE TABLE IF NOT EXISTS douban_movies (
id INT AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(255),
rating FLOAT);
"""
insert_data_query = """INSERT INTO douban_movies(title,rating) VALUES (%s,%s);"""
try:
cursor.execute(create_table_query)
cursor.executemany(insert_data_query, [(m['Title'], m['Rating']) for m in data_list])
finally:
conn.commit()
cursor.close()
conn.close()
```
##### SQLite 数据库存储方法
SQLite是一种轻量级的关系型数据库管理系统,适合小型项目和个人开发者使用。它不需要单独的服务进程就能工作,因此非常适合用来做本地测试环境下的开发练习:
```python
import sqlite3
conn = sqlite3.connect(':memory:') # 创建内存中的临时数据库实例
cur = conn.cursor()
cur.execute("""
CREATE TABLE IF NOT EXISTS douban_movies(
id INTEGER PRIMARY KEY AUTOINCREMENT,
title TEXT UNIQUE NOT NULL,
rating REAL CHECK(rating >= 0 AND rating <= 10));
""")
sql_insert_command = '''INSERT OR IGNORE INTO douban_movies(title ,rating )VALUES (?,?)'''
cur.executemany(sql_insert_command, ((m['Title'], m['Rating']) for m in data_list))
conn.commit()
cur.close()
conn.close()
```
以上两份代码片段分别展示了向MySQL服务器端发送批量插入命令的过程,还有就是直接操纵嵌入式SQLite引擎的方式。
#### 非关系型数据库(MongoDB)存储方案
除了传统表格结构之外,NoSQL类别的MongoDB也提供了灵活多样的解决方案适用于各种应用场景。下面是关于如何设置客户端链接参数并通过PyMongo模块来进行基本CRUD操作的例子:
```python
from pymongo import MongoClient
client = MongoClient('mongodb://localhost:27017/')
db = client.test_database
collection = db.douban_movies
documents = [{"title": item["Title"], "rating": item["Rating"]} for item in data_list]
result = collection.insert_many(documents).acknowledged
print(f'Inserted {len(documents)} documents into MongoDB.' if result else 'Failed to insert.')
```
上述示例中包含了初始化MongoClient实例、选择特定集合名称作为容器空间、构建待加入的新文档数组以及调用API函数完成实际入库动作等一系列步骤。
阅读全文
相关推荐











