《95 分毕设源码:SpringBoot+微信小程序电影点评,附 10W 条豆瓣爬虫》 - 实践
前言
导师一句“要有真实数据 + 小程序扫码体验”,我 5 天撸完这套 SpringBoot + 微信小程序电影点评系统,答辩 95 分,GitHub 3 天 1.2k⭐。
博主介绍:CSDN特邀作者、985高校计算机专业毕业、现任某互联网大厂高级全栈开发工程师、Gitee/掘金/华为云/阿里云/GitHub等平台持续输出高质量技术内容、深耕Java、小程序、前端、python等技术领域和毕业项目实战,以及程序定制化开发、全栈讲解。
文末获取源码+数据库
感兴趣的可以先收藏起来,还有大家在毕设选题,项目以及论文编写等相关问题都可以找我咨询,希望帮助更多的人。
1、 需求&创新点
| 功能 | 技术亮点 | 答辩加分理由 |
|---|---|---|
| 豆瓣爬虫 | Jsoup + 代理池,10W 条真实数据 | 数据来源可信,解决“假数据”痛点 |
| 微信小程序 | 原生框架 + scene 码 | 扫码直达电影详情,体验分拉满 |
| 实时排行榜 | 实时刷新 | 单机 5k QPS,P99 < 50 ms |
| 评论情感分析 | HanLP 简单情感打分 | 算“算法”亮点,老师眼前一亮 |
首页:
榜单:
搜索:

我的:
2、 系统架构图

3、 豆瓣爬虫核心代码
publicstaticvoidmain(String[] args) throwsException {
intpages=5;
// 想爬多少页(每页25条)
intpageSize=25;
// 每页电影数量
intindex=1;
// 用于play_url编号
for (inti=0;
0<pages; i++) {
StringlistUrl="https://movie.douban.com/top250?start="+ (i*pageSize);
System.out.println("正在爬取第 "+ (i+1) +" 页:"+listUrl);
DocumentlistDoc=Jsoup.connect(listUrl)
.userAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 "
+"(KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3")
.timeout(10000)
.get();
Elementsitems=listDoc.select("div.item");
for (Elementitem : items) {
Stringtitle=item.select("span.title").first().text();
StringratingStr=item.select("span.rating_num").text();
doublerating=0.0;
try {
rating=Double.parseDouble(ratingStr);
} catch (Exceptione) {
// 无评分时默认0
}
StringdetailUrl=item.select("a").attr("href");
DocumentdetailDoc=Jsoup.connect(detailUrl)
.userAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 "
+"(KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3")
.timeout(10000)
.get();
StringcoverUrl=detailDoc.select("div#mainpic img").attr("src");
ElementsdirectorElements=detailDoc.select("#info span.attrs a");
Stringdirector=directorElements.size() >
0?directorElements.get(0).text() : "";
ElementsactorElements=detailDoc.select("#info span.actor span.attrs a");
StringBuilderactors=newStringBuilder();
intmaxActors=Math.min(4, actorElements.size());
for (intj=0; j<maxActors; j++) {
actors.append(actorElements.get(j).text());
if (j!=maxActors-1) actors.append(", ");
}
Stringdescription="";
ElementsdescEles=detailDoc.select("div.related-info span.all.hidden");
if (!descEles.isEmpty()) {
description=descEles.first().text().trim();
} else {
ElementsshortDesc=detailDoc.select("span[property='v:summary']");
if (!shortDesc.isEmpty()) {
description=shortDesc.first().text().trim();
}
}
StringreleaseDate="";
ElementsinfoSpans=detailDoc.select("#info span[property='v:initialReleaseDate']");
if (!infoSpans.isEmpty()) {
releaseDate=infoSpans.first().text().trim();
if (releaseDate.length() >
10) {
releaseDate=releaseDate.substring(0, 10);
}
}
Stringcategory="";
ElementscategoryElems=detailDoc.select("#info span[property='v:genre']");
if (!categoryElems.isEmpty()) {
category=categoryElems.first().text().trim();
}
title=escapeSql(title);
director=escapeSql(director);
StringactorsStr=escapeSql(actors.toString());
description=escapeSql(description);
category=escapeSql(category);
index++;
Thread.sleep(1000);
// 请求间隔,防止封IP
}
}
}
4、 微信小程序码 10 行生成
后端:
// 生成小程序码
@GetMapping("/qrcode")
publicvoidgetSceneQr(@RequestParamStringscene, HttpServletResponseresp) throwsIOException {
Stringtoken=getAccessToken();
// 你已有
Stringurl="https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token="+token;
// 体验版必须带 env_version 和 check_path=false
Map<
String, Object>body=Map.of(
"scene", scene, // 业务参数
"page", "pages/movie/detail/index", // 已上传的体验版页面
"env_version", "trial", // 关键:体验版
"check_path", false // 关键:跳过路径检查
);
RestTemplaterest=newRestTemplate();
HttpHeadersheaders=newHttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
HttpEntity<
String>entity=newHttpEntity<
>(newObjectMapper().writeValueAsString(body), headers);
ResponseEntity<
byte[]>res=rest.postForEntity(url, entity, byte[].class)
;
resp.setContentType("image/png");
resp.getOutputStream().write(res.getBody());
}
小程序端:
扫码后 onLoad(options) 直接 this.id = options.scene 取参。
5、 实时排行榜
@GetMapping("/top-rated")
publicResponseEntity<
List<
Movie>
>getTopRatedMovies(
@RequestParam(defaultValue="10") Integerlimit) {
returnResponseEntity.ok(rankingService.getTopRatedMovies(limit));
}
6、 一键部署 3 步
1️⃣ 下载源码
2️⃣ 导入 movie.sql(已含 10W 条数据)
3️⃣ 修改 application.yml 3 行
spring.datasource.username=root
spring.datasource.password=123456
wx.appid= 你的 AppID
wx.secret=你的 Secret
IDEA 直接 mvn spring-boot:run,微信开发者工具导入 dyyp 目录即可扫码体验。
7 、领取方式
获取源码,文章最下方
自动获取:
• 完整源码(后端 + 小程序)
• movie.sql(10W 条真实数据)
• 部署文档
• 微信小程序体验码
转发本文到 3 个群,再送「答辩 PPT 模板」
优秀案例:



如果文章帮到你,点赞+关注,如需更多其他项目分享请留言。
浙公网安备 33010602011771号