这次我们来看一个典型的 Python 大数据方向计算机毕业设计:基于爬虫技术的新闻聚合平台。
这个项目的技术栈很清晰,就是 Python + 爬虫 + Hadoop + Django。它要解决的问题也很普通但很实用:把多个新闻网站或资讯源的内容采集下来,统一清洗、存储,再通过 Django 做一个聚合展示页面,最后把数据放进 Hadoop 做简单的离线分析。整个过程刚好覆盖了“爬虫采集 -> 数据入库 -> Web 展示 -> Hadoop 分析”这条完整链路。
对于正在选毕设题目的同学来说,这个项目最值得关注的点有三个:
- 技术栈覆盖面广,从爬虫到 Web 开发再到 Hadoop 大数据处理都有涉及,答辩时有内容可讲。
- 每个模块都可以独立验证,爬虫跑没跑到数据、Hadoop 分析有没有输出、Django 页面能不能展示,边界很清楚。
- 项目可以按“基础版”和“完整版”两个阶段来做,先跑通 Django + 爬虫,再接入 Hadoop,降低一开始的开发压力。
这篇文章会从核心能力、技术拆分、环境准备、部署启动、功能验证、Hadoop 数据流转、API 与批量调度、资源占用、常见问题和最佳实践这几个角度展开。如果你正在准备毕业设计或课程设计,完全可以把这套思路当作自己的项目骨架。
1. 核心能力速览
| 能力项 | 说明 |
|---|---|
| 项目类型 | Python 计算机毕业设计 / 课程设计 |
| 核心技术栈 | Python、爬虫、Django、Hadoop |
| 主要功能 | 新闻采集、数据清洗、内容聚合展示、后台管理、Hadoop 离线分析 |
| 采集方式 | 基于 requests / Scrapy 等通用爬虫方案,具体以源码实际实现为准 |
| 前端展示 | Django 模板渲染,新闻分类、标题、来源、发布时间展示 |
| 后台管理 | Django 自带 Admin 后台,可管理新闻条目、爬虫来源、用户 |
| 数据存储 | 常见组合为 MySQL / SQLite,具体需看项目的 settings.py 配置 |
| Hadoop 角色 | HDFS 存储采集数据或日志,MapReduce 做词频统计等离线分析 |
| 启动方式 | 命令行启动 Django 服务 + 定时/手动运行爬虫脚本 |
| API 能力 | Django 视图可直接返回 JSON,天然支持简单接口调用 |
| 适合场景 | 毕业设计、课程设计、竞赛项目、简历项目 |
| 附带内容 | 源码、文档报告、代码讲解、答辩演示 |
需要说明的是,不同版本的毕设项目在细节上差别很大。比如有的项目用 Scrapy,有的用 requests;有的 Hadoop 部分只是把数据导入 HDFS,有的会跑 MapReduce 做热点词统计。拿到源码后,第一步不是急着运行,而是先看目录结构和 README,确认项目到底用了哪种采集方式和哪种数据库。
2. 技术栈拆解与项目价值
2.1 Python 爬虫模块
爬虫模块负责从新闻网站采集数据,是整个项目的数据来源。常见实现方式是 requests 请求页面,BeautifulSoup 或 lxml 解析 HTML,提取标题、正文、发布时间、来源、图片地址等字段。
从毕设的角度,爬虫模块要能体现这几个能力:
- 请求构造:设置 User-Agent、Referer、超时时间。
- 页面解析:从 HTML 中提取结构化字段。
- 数据清洗:去空白、去 HTML 标签、过滤无效内容。
- 入库:把清洗后的数据写入数据库。
需要注意,爬虫模块在答辩时很容易被追问反爬问题。准备一个合理的话术很重要:只采集允许访问的公开页面,遵守目标网站的 robots 协议,控制请求频率,不绕过登录限制,不采集个人隐私数据。这样既安全又专业。
2.2 Django Web 模块
Django 模块承担业务展示和后台管理,最核心的部分有:
- 数据模型:新闻表、来源表、分类表、用户表。
- 视图逻辑:新闻列表、新闻详情、分类筛选、关键词搜索。
- 模板页面:首页、列表页、详情页、后台管理页。
- Admin 后台:注册模型,使用 Django 自带的增删改查页面。
Django 的 MVT 结构很适合写进文档报告,因为每一层职责都很清晰。Model 负责数据表结构,View 负责业务逻辑,Template 负责页面显示,答辩时按这个思路讲就行了。
2.3 Hadoop 大数据模块
Hadoop 在这个项目里不是必须的,但加上它之后,项目的“大数据”属性会明显提升。常见的设计方式有两种:
一种是“存储型”:爬虫采集到数据后,除了写入数据库,还同步导出到 JSON / CSV 文件,再上传到 HDFS。这种方式实现难度低,能展示 HDFS 基本操作。
另一种是“分析型”:把数据库中的新闻文本导出,使用 MapReduce 做词频统计、热点词提取、新闻数量按来源统计等。这种方式更能体现 Hadoop 的价值,答辩时也更有的讲。
从实用角度看,建议优先做“分析型”。因为词频统计是 Hadoop 经典场景,代码逻辑简单,效果直观,老师一眼就能看懂项目里 Hadoop 的作用。
2.4 项目价值
这个项目对毕设来说,最大的价值是“全链路清晰”。从数据采集到数据存储,从 Web 展示到离线分析,每一环都能看到数据流动。即使每一层做得都不深,组合起来也是一个完整的系统,符合大多数本科毕设的题目要求。
3. 适用场景与使用边界
3.1 适合什么人做
- 计算机、软件工程、大数据相关专业的本科生,需要完成毕设或课设。
- 想同时掌握 Python 爬虫、Django Web 开发和 Hadoop 基础操作的初学者。
- 需要把“大数据 + 爬虫 + Web”三块能力打包成简历项目的同学。
3.2 能解决的问题
- 新闻信息分散在多个网站,需要一个统一入口查看。
- 手动复制粘贴新闻过于低效,需要自动采集。
- 采集到的数据需要做简单统计,比如不同来源的新闻数量、高频关键词。
- 需要一套可视化后台,方便维护新闻数据和抓取来源。
3.3 不适合什么场景
- 不适合用于大规模线上生产,Django 默认开发服务器并发能力有限。
- 不适合做实时新闻流,这个项目本质是定时采集 + 离线分析。
- 不适合直接抓取付费内容、非公开接口和需要登录才能访问的数据。
3.4 合规与安全边界
爬虫模块是整个项目里合规风险最高的地方,务必注意:
- 只采集公开可访问的页面。
- 检查目标网站的 robots 协议。
- 控制请求频率,不要对目标服务器造成压力。
- 不绕过反爬机制,不做验证码破解。
- 采集内容仅用于学习、研究和展示,转载展示时注明来源。
- 不采集个人隐私、账号信息、非公开内容。
在做项目演示时,建议选择几个明确允许数据抓取或无明确禁止的测试站点,避免在答辩演示时出现访问异常或合规问题。
4. 环境准备与前置条件
这个项目涉及 Python 和 Hadoop 两套环境,建议分开准备。
4.1 Python 环境
需要安装 Python 3.8 及以上版本。项目如果用了 Django 3.2 或 4.x,建议直接使用 Python 3.10,兼容性比较稳定。
推荐创建虚拟环境,避免多个项目依赖冲突:
python -m venv venv source venv/bin/activate # Windows 下使用 venv\Scripts\activate4.2 Python 依赖
根据项目类型,常见的依赖包含:
Django>=3.2,<5.0 requests>=2.31.0 beautifulsoup4>=4.12.0 lxml>=4.9.0 pymysql>=1.0.2注意:这里只是通用清单。拿到源码后,先查看项目根目录有没有 requirements.txt,有的话直接安装:
pip install -r requirements.txt如果安装速度慢,可以临时使用国内镜像源:
pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple4.3 Hadoop 环境
Hadoop 在毕设项目中通常是伪分布式部署,就是在一台机器上同时运行 HDFS 和 YARN 的各个进程。这个方案不需要多台服务器,但对本机内存有一定要求,建议至少 8G 内存。
伪分布式环境准备:
- JDK 1.8 或 JDK 11,Hadoop 依赖 Java 环境。
- SSH 免密登录,Hadoop 启动时会通过 SSH 管理进程。
- Hadoop 3.x 安装包,下载后解压到本地目录。
- 配置
core-site.xml、hdfs-site.xml、yarn-site.xml等核心配置文件。
4.4 数据库环境
如果项目使用 MySQL,需要提前安装 MySQL 8.0,并创建数据库:
CREATE DATABASE news_platform DEFAULT CHARACTER SET utf8mb4;如果项目默认使用 SQLite,则不需要额外安装,Django 会自动生成db.sqlite3文件。
4.5 端口准备
- Django 默认使用 8000 端口。
- Hadoop NameNode Web 界面默认使用 9870 端口(Hadoop 3.x)。
- YARN ResourceManager Web 界面默认使用 8088 端口。
启动前先确认端口没有被占用。
5. 安装部署与启动方式
这里给出一套通用的部署流程,具体命令需要以你拿到的源码为准。
5.1 安装依赖
cd news_platform python -m venv venv source venv/bin/activate pip install -r requirements.txt5.2 修改数据库配置
如果项目使用 MySQL,需要打开settings.py,修改数据库连接信息:
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'news_platform', 'USER': 'root', 'PASSWORD': 'your_password', 'HOST': '127.0.0.1', 'PORT': '3306', } }同时需要在项目的__init__.py中引入 pymysql,因为 Python 3 环境下 PyMySQL 是用来替代 MySQLdb 的:
import pymysql pymysql.install_as_MySQLdb()5.3 执行数据库迁移
python manage.py makemigrations python manage.py migrate5.4 创建后台管理员账号
python manage.py createsuperuser按提示输入用户名、邮箱(可跳过)、密码。
5.5 启动 Django 服务
python manage.py runserver 0.0.0.0:8000启动成功后,浏览器访问http://127.0.0.1:8000可以看到前台页面,访问http://127.0.0.1:8000/admin可以进入后台。
5.6 启动 Hadoop 服务
如果项目涉及 Hadoop,需要先启动 HDFS 和 YARN:
cd $HADOOP_HOME/sbin start-dfs.sh start-yarn.sh启动后执行jps确认进程:
jps正常情况下可以看到这些进程:
NameNode DataNode SecondaryNameNode ResourceManager NodeManager如果缺少某个进程,说明 Hadoop 配置有问题,需要查看对应日志。
6. 功能测试与效果验证
项目跑起来之后,不要急着截图,按顺序做一轮功能验证,确保每个模块都能正常工作。
6.1 验证 Django 后台
测试目的:验证数据模型和 Admin 后台是否正常。
操作步骤:
- 浏览器访问后台登录页。
- 使用管理员账号登录。
- 检查后台是否能显示新闻、分类、来源、用户等数据表。
- 尝试手动新增一条新闻。
- 修改该新闻的标题或分类。
- 删除该新闻。
预期结果:
- 后台能正常增删改查。
- 表单提交后数据库记录同步变化。
常见失败原因:
- 迁移没有执行,后台找不到数据表。
- 数据库连接配置错误。
- 创建超级用户失败。
6.2 验证前台新闻聚合展示
测试目的:验证前台页面数据的读取和展示。
操作步骤:
- 在后台手动添加 5 到 10 条新闻数据。
- 访问前台首页。
- 确认新闻列表是否按发布时间排序。
- 点击一条新闻进入详情页。
- 验证标题、来源、发布时间、正文内容是否正常展示。
预期结果:
- 前台页面能读取数据库中的数据。
- 详情页跳转正常。
常见失败原因:
- 模板变量名和视图返回的数据不一致。
- 静态文件缺失导致页面样式错乱。
- 数据表没有数据导致列表为空。
6.3 验证爬虫采集链路
测试目的:验证爬虫能不能真实采集到数据。
操作步骤:
- 查看爬虫源码,确认目标网站。
- 在命令行运行爬虫脚本或 Django 管理命令。
- 观察日志输出。
- 到后台查看是否新增了采集数据。
示例命令,具体以项目为准:
python manage.py runspider或者直接运行爬虫脚本:
python spiders/news_spider.py预期结果:
- 爬虫成功请求页面。
- 解析出标题、正文、时间、来源等字段。
- 新数据写入数据库。
- 重复数据没有重复入库。
常见失败原因:
- 目标网站页面结构变更,HTML 选择器失效。
- 请求被目标网站拦截。
- 没有设置 User-Agent。
- 数据编码不是 UTF-8,解析后乱码。
6.4 验证增量采集与去重
测试目的:验证多次运行爬虫时不会产生重复数据。
操作步骤:
- 第一次运行爬虫。
- 记录后台新闻条数。
- 第二次运行同样命令。
- 再次查看后台新闻条数。
预期结果:
- 第二次运行后新增条数很少或为 0。
- 没有产生大量重复数据。
常见失败原因:
- 项目没有实现去重逻辑。
- 去重逻辑只比对标题,标题相同但内容不同的新闻被误判。
- 每次采集都生成新的唯一标识,导致去重失效。
6.5 验证 Hadoop 数据导入与分析
测试目的:验证数据能否导入 HDFS,并执行 MapReduce 分析任务。
操作步骤:
- 从数据库中导出新闻文本数据为 JSON 或 CSV 文件。
- 在 HDFS 中创建输入目录。
- 上传数据文件到 HDFS。
- 运行词频统计或数据统计任务。
- 查看输出结果。
HDFS 通用命令示例:
hdfs dfs -mkdir -p /news/input hdfs dfs -put news_export.json /news/input/运行 WordCount 通用示例:
hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.6.jar wordcount /news/input /news/output任务完成后查看结果:
hdfs dfs -cat /news/output/part-r-00000 | head -n 20预期结果:
- 数据文件成功上传。
- MapReduce 任务正常结束。
- 输出文件里能看到统计后的高频词。
常见失败原因:
- Hadoop 进程没有全部启动。
- NameNode 处于 SafeMode 状态。
- 输入路径不存在。
- 同一输出路径已经存在,需要先删除。
6.6 验证搜索与分类筛选
测试目的:验证新闻平台的基本检索能力。
操作步骤:
- 在前台搜索框输入一个关键词。
- 点击分类标签。
- 查看返回结果。
预期结果:
- 搜索结果包含标题或内容中匹配关键词的新闻。
- 分类筛选只显示当前分类下的新闻。
- 空结果显示友好提示。
7. Hadoop 模块设计与数据流转
这部分是毕设答辩的重点,也是项目区别于普通 Django 新闻网站的关键。
7.1 数据流转流程
整个系统的数据流转可以概括为:
- 爬虫从外部网站采集原始新闻数据。
- 数据清洗后写入 MySQL / SQLite。
- Django 从数据库读取数据,渲染前台页面。
- 同时,将新闻数据导出为结构化文件,上传到 HDFS。
- MapReduce 对 HDFS 中的新闻文本做离线分析。
- 分析结果写回 HDFS 或展示在管理页面。
7.2 HDFS 目录设计建议
建议按照数据批次组织目录,方便后期管理和重跑任务:
/news/input/20250601_news.json /news/input/20250602_news.json /news/output/wordcount_20250601 /news/output/wordcount_202506027.3 MapReduce 分析思路
如果只是做一个最简单的演示,可以用词频统计来体现 Hadoop 的作用。统计所有新闻中出现最多的关键词,一定程度上反映热点话题。
MapReduce 的实现思路:
- Map 阶段:将新闻标题和正文按空格、标点切分成单词,输出
<word, 1>。 - Reduce 阶段:对同一个单词的所有计数求和,输出
<word, totalCount>。
这一步在毕设文档里很好写,也是 Hadoop 课程里的标准案例。
7.4 如何让 Hadoop 模块不显得生硬
常见的问题是:项目里用 Hadoop 的方式很牵强,就是为了用而用。要避免这个问题,可以从业务角度串联:
- “新闻每天产生大量文本数据,需要离线统计今天的新闻热点。”
- “统计结果可以用于前台展示热点新闻标签。”
- “Django 只负责交互展示,离线计算交给 Hadoop,两者分工明确。”
这样讲,Hadoop 在项目里的定位就合理了。
8. 接口 API 与批量调度
8.1 Django 返回 JSON 接口
如果项目需要给前端页面或其他系统提供数据,可以在 Django 中写一个简单的 JSON 接口。
通用示例:
from django.http import JsonResponse from .models import News def news_list_api(request): keyword = request.GET.get("keyword", "") news_items = News.objects.all() if keyword: news_items = news_items.filter(title__icontains=keyword) data = list(news_items.values("title", "source", "publish_time")[:50]) return JsonResponse({"code": 0, "data": data})前端或测试工具可以直接访问:
http://127.0.0.1:8000/api/news?keyword=python返回结果形式:
{ "code": 0, "data": [ { "title": "Python 爬虫教程", "source": "示例新闻源", "publish_time": "2025-06-01 10:00:00" } ] }这个接口说明项目具备了简单的数据服务能力,毕设文档里可以写“平台支持对外提供 JSON 数据接口”。
8.2 爬虫定时调度
爬虫不能一直靠手动运行,建议使用系统定时任务或 Python 定时任务。
Linux 下使用 crontab 的通用示例:
# 每天凌晨 2 点执行增量采集 0 2 * * * cd /path/to/news_platform && /usr/bin/python manage.py runspider >> logs/spider.log 2>&1如果项目使用 Django 自定义管理命令,示例命令可能是python manage.py crawl_news,具体以项目源码为准。
8.3 批量任务注意事项
批量新闻采集需要考虑几个问题:
- 请求失败重试:单个新闻源请求失败不能导致整个任务中断。
- 日志输出:记录每次请求的状态码、耗时、新增数据条数。
- 去重:防止重复入库。
- 频率控制:每两个请求之间增加随机延时,降低目标服务器压力。
时间间隔示例:
import time import random time.sleep(random.uniform(1, 3))9. 资源占用与性能观察
9.1 Django 开发服务器资源占用
开发环境下直接使用python manage.py runserver即可。它是单进程开发服务器,适合本地测试,不适合压测上线。在做性能测试时,建议只测试功能,不要追求并发数据。
9.2 Hadoop 资源占用
伪分布式 Hadoop 是资源占用大户,尤其是内存。在不调整参数的情况下,一台 8G 内存的机器跑虚拟机 + Hadoop + Django + 爬虫会比较吃力。建议:
- 本地开发时先不启动 Hadoop,只跑 Django 和爬虫。
- 需要验证 Hadoop 模块时再启动 Hadoop,验证完关掉。
- 可以通过调整
hadoop-env.sh中的HADOOP_HEAPSIZE限制堆内存。
9.3 爬虫并发与性能
单个线程的 requests 爬虫速度较慢,但胜在稳定。如果使用多线程,需要控制线程数量,避免请求频率过高。建议先在单个页面上测试爬取速度,再决定是否增加并发。
9.4 日志查看方式
Django 开发模式下日志直接输出到控制台。爬虫脚本如果有日志模块,通常写在logs/目录下。查看日志时关注三个信息:
- 爬虫是否成功请求页面。
- 解析出的数据条数是否正常。
- 是否有异常堆栈。
10. 常见问题与排查方法
| 问题现象 | 可能原因 | 排查方式 | 解决方案 |
|---|---|---|---|
pip install安装依赖失败 | 网络原因或依赖冲突 | 查看错误信息,确认是超时还是版本冲突 | 使用国内镜像源或升级 pip 后重试 |
| Django 启动报模块不存在 | 未安装依赖或未进入虚拟环境 | 执行pip list检查依赖列表 | 安装依赖后重新启动 |
| 后台登录报错 | 未创建超级用户或密码错误 | 重新执行createsuperuser | 创建新管理员账号 |
| 数据库表不存在 | 未执行迁移命令 | 查看 MySQL 中是否存在数据表 | 执行migrate |
| MySQL 连接失败 | 数据库服务未启动或密码错误 | 使用命令行测试连接 | 启动 MySQL 并修正配置 |
| 爬虫请求被拒绝 | 缺少 User-Agent 或频率过高 | 查看响应状态码 | 增加请求头,降低频率 |
| 爬虫解析不到数据 | 页面结构变化或选择器错误 | 打印响应内容检查 | 更新 HTML 选择器 |
| 中文乱码 | 页面编码设置错误 | 检查resp.encoding | 设置为对应编码 |
| 采集数据重复 | 缺少去重逻辑 | 查看爬虫代码中是否有唯一性判断 | 增加标题唯一约束或去重逻辑 |
| Hadoop 启动少进程 | SSH 免密未配置或配置错误 | 查看日志和jps输出 | 重新配置 Java、SSH、Hadoop 环境变量 |
| HDFS 文件上传失败 | NameNode 处于 SafeMode | 执行hdfs dfsadmin -safemode leave | 关闭安全模式后重试 |
| MapReduce 任务失败 | 内存不足或输出路径已存在 | 查看 YARN 日志 | 删除输出目录或调整内存参数 |
11. 最佳实践与使用建议
这个项目虽然是一个毕设项目,但完全可以按照工程项目的方式去组织和验收。
11.1 目录结构建议
news_platform/ ├── manage.py ├── requirements.txt ├── README.md ├── news_platform/ # Django 项目配置 ├── news/ # 新闻应用 │ ├── models.py │ ├── views.py │ ├── urls.py │ ├── templates/ │ └── management/ │ └── commands/ │ └── runspider.py ├── spiders/ # 爬虫脚本 ├── scripts/ # 数据导入导出脚本 ├── docs/ # 文档报告 ├── logs/ # 日志目录 └── data/ # 采集数据临时目录11.2 版本控制与备份
建议把整个项目放到 Git 仓库中管理,至少保留稳定版本标签。文档报告和答辩 PPT 同步更新,特别是技术栈说明、数据库设计、系统架构图这三块。
11.3 答辩演示顺序建议
建议演示时按照以下顺序展示,逻辑更顺:
- 主页展示,说明新闻聚合平台的整体效果。
- 后台管理,展示新闻数据的增删改查。
- 爬虫采集,现场运行一条爬虫或展示已有采集日志。
- Hadoop 分析,展示 HDFS 文件和 MapReduce 统计结果。
- 接口调用,使用浏览器或 Postman 访问 JSON 接口。
11.4 爬虫合规注意事项
再次强调:
- 采集目标选择公开、允许访问的新闻站点。
- 在文档报告中明确写明“本项目仅用于学习研究,不做商业化使用”。
- 不采集非公开接口、登录后内容、个人隐私数据。
- 控制爬取频率,不造成对方服务器压力。
- 展示采集结果时注明来源。
11.5 文档报告写作建议
毕设文档报告比起代码,可能更影响最终评分。建议至少包含:
- 系统需求分析:用户需求、功能需求、非功能需求。
- 系统设计:总体架构、模块设计、数据库 ER 图。
- 详细设计:爬虫模块流程、Django 页面流程、Hadoop 数据处理流程。
- 系统实现:核心代码片段和解释。
- 系统测试:测试用例、测试结果、问题修复记录。
- 总结与展望:项目难点、收获、后续改进方向。
12. 总结与下一步
这个项目最值得尝试的地方在于,它把 Python 爬虫、Django 后端开发和 Hadoop 大数据处理串在了一条完整的数据流上。你不需要把每个模块做得十分深入,只要保证链路通畅、功能可验证、文档完整,就能在答辩时讲清楚一个系统。
拿到项目源码后,建议第一个先做的事情是跑通 Django 启动和后台登录,确认基础环境没问题。然后再运行爬虫,看数据能不能正常入库。最后再启动 Hadoop,把数据导入 HDFS 并跑一次简单的分析任务。按这个顺序走,每一步的成功标准都很明确,出现问题也容易定位。
最容易踩的坑有三个:第一个是 Python 依赖和 Django 版本不匹配,启动时报模块错误;第二个是 Hadoop 环境配置问题,经常因为 SSH 免密或环境变量导致进程启动不全;第三个是爬虫目标网站页面结构变动,解析不到数据。这三个问题都需要通过看日志和打印响应内容来排查。
后续可以扩展的方向也不少:比如给爬虫模块加上分布式的爬取能力;在 Hadoop 分析层用 Spark 替代 MapReduce;在 Django 前端引入更多可视化图表,把新闻来源分布、关键词趋势用图表展示出来;或者在平台里增加用户收藏、评论功能,让系统更像一个完整的新闻产品。
总结起来,这个项目是典型的“全链路毕设题”,难度适中、可扩展性强、答辩材料好写。建议收藏备用,平时多跑几遍流程,把所有问题提前暴露,后面答辩演示就不会手忙脚乱。