数据清洗、存储与可视化的Python爬虫实践:以人民日报“中国梦”为例
引言
随着大数据时代的到来,如何有效地从海量信息中提取有价值的数据并进行分析变得尤为重要。本文将介绍一个完整的数据处理流程,包括爬虫抓取、数据清洗、存储以及可视化分析,具体案例为从人民网获取的关于“中国梦”的相关文章数据。
爬虫脚本简介
目标
我们的目标是从人民网搜索平台抓取包含特定关键词(如“中国梦”)的文章,并将其保存到本地文件中。为此,我们使用了requests库发送HTTP请求,json库解析返回的数据,以及datetime和time库处理时间相关的操作
import requests
import json
import datetime
import time
def page_data(page, keyword="中国梦"):
url = "http://search.people.cn/search-platform/front/search"
data = {"key": keyword, "page": page, "limit": 10}
response = requests.post(url, headers=HRADER, cookies=COOKIES, data=json.dumps(data))
return response.json()
导入模块说明:
import re
import pandas as pd
re:正则表达式模块,用于提取URL中的板块信息。pandas:数据分析和处理工具,是整个数据清洗的核心。
关键点
- 模块化设计:将功能分解为多个函数,提高代码可读性和维护性。
- 防止被封IP:合理设置请求间隔,避免频繁请求导致IP被封。
读取原始数据:
df = pd.read_csv('人民日报中国梦.csv')
- 使用
pd.read_csv()读取之前爬虫保存的 CSV 文件,生成一个 DataFrame 对象。
数据去重:
df.drop_duplicates(inplace=True)
- 使用
drop_duplicates()方法去除重复行,默认会比较所有列。 inplace=True表示直接在原数据上修改。
数据清洗与存储
数据清洗
原始数据通常包含大量冗余信息,需要进行清洗才能用于后续分析。这里我们使用pandas库来加载CSV文件,并进行去重、提取分类简称等操作。
import pandas as pd
import re
df = pd.read_csv('人民日报中国梦.csv')
df.drop_duplicates(inplace=True)
df["分类简称"] = [re.findall(r'//(.*?).people', i)[0] for i in df["url"]]
df["日期"] = df["时间"].str.split(" ").str[0]
存储到MySQL数据库
为了实现数据持久化存储,我们将清洗后的数据写入MySQL数据库中。这一步骤不仅便于长期保存数据,还能支持多用户访问和查询
from sqlalchemy import create_engine
engine = create_engine(f'mysql+pymysql://{username}:{password}@{host}:{port}/{database}?charset=utf8mb4')
df.to_sql("rmd_data", engine, if_exists="replace", index=False)
- 使用 SQLAlchemy 构建 MySQL 连接引擎,指定字符集为 utf8mb4(支持中文和 emoji)。
- 使用
to_sql()方法将 DataFrame 写入数据库。 if_exists="replace":如果表已存在,则先删除再重建。index=False:不写入索引列

整体流程图(可用于PPT)
读取CSV → 去重 → 提取分类简称 → 拆分日期 → 导出Excel → 存入MySQL
方法总结与优势 :
数据可视化分析
工具选择
为了直观地展示数据特征,我们选择了pyecharts作为可视化工具。它提供了丰富的图表类型,如词云图、饼图和折线图等。
导入模块说明:

词云图
词云图能够快速展示文本数据中的高频词汇,帮助我们了解文章的主题和热点。
import jieba.analyse
from pyecharts.charts import WordCloud
from pyecharts import options as opts
def word_cloud(data_list):
word = jieba.analyse.extract_tags("".join(data_list), topK=500, withWeight=True)
w = (
WordCloud()
.add("", word, word_size_range=[12, 40])
.set_global_opts(title_opts=opts.TitleOpts(title="标题词云"))
)
w.render("标题词云.html")
功能:
- 对所有“标题”字段中的文本进行中文分词与关键词提取;
- 生成词云图,突出高频词汇。
使用技术:
jieba.analyse.extract_tags():TF-IDF 提取关键词WordCloud():构建词云图topK=500:提取前500个关键词withWeight=True:返回关键词及其权重
✅ 好处:
- 快速了解文章主题和热点词汇;
- 视觉上吸引用户注意重点内容。

饼图
饼图用于统计不同日期的发文数量,帮助我们了解新闻发布的时间分布。
from pyecharts.charts import Pie
def pie(data_items):
pie = (Pie().add("", data_items).set_global_opts(
title_opts={"text": "日期发文统计"}
))
pie.render("日期发文统计.html")
功能:
- 接收一个包含
(标签, 数量)的列表,生成一个饼图。 - 显示前10天的发文数量占比。
使用技术:
Pie():创建饼图对象render():输出为 HTML 文件-
✅ 好处:
- 清晰展示每日发文分布情况;
- 支持滚动图例,适合显示较多类别。

折线图
折线图展示了不同新闻板块的文章数量变化趋势,有助于发现热门话题和发展趋势。
from pyecharts.charts import Line
def line(x, y):
line = (
Line()
.add_xaxis(x)
.add_yaxis("统计数量", y)
.set_global_opts(title_opts=opts.TitleOpts(title="分类数量统计折线图"))
)
line.render("分类数量统计折线图.html")
功能:
- 统计不同新闻板块(如社会、军事等)的文章数量;
- 用折线图展示各分类的分布。
使用技术:
Line():创建折线图对象add_xaxis()/add_yaxis():添加坐标轴数据rotate=-45:旋转横轴标签避免重叠
✅ 好处:
- 直观比较不同类别的发文数量;
- 支持自定义样式,便于展示趋势变化。

主程序逻辑 :
if __name__ == '__main__':
df = pd.read_excel("清洗好数据.xlsm") # 读取Excel文件
word_cloud(df["标题"].to_list()) # 标题词云图
pie(list(df["日期"].value_counts().items())[0:10]) # 前十日期发文饼图
count_data_list = list(df["分类简称"].value_counts().items())[:10]
random.shuffle(count_data_list) # 打乱顺序增加视觉多样性
count_data_dict = dict(count_data_list)
line(list(count_data_dict.keys()), list(count_data_dict.values())) # 分类折线图
流程说明:
- 读取清洗后的 Excel 数据;
- 调用三个函数分别生成:
- 标题词云图
- 日期发文饼图
- 分类数量折线图
- 其中分类图在展示前进行了随机排序,使图表更美观。
方法总结与优势
模块化设计
通过将功能分解为多个独立函数,提高了代码的可读性和可维护性。每个函数专注于单一任务,使得调试和扩展更加容易。
灵活参数配置
允许用户自定义搜索关键字、数据存储位置等参数,增加了脚本的灵活性和适用范围。
防止被封IP
通过在循环中加入短暂的延时,减少了对目标服务器的压力,降低了被封IP的风险。
改进建议
尽管当前脚本已经具备了基本功能,但仍有一些改进空间:
- 异常处理机制:增加try-except捕获网络或数据库连接失败的情况。
- 日志记录:添加logging模块,记录每一步执行情况,便于调试和监控。
- 定时任务:结合APScheduler或系统计划任务实现自动更新。
- 可视化展示:使用Matplotlib/Seaborn/Echarts进一步丰富可视化效果。
结语
通过本文的介绍,我们了解了一个完整的数据处理流程,从爬虫抓取、数据清洗、存储到可视化分析。希望这些内容能为从事数据分析工作的朋友们提供一些参考和启发。
更多推荐
所有评论(0)