Python爬虫系列教程之第四篇:数据存储与管理
大家好,欢迎继续关注本系列爬虫教程。前几篇博客中,我们依次学习了爬虫的基础知识、数据解析技巧以及应对反爬策略的高级请求方法。在实际爬虫项目中,数据采集只是第一步,如何将提取到的数据进行存储与管理同样非常重要。本篇博客将详细介绍如何将数据保存到CSV文件、JSON文件以及SQLite数据库中,并附上完整的代码示例,代码中均包含详细的中文注释,方便大家理解和学习。
1. 为什么需要数据存储
在爬虫开发中,数据存储是将抓取的数据进行持久化的重要步骤。常见的数据存储方式有:
- CSV文件:适用于数据量不大且结构化简单的数据,便于数据交换与后续分析。
- JSON文件:适合存储层次结构较为复杂的数据,具有良好的可读性与跨语言兼容性。
- 数据库(如SQLite、MySQL等):适用于大规模数据存储和复杂查询,具备更高的数据安全性与管理能力。
本篇博客将通过一个完整的示例,演示如何从豆瓣电影TOP250页面中抓取电影信息,并将数据分别保存到CSV、JSON以及SQLite数据库中。
2. 完整示例代码
下面的代码示例包含三个主要部分:
- 数据采集:通过
requests
和BeautifulSoup
爬取豆瓣电影TOP250页面,提取电影名称与评分。 - 数据存储到CSV文件:利用Python自带的
csv
模块将数据写入CSV文件。 - 数据存储到JSON文件:利用
json
模块将数据存入JSON文件,格式美观易读。 - 数据存储到SQLite数据库:使用
sqlite3
模块将数据存入SQLite数据库,便于后续数据查询与管理。
注意:运行以下代码前,请确保已安装所需库,如
requests
、bs4
、lxml
。可通过命令pip install requests bs4 lxml
进行安装。
# 导入所需模块
import requests # 用于发送网络请求
from bs4 import BeautifulSoup # 用于解析HTML页面
import csv # 用于CSV文件读写
import json # 用于JSON数据处理
import sqlite3 # 用于SQLite数据库操作
def fetch_douban_top250(url):
"""
从豆瓣电影TOP250页面获取电影名称和评分
:param url: 目标页面的URL
:return: 包含电影信息的列表,每个元素是一个字典,包含键 'title' 和 'rating'
"""
# 定义请求头,模拟浏览器行为
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)"
}
# 发送HTTP请求
response = requests.get(url, headers=headers)
# 初始化存储电影信息的列表
movies_list = []
# 如果请求成功,状态码为200,则解析页面内容
if response.status_code == 200:
# 使用BeautifulSoup和lxml解析器解析HTML页面
soup = BeautifulSoup(response.text, 'lxml')
# 查找所有包含电影信息的div标签,class属性为"item"
items = soup.find_all('div', class_='item')
# 遍历每个电影信息块
for item in items:
# 提取电影名称
title = item.find('span', class_='title').get_text(strip=True)
# 提取电影评分
rating = item.find('span', class_='rating_num').get_text(strip=True)
# 将提取到的信息以字典形式存入列表
movies_list.append({'title': title, 'rating': rating})
else:
print("请求失败,状态码:", response.status_code)
return movies_list
def save_to_txt(movies, filename):
"""
将电影数据保存到TXT文件中
:param movies: 包含电影信息的列表,每个元素为字典
:param filename: TXT文件名
"""
with open(filename, "w", encoding="utf-8") as f:
for movie in movies:
title = movie['title']
rating = movie['rating']
f.write(f"电影:{title},评分:{rating}\n")
print(f"数据已成功存储到:{filename}")
def save_to_csv(movies, filename):
"""
将电影数据保存到CSV文件中
:param movies: 包含电影信息的列表,每个元素为字典
:param filename: CSV文件名
"""
# 使用with语句打开文件,确保文件操作完成后自动关闭
with open(filename, 'w', newline='', encoding='utf-8-sig') as csvfile:
# 定义CSV文件的字段名称
fieldnames = ['title', 'rating']
# 创建CSV字典写入对象
writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
# 写入表头
writer.writeheader()
# 逐行写入每部电影的信息
for movie in movies:
writer.writerow(movie)
print(f"数据已成功保存到CSV文件:{filename}")
def save_to_json(movies, filename):
"""
将电影数据保存到JSON文件中
:param movies: 包含电影信息的列表,每个元素为字典
:param filename: JSON文件名
"""
# 使用with语句打开文件,确保文件操作完成后自动关闭
with open(filename, 'w', encoding='utf-8') as jsonfile:
# 将数据写入文件,ensure_ascii=False保证中文不被转义,indent=4使格式美观
json.dump(movies, jsonfile, ensure_ascii=False, indent=4)
print(f"数据已成功保存到JSON文件:{filename}")
def save_to_sqlite(movies, db_name):
"""
将电影数据保存到SQLite数据库中
:param movies: 包含电影信息的列表,每个元素为字典
:param db_name: SQLite数据库文件名
"""
# 连接或创建数据库文件
conn = sqlite3.connect(db_name)
# 创建游标对象,用于执行SQL语句
cursor = conn.cursor()
# 创建movies表(如果不存在),包含自增id、电影名称和评分
cursor.execute('''
CREATE TABLE IF NOT EXISTS movies (
id INTEGER PRIMARY KEY AUTOINCREMENT,
title TEXT,
rating TEXT
)
''')
# 遍历电影数据,将每部电影信息插入到数据库中
for movie in movies:
cursor.execute('INSERT INTO movies (title, rating) VALUES (?, ?)', (movie['title'], movie['rating']))
# 提交事务,保存更改
conn.commit()
# 关闭数据库连接
conn.close()
print(f"数据已成功保存到SQLite数据库:{db_name}")
if __name__ == '__main__':
# 定义目标URL,豆瓣电影TOP250页面
url = 'https://movie.douban.com/top250'
# 调用函数获取电影数据
movies = fetch_douban_top250(url)
# 如果成功获取到数据,则依次保存到CSV、JSON和SQLite数据库
if movies:
# 保存到TXT文件
save_to_txt(movies, 'douban_top250.txt')
# 保存到CSV文件
save_to_csv(movies, 'douban_top250.csv')
# 保存到JSON文件
save_to_json(movies, 'douban_top250.json')
# # 保存到SQLite数据库
# save_to_sqlite(movies, 'douban_top250.db')
else:
print("未能获取到电影数据,请检查请求和页面结构。")
3. 代码解析
3.1 数据采集部分
- 请求与解析
利用requests.get
方法向豆瓣电影TOP250页面发送请求,并通过BeautifulSoup
结合lxml
解析器解析返回的HTML页面。 - 数据提取
通过查找包含电影信息的<div class="item">
标签,提取电影名称和评分,并将每条数据以字典形式存入列表。
3.2 数据存储到CSV
- CSV写入
使用csv.DictWriter
写入CSV文件,先写入表头再逐行写入电影数据,确保文件编码为utf-8
以防止中文乱码。
3.3 数据存储到JSON
- JSON写入
利用json.dump
方法将数据写入JSON文件,通过参数ensure_ascii=False
保证中文字符不被转义,同时使用indent=4
美化输出格式。
3.4 数据存储到SQLite
- 数据库操作
通过sqlite3
模块连接数据库,如果指定的数据库文件不存在则自动创建。 - 表结构创建
利用SQL语句创建包含id
(自增主键)、title
和rating
字段的movies
表。 - 数据插入
遍历电影数据并使用参数化SQL语句将数据逐行插入到表中,最后提交事务并关闭数据库连接。
4. 小结
在本篇博客中,我们学习了如何对爬虫抓取到的数据进行多种方式的存储,包括保存到CSV文件、JSON文件以及SQLite数据库中。通过完整的代码示例,希望大家能够实践并灵活运用这些数据存储技术,为后续数据分析与应用打下坚实基础。
如果你对本文内容有疑问或建议,欢迎在评论区留言讨论,也请关注我的CSDN博客获取更多更新内容。记得点赞、收藏和分享哦!
让我们在Python爬虫的道路上不断前进,探索更多高级技术吧!