当前位置: 首页 > news >正文

Python爬虫系列教程之第四篇:数据存储与管理

大家好,欢迎继续关注本系列爬虫教程。前几篇博客中,我们依次学习了爬虫的基础知识、数据解析技巧以及应对反爬策略的高级请求方法。在实际爬虫项目中,数据采集只是第一步,如何将提取到的数据进行存储与管理同样非常重要。本篇博客将详细介绍如何将数据保存到CSV文件、JSON文件以及SQLite数据库中,并附上完整的代码示例,代码中均包含详细的中文注释,方便大家理解和学习。

1. 为什么需要数据存储

在爬虫开发中,数据存储是将抓取的数据进行持久化的重要步骤。常见的数据存储方式有:

  • CSV文件:适用于数据量不大且结构化简单的数据,便于数据交换与后续分析。
  • JSON文件:适合存储层次结构较为复杂的数据,具有良好的可读性与跨语言兼容性。
  • 数据库(如SQLite、MySQL等):适用于大规模数据存储和复杂查询,具备更高的数据安全性与管理能力。

本篇博客将通过一个完整的示例,演示如何从豆瓣电影TOP250页面中抓取电影信息,并将数据分别保存到CSV、JSON以及SQLite数据库中。


2. 完整示例代码

下面的代码示例包含三个主要部分:

  1. 数据采集:通过requestsBeautifulSoup爬取豆瓣电影TOP250页面,提取电影名称与评分。
  2. 数据存储到CSV文件:利用Python自带的csv模块将数据写入CSV文件。
  3. 数据存储到JSON文件:利用json模块将数据存入JSON文件,格式美观易读。
  4. 数据存储到SQLite数据库:使用sqlite3模块将数据存入SQLite数据库,便于后续数据查询与管理。

注意:运行以下代码前,请确保已安装所需库,如requestsbs4lxml。可通过命令 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(自增主键)、titlerating字段的movies表。
  • 数据插入
    遍历电影数据并使用参数化SQL语句将数据逐行插入到表中,最后提交事务并关闭数据库连接。

4. 小结

在本篇博客中,我们学习了如何对爬虫抓取到的数据进行多种方式的存储,包括保存到CSV文件、JSON文件以及SQLite数据库中。通过完整的代码示例,希望大家能够实践并灵活运用这些数据存储技术,为后续数据分析与应用打下坚实基础。

如果你对本文内容有疑问或建议,欢迎在评论区留言讨论,也请关注我的CSDN博客获取更多更新内容。记得点赞、收藏和分享哦!

让我们在Python爬虫的道路上不断前进,探索更多高级技术吧!

相关文章:

  • Kubernetes-node(节点) 组件
  • Java 包装类详解
  • 04运维实用篇(D4_日志)
  • Windows Server 中配置 Active Directory:从零到精通
  • Kubernetes 概述
  • Ubuntu 下 nginx-1.24.0 源码分析 - ngx_cycle_t 类型
  • 数据库基本概念及基本使用
  • AcWing 801. 二进制中1的个数
  • kamailio常见问题解答
  • 1-16 tortoiseGit分支与Git操作
  • Windows逆向工程入门之栈指令与核心机制深度解析
  • 什么是原型?
  • Yolov5算法原理
  • 15.1 Process(进程)类
  • 基于 energy (lcl v3.0) 跨平台GUI框架实现的 XTA SDK GUI 源码实现
  • 考研操作系统-----外存文件
  • MATLAB图像处理:图像分割方法
  • 使用conda update python将python3.6更新到python3.7版本出现bug:
  • 计算机组成原理第二章
  • 如何将ubuntu下的一个目录,保存目录结构为一个git仓库并上传
  • 美国和沙特签署上千亿美元军售协议
  • 深圳中院回应“退休夫妻月入1.2万负债1.2亿”:其自述因经营不善负债
  • 马上评丨火车穿村而过多人被撞身亡,亡羊补牢慢不得
  • 广东韶关一镇干部冲进交通事故火海救人,获授“见义勇为”奖励万元
  • 专访|日本驻华大使金杉宪治:对美、对华外交必须在保持平衡的基础上稳步推进
  • 法治日报:炮制师生日常剧本,校园怎么成了短视频流量秀场?