☰
Python爬虫与Django新闻聚合平台:Hadoop离线分析全链路实现
2026/10/25 5:06:49 网站建设 项目流程

这次我们来看一个典型的 Python 大数据方向计算机毕业设计:基于爬虫技术的新闻聚合平台。

这个项目的技术栈很清晰,就是 Python + 爬虫 + Hadoop + Django。它要解决的问题也很普通但很实用:把多个新闻网站或资讯源的内容采集下来,统一清洗、存储,再通过 Django 做一个聚合展示页面,最后把数据放进 Hadoop 做简单的离线分析。整个过程刚好覆盖了“爬虫采集 -> 数据入库 -> Web 展示 -> Hadoop 分析”这条完整链路。

对于正在选毕设题目的同学来说,这个项目最值得关注的点有三个:

  1. 技术栈覆盖面广,从爬虫到 Web 开发再到 Hadoop 大数据处理都有涉及,答辩时有内容可讲。
  2. 每个模块都可以独立验证,爬虫跑没跑到数据、Hadoop 分析有没有输出、Django 页面能不能展示,边界很清楚。
  3. 项目可以按“基础版”和“完整版”两个阶段来做,先跑通 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\activate

4.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/simple

4.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.txt

5.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 migrate

5.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 后台是否正常。

操作步骤:

  1. 浏览器访问后台登录页。
  2. 使用管理员账号登录。
  3. 检查后台是否能显示新闻、分类、来源、用户等数据表。
  4. 尝试手动新增一条新闻。
  5. 修改该新闻的标题或分类。
  6. 删除该新闻。

预期结果:

  • 后台能正常增删改查。
  • 表单提交后数据库记录同步变化。

常见失败原因:

  • 迁移没有执行,后台找不到数据表。
  • 数据库连接配置错误。
  • 创建超级用户失败。

6.2 验证前台新闻聚合展示

测试目的:验证前台页面数据的读取和展示。

操作步骤:

  1. 在后台手动添加 5 到 10 条新闻数据。
  2. 访问前台首页。
  3. 确认新闻列表是否按发布时间排序。
  4. 点击一条新闻进入详情页。
  5. 验证标题、来源、发布时间、正文内容是否正常展示。

预期结果:

  • 前台页面能读取数据库中的数据。
  • 详情页跳转正常。

常见失败原因:

  • 模板变量名和视图返回的数据不一致。
  • 静态文件缺失导致页面样式错乱。
  • 数据表没有数据导致列表为空。

6.3 验证爬虫采集链路

测试目的:验证爬虫能不能真实采集到数据。

操作步骤:

  1. 查看爬虫源码,确认目标网站。
  2. 在命令行运行爬虫脚本或 Django 管理命令。
  3. 观察日志输出。
  4. 到后台查看是否新增了采集数据。

示例命令,具体以项目为准:

python manage.py runspider

或者直接运行爬虫脚本:

python spiders/news_spider.py

预期结果:

  • 爬虫成功请求页面。
  • 解析出标题、正文、时间、来源等字段。
  • 新数据写入数据库。
  • 重复数据没有重复入库。

常见失败原因:

  • 目标网站页面结构变更,HTML 选择器失效。
  • 请求被目标网站拦截。
  • 没有设置 User-Agent。
  • 数据编码不是 UTF-8,解析后乱码。

6.4 验证增量采集与去重

测试目的:验证多次运行爬虫时不会产生重复数据。

操作步骤:

  1. 第一次运行爬虫。
  2. 记录后台新闻条数。
  3. 第二次运行同样命令。
  4. 再次查看后台新闻条数。

预期结果:

  • 第二次运行后新增条数很少或为 0。
  • 没有产生大量重复数据。

常见失败原因:

  • 项目没有实现去重逻辑。
  • 去重逻辑只比对标题,标题相同但内容不同的新闻被误判。
  • 每次采集都生成新的唯一标识,导致去重失效。

6.5 验证 Hadoop 数据导入与分析

测试目的:验证数据能否导入 HDFS,并执行 MapReduce 分析任务。

操作步骤:

  1. 从数据库中导出新闻文本数据为 JSON 或 CSV 文件。
  2. 在 HDFS 中创建输入目录。
  3. 上传数据文件到 HDFS。
  4. 运行词频统计或数据统计任务。
  5. 查看输出结果。

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 验证搜索与分类筛选

测试目的:验证新闻平台的基本检索能力。

操作步骤:

  1. 在前台搜索框输入一个关键词。
  2. 点击分类标签。
  3. 查看返回结果。

预期结果:

  • 搜索结果包含标题或内容中匹配关键词的新闻。
  • 分类筛选只显示当前分类下的新闻。
  • 空结果显示友好提示。

7. Hadoop 模块设计与数据流转

这部分是毕设答辩的重点,也是项目区别于普通 Django 新闻网站的关键。

7.1 数据流转流程

整个系统的数据流转可以概括为:

  1. 爬虫从外部网站采集原始新闻数据。
  2. 数据清洗后写入 MySQL / SQLite。
  3. Django 从数据库读取数据,渲染前台页面。
  4. 同时,将新闻数据导出为结构化文件,上传到 HDFS。
  5. MapReduce 对 HDFS 中的新闻文本做离线分析。
  6. 分析结果写回 HDFS 或展示在管理页面。

7.2 HDFS 目录设计建议

建议按照数据批次组织目录,方便后期管理和重跑任务:

/news/input/20250601_news.json /news/input/20250602_news.json /news/output/wordcount_20250601 /news/output/wordcount_20250602

7.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 答辩演示顺序建议

建议演示时按照以下顺序展示,逻辑更顺:

  1. 主页展示,说明新闻聚合平台的整体效果。
  2. 后台管理,展示新闻数据的增删改查。
  3. 爬虫采集,现场运行一条爬虫或展示已有采集日志。
  4. Hadoop 分析,展示 HDFS 文件和 MapReduce 统计结果。
  5. 接口调用,使用浏览器或 Postman 访问 JSON 接口。

11.4 爬虫合规注意事项

再次强调:

  • 采集目标选择公开、允许访问的新闻站点。
  • 在文档报告中明确写明“本项目仅用于学习研究,不做商业化使用”。
  • 不采集非公开接口、登录后内容、个人隐私数据。
  • 控制爬取频率,不造成对方服务器压力。
  • 展示采集结果时注明来源。

11.5 文档报告写作建议

毕设文档报告比起代码,可能更影响最终评分。建议至少包含:

  • 系统需求分析:用户需求、功能需求、非功能需求。
  • 系统设计:总体架构、模块设计、数据库 ER 图。
  • 详细设计:爬虫模块流程、Django 页面流程、Hadoop 数据处理流程。
  • 系统实现:核心代码片段和解释。
  • 系统测试:测试用例、测试结果、问题修复记录。
  • 总结与展望:项目难点、收获、后续改进方向。

12. 总结与下一步

这个项目最值得尝试的地方在于,它把 Python 爬虫、Django 后端开发和 Hadoop 大数据处理串在了一条完整的数据流上。你不需要把每个模块做得十分深入,只要保证链路通畅、功能可验证、文档完整,就能在答辩时讲清楚一个系统。

拿到项目源码后,建议第一个先做的事情是跑通 Django 启动和后台登录,确认基础环境没问题。然后再运行爬虫,看数据能不能正常入库。最后再启动 Hadoop,把数据导入 HDFS 并跑一次简单的分析任务。按这个顺序走,每一步的成功标准都很明确,出现问题也容易定位。

最容易踩的坑有三个:第一个是 Python 依赖和 Django 版本不匹配,启动时报模块错误;第二个是 Hadoop 环境配置问题,经常因为 SSH 免密或环境变量导致进程启动不全;第三个是爬虫目标网站页面结构变动,解析不到数据。这三个问题都需要通过看日志和打印响应内容来排查。

后续可以扩展的方向也不少:比如给爬虫模块加上分布式的爬取能力;在 Hadoop 分析层用 Spark 替代 MapReduce;在 Django 前端引入更多可视化图表,把新闻来源分布、关键词趋势用图表展示出来;或者在平台里增加用户收藏、评论功能,让系统更像一个完整的新闻产品。

总结起来,这个项目是典型的“全链路毕设题”,难度适中、可扩展性强、答辩材料好写。建议收藏备用,平时多跑几遍流程,把所有问题提前暴露,后面答辩演示就不会手忙脚乱。

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

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

立即咨询