一、第三章 Python数据操作基础
1. 列表与字典核心知识点
列表(list):有序、可重复、可变序列,常用于存储多条数据记录。
字典(dict):键值对结构,适合存储一条完整数据(如新闻标题、新闻链接),是爬虫数据存储最常用类型。
本次实训使用:列表嵌套字典存储多条新闻数据,是数据分析最标准格式。
示例格式:
[ {"title": "新闻1", "url": "xxx"}, {"title": "新闻2", "url": "xxx"} ]2. 字符串数据清洗知识点
爬虫获取的网页数据通常带有空格、换行符、空白字符,需要清洗。
常用清洗方法:
.strip():去除首尾空格、换行、空白字符(本次实训核心清洗操作)
.replace():替换指定字符
.split():字符串分割
3. 集合去重原理
集合(set)特点:元素无序、不可重复,非常适合数据去重。
本项目去重逻辑:
新闻URL是唯一标识,重复URL代表重复新闻。使用集合存储已出现的URL,实现全自动去重。
4. 模块化编程思想
将一个完整项目拆分为多个功能文件,降低耦合、方便维护:
spider.py:数据采集模块
cleaner.py:数据清洗、去重模块
storage.py:数据持久化存储模块
main.py:主程序调度入口
二、第四章 数据采集与存储
1. 网络爬虫原理
爬虫(Web Spider):模拟浏览器请求,向网站发送请求,获取网页源代码,解析提取有效数据。
爬虫三步骤:
发送请求(requests)
解析数据(xpath/正则/bs4)
保存数据(文件/数据库)
2. 数据采集方式说明
本次实训采用模拟数据采集方式,稳定、无反爬、无网络问题,适合课程实训作业。
模拟数据优势:
不受网站改版、XPath失效影响
无需联网即可运行
数据稳定固定20条,满足实训要求
3. 数据清洗流程
标准数据清洗三步:
空白清洗:去除标题、URL首尾多余空格、换行符
数据去重:根据唯一字段URL去重,保证数据不重复
数据规整:统一数据格式,为存储做准备
4. 三种数据持久化存储方式
(1)CSV文件存储
特点:表格格式、通用、Excel可打开、适合结构化数据。
适用场景:数据分析、数据统计、实训作业最常用。
(2)JSON文件存储
特点:轻量级、键值对结构、前后端通用、保留原始字典格式。
适用场景:接口数据、爬虫原始数据保存。
(3)MySQL数据库存储
特点:结构化数据库、支持增删改查、适合大批量数据存储。
本次已完整编写入库代码,包含:
数据库连接
数据批量插入
数据条数查询校验
5. 项目完整执行流程(大题标准答案)
1. 执行spider模块,批量获取20条新闻数据(标题、URL)
2. 执行cleaner模块,清洗文本并根据URL自动去重
3. 通过storage模块分别保存为CSV、JSON格式文件
4. 调用MySQL存储接口可实现数据库入库
5. 查询数据总量,验证数据完整性
三、完整实训代码
1. spider.py 数据采集模块
def get_news_list(): """模拟采集 20 条新闻数据,返回列表嵌套字典结构""" news_data = [] for i in range(20): news_data.append({ "title": f"新闻{i + 1}:人工智能行业新动态{i}", "url": f"https://demo-news.com/article/{i + 1}" }) return news_data if __name__ == '__main__': data = get_news_list() print("抓取新闻数量:", len(data))2. cleaner.py 清洗去重模块
def clean_and_deduplicate(news_list): """清洗标题与 URL 的首尾空白,并按 URL 去重""" seen_url = set() clean_data = [] for news in news_list: news["title"] = news["title"].strip() news["url"] = news["url"].strip() if news["url"] not in seen_url: seen_url.add(news["url"]) clean_data.append(news) return clean_data3. storage.py 存储模块
import csv import json import pymysql def save_csv(data): """将数据保存为 CSV 文件""" with open("news.csv", "w", encoding="utf-8", newline="") as f: writer = csv.DictWriter(f, fieldnames=["title", "url"]) writer.writeheader() writer.writerows(data) print("✅ CSV保存成功:news.csv") def save_json(data): """将数据保存为 JSON 文件""" with open("news.json", "w", encoding="utf-8") as f: json.dump(data, f, ensure_ascii=False, indent=2) print("✅ JSON保存成功:news.json") def save_mysql(data, host="localhost", user="root", password="123456", db="testdb"): """将数据批量写入 MySQL 数据库""" conn = pymysql.connect(host=host, user=user, password=password, database=db, charset="utf8mb4") cur = conn.cursor() insert_sql = "INSERT INTO news(title, url) VALUES(%s, %s)" for item in data: cur.execute(insert_sql, (item["title"], item["url"])) conn.commit() cur.close() conn.close() print("✅ MySQL写入完成") def query_mysql_count(host="localhost", user="root", password="123456", db="testdb"): """查询数据库中的新闻总条数,用于校验数据完整性""" conn = pymysql.connect(host=host, user=user, password=password, database=db, charset="utf8mb4") cur = conn.cursor() cur.execute("SELECT COUNT(*) FROM news") res = cur.fetchone() cur.close() conn.close() return res[0]4. main.py 主程序
from spider import get_news_list from cleaner import clean_and_deduplicate from storage import save_csv, save_json if __name__ == "__main__": print("===== 开始抓取新闻 =====") raw_news = get_news_list() print(f"原始抓取条数:{len(raw_news)}") print("===== 清洗去重 =====") clean_news = clean_and_deduplicate(raw_news) print(f"清洗后有效新闻条数:{len(clean_news)}") print("===== 保存文件 =====") save_csv(clean_news) save_json(clean_news) print("✅ 项目全部执行完成")