☰
Python数据操作基础与数据采集存储实训笔记(新闻爬虫项目)
2026/10/24 4:03:17 网站建设 项目流程

一、第三章 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):模拟浏览器请求,向网站发送请求,获取网页源代码,解析提取有效数据。

爬虫三步骤:

  1. 发送请求(requests)

  2. 解析数据(xpath/正则/bs4)

  3. 保存数据(文件/数据库)

2. 数据采集方式说明

本次实训采用模拟数据采集方式,稳定、无反爬、无网络问题,适合课程实训作业。

模拟数据优势:

  • 不受网站改版、XPath失效影响

  • 无需联网即可运行

  • 数据稳定固定20条,满足实训要求

3. 数据清洗流程

标准数据清洗三步:

  1. 空白清洗:去除标题、URL首尾多余空格、换行符

  2. 数据去重:根据唯一字段URL去重,保证数据不重复

  3. 数据规整:统一数据格式,为存储做准备

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_data

3. 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("✅ 项目全部执行完成")

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询