☰
爬虫+SpringBoot+Vue高考志愿推荐系统:本地部署与版本避坑教程
2026/10/18 10:40:59 网站建设 项目流程

简介:这套《基于爬虫的高考志愿智能推荐系统》是完整的Java毕设项目资源包,适合正在准备毕业设计的计算机相关专业学生,以及希望学习SpringBoot前后端分离开发、Vue前端、爬虫与知识图谱应用的开发者。系统包含考生端与后台管理端,实现登录注册、专业/院校/历年录取数据查询、MBTI职业性格测试、模拟志愿填报、志愿管理、后台数据维护等功能,并通过爬虫获取高校录取数据,结合知识图谱与智能匹配算法为考生提供个性化推荐。

资源包共671个文件,压缩后约34.56MB,核心内容为Java后端源码与Vue前端源码,另含MySQL数据库脚本、python爬虫脚本、配置文件、说明文档、项目PPT以及大量界面静态资源,目录结构清晰,便于按模块阅读和二次开发。附带说明文档与答辩PPT,能够帮助使用者快速理清项目架构和业务逻辑。目前已有87人学习,适合需要一套可运行、可讲解的完整毕设项目作为参照的开发者使用。

1. 开装之前:这套“爬虫+高考志愿推荐”项目,坑全在环境版本上

很多毕设项目解压就能跑,但「基于爬虫的高考志愿智能推荐系统」不是。它一条链上挂着 Scrapy 爬虫、SpringBoot 后端、Vue 前端和 MySQL5.7 四样东西,任何一个版本不对,表现都不是“报错”,而是“看起来装了、就是跑不起来”。

我第一次装的时候用了 JDK17 和 MySQL8,后端启动直接崩,爬虫跑完数据库一张表没写。后来把环境切回 JDK1.8、Maven3.6、MySQL5.7,这套 Java + Vue 前后端分离的项目才正常走通。这篇文章就按我实际的操作顺序写:先选版、再装后端、再跑爬虫、最后联调验证。适合正在用 Java SpringBoot 做毕设的同学,也适合想快速在本地把“数据采集 + 推荐系统”这个组合跑起来的开发者。

2. 环境准备:JDK1.8、Maven3.6.3、MySQL5.7、Node14 的选型和安装

装这套系统的第一道坎不是编码,是版本。项目环境说明里写得很清楚:开发语言 Java、框架 SpringBoot、JDK1.8、服务器 tomcat7、数据库 MySQL5.7、前端 Vue。这些版本看着老,实际上是这个项目的“安全区”。你先别想着升到 JDK17 或者 MySQL8,先把这组版本落到本机。

2.1 版本清单:为什么不能随手拿新版

下面这张表是我在多次安装后固定下来的推荐版本,并列了翻车点。

组件推荐版本备注
JDK1.8(8u202 及以上)SpringBoot 2.x 老项目在 JDK11/17 下偶发反射和字节码兼容问题
Maven3.6.33.8+ 对中央仓库校验更严格,个别旧依赖会下载失败
MySQL5.7项目 SQL 和 JDBC 驱动按 5.7 写,MySQL8 密码插件和时区都变
Node.js14.17.x前端依赖 node-sass,Node16/18 在编译阶段基本必炸
Python3.8 / 3.9Scrapy 在 Python3.10+ 上偶尔装不上 Twisted 的预编译轮子
Tomcat不需要单独装环境说明里的 tomcat7 对应 SpringBoot 内嵌容器,外部装反而抢 8080 端口

注意,SpringBoot 2.x 本身是内嵌 Tomcat 的,所以“服务器 tomcat7”这一项在实际运行中由 jar 包自己托管。你不需要再装一个外部 Tomcat7,装了反而会和后端端口冲突。Maven 和 Node 版本没有在项目说明里锁死,但我一般建议按表里走,能少踩一半坑。

2.2 配置 JAVA_HOME 和 MAVEN_HOME:三个最容易踩的路径坑

先确认 JDK 和 Maven 已经解压到本地目录。我的习惯是统一放在D:\dev下,路径里不要有中文和空格,不然 Maven 和 npm 都可能闹脾气。

命令行里先做临时验证,打开 CMD,执行:

set JAVA_HOME=C:\Program Files\Java\jdk1.8.0_202 set MAVEN_HOME=D:\dev\apache-maven-3.6.3 set PATH=%JAVA_HOME%\bin;%MAVEN_HOME%\bin;%PATH%

这段的作用是把 JDK 和 Maven 的 bin 目录临时加入当前窗口的 PATH。注意JAVA_HOME指向的是 JDK 安装根目录,而不是bin目录,也不要自己拼上jre。很多同学就是在这里多写了一层路径,导致mvn -v能出来但java -version报找不到。

验证完当前窗口后,再考虑永久生效。我不推荐直接用setx PATH ...去覆盖,因为setx会把当前%PATH%展开后写入,超过 1024 字符的部分会被截断,等于把系统 PATH 弄丢一半。我一般直接右键“此电脑 → 属性 → 高级系统设置 → 环境变量”,在系统变量里新建:

  • 变量名:JAVA_HOME,变量值:C:\Program Files\Java\jdk1.8.0_202
  • 变量名:MAVEN_HOME,变量值:D:\dev\apache-maven-3.6.3
  • 编辑Path,新建两条%JAVA_HOME%\bin和%MAVEN_HOME%\bin

这个做法的好处是每个变量单独维护,不会因为覆盖 PATH 把其他工具搞挂。保存后一定要重新开一个 CMD,再执行:

java -version mvn -v

看到Java(TM) SE Runtime Environment和Apache Maven 3.6.3就说明 JDK 和 Maven 已经进入系统。如果mvn -v里显示的 Java Version 不是 1.8,多半是 PATH 里还有更高位的 JDK 在前面,把 JAVA_HOME 的优先级提前即可。

2.3 初始化 MySQL5.7 数据库:先建库再导入 .sql

数据库这块我建议用 MySQL5.7,如果本机已经有 8.0,先考虑卸载或者用端口区分。项目里自带的 SQL 文件是按 5.7 的语法和字符集导出的,直接吃 MySQL8 也不是不行,但后续驱动、密码验证、时区问题会一起冒出来。

登录 MySQL:

mysql -uroot -p

进入命令行后建库:

CREATE DATABASE IF NOT EXISTS gaokao DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

这里的utf8mb4比utf8多覆盖了一部分生僻字和表情符号。简历里有考生姓名、院校全称,用utf8mb4更稳。COLLATE utf8mb4_general_ci是 MySQL5.7 里常见的排序规则,如果你导入时发现 SQL 文件里已经写了表级字符集,以原文件为准。

建完库后,用 Navicat 双击打开gaokao数据库,右键 → 运行 SQL 文件,选中项目里sql目录下的 SQL 文件。导入之前先看一遍文件开头,确认里面有没有CREATE DATABASE或USE gaokao这样的语句。

如果 SQL 文件本身就是从某个库里导出的,头部通常带着库名,那你直接导入即可,不需要手动建库。反之,如果文件上来就是CREATE TABLE,那就必须先建库再导入,否则会报 1046 错误。导入完成后,刷新左侧栏,你至少能看到用户、院校、专业、位次、咨询、MBTI 等相关的数据表。

2.4 Maven 依赖下载太慢:先确认 settings.xml 是可用的

后端是 Maven 工程,第一次打包要拉大量依赖。如果你所在网络访问中央仓库很慢,mvn clean package会卡在下载阶段。我的做法是检查 Mavenconf\settings.xml里的本地仓库路径和镜像配置。

<localRepository>D:/dev/maven_repo</localRepository> <mirrors> <mirror> <id>central</id> <url>https://repo.maven.apache.org/maven2</url> <mirrorOf>central</mirrorOf> </mirror> </mirrors>

localRepository决定依赖缓存到哪,不要放在 C 盘系统盘,项目拉完 SpringBoot 全家桶后可能接近 1GB。mirror的mirrorOf写成central表示只对中央仓库生效。如果你有内网或学校提供的镜像,把url换成你的镜像地址即可。没有镜像资源时,保持中央仓库也能跑,只是第一次会等很久,耐心点别中断。

3. SpringBoot 后端装起来:三分钟理解目录结构和 Maven 打包

环境准备好后,开始处理后端。这一步的目标是把 SpringBoot 后端跑在 8080 端口,同时确认资源目录下两个前端工程能被识别。

3.1 项目结构梳理:springboot2a1qfv22 里到底有什么

解压项目压缩包后,主体目录大概是这样的:

基于爬虫高考志愿智能推荐系统/ ├─ spider/ # Scrapy 爬虫模块 │ ├─ scrapy.cfg │ ├─ 安装.bat │ └─ 运行.bat └─ springboot2a1qfv22/ # SpringBoot 后端主工程 └─ src/main/resources/ ├─ admin/admin/ # 后台管理员前端(Vue) └─ front/front/ # 考生端前台(Vue)

springboot2a1qfv22是后端工程根目录,里面的src/main/resources下同时放着两个 Vue 前端子工程。这个结构在毕设项目里非常常见:后端把前端代码塞进 resources 里,开发时前后端分离跑,部署时前端 build 产物再合回 SpringBoot 的静态目录。

admin/admin是后台管理员界面,对应专业管理、院校管理、高考咨询管理、招生计划管理、位次管理、用户管理、MBTI 职业性格测试管理这些页面。front/front是考生端,对应登录注册、专业查询、院校查询、位次查询、MBTI 测试、模拟志愿填报、志愿管理、个人中心。

3.2 改数据库连接:application.yml 的四个参数

进入后端工程,找到src/main/resources/application.yml,也可能是application.properties,取决于项目生成时的配置。这个文件是后端连数据库、绑定端口的关键。

示例配置:

server: port: 8080 spring: datasource: url: jdbc:mysql://127.0.0.1:3306/gaokao?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai username: root password: root driver-class-name: com.mysql.jdbc.Driver

这里url里的127.0.0.1:3306/gaokao必须和 2.3 里建的库名一致。useSSL=false是为了避免旧驱动和新 MySQL 之间做 SSL 握手报警告。serverTimezone=Asia/Shanghai在 MySQL8 下是必填,5.7 下加上也不会错。username和password改成你本机 MySQL 的实际账号,如果 MySQL 的 root 密码不是 root,这里不改,后端启动会直接报登录失败。

改完配置后可以先启动一次看能不能连库,不用等到最后。在项目根目录执行:

mvn spring-boot:run

第一次启动会很慢,Maven 会下载大量依赖。如果你不想等,可以用 IDEA 打开后端工程,等依赖索引完毕后直接运行主类。看到 Spring Boot 的启动日志并且没有Failed to configure a DataSource字样,说明数据库连接已经通了。

3.3 Maven 打包:跳过测试,生成可直接发布的 jar

开发阶段跑mvn spring-boot:run没问题,但部署阶段还是打成 jar 更干净。打包命令:

mvn clean package -DskipTests

clean会清掉之前编译出来的旧 class,避免增量编译产生脏数据。-DskipTests是跳过测试编译和测试执行,毕设项目里的单元测试往往依赖数据库环境,本地跑测试很容易因为环境不完整而失败,所以打包时直接跳过。

打包完成后,target目录下会出现一个springboot2a1qfv22.jar之类的文件。启动它:

java -jar target/springboot2a1qfv22.jar

启动成功后,浏览器访问http://localhost:8080。如果你没提前跑前端,这时看到的应该是后端默认主页或者 404,这是正常的,因为前端资源还没 build 进来。后端接口层面,可以通过http://localhost:8080/xxx试探常见路径,也可以直接用 IDE 右下角的 Swagger 接口列表入口确认。

3.4 resources/admin/admin 里的 .bat 脚本:1-install、2-run、3-build 的顺序

在admin/admin和front/front目录下,项目自带了一组 .bat 脚本,顺序编号很清晰:1-install.bat、2-run.bat、3-build.bat。这是给不熟悉命令行的人准备的,本质上就是把 npm 命令包装起来。

# 1-install.bat 里的内容一般是 npm install # 2-run.bat 里的内容一般是 npm run serve # 3-build.bat 里的内容一般是 npm run build

我第一次跑后端时,只启动了 Java 后端,忘了先 build 前端,结果管理后台打开全是空白。后面形成习惯:前端一定先npm install,开发阶段用npm run serve起 dev server,联调完成后再npm run build把产物输出到后端 resources 的 static 目录,让 SpringBoot 托管前端页面。

顺序上我建议是:

  1. 后端先起来,保证 8080 通。
  2. 前端1-install安装依赖。
  3. 前端2-run跑开发模式,浏览器访问 dev server 端口。
  4. 联调接口没问题后,执行3-build打包,把产物放回后端,重新打 jar。

这套顺序能避免“前端 404 但接口正常”这种两边对不上的情况。注意,如果npm install报 node-sass 找不到,请先回头看 2.1 的 Node 版本。

4. 爬虫模块装起来:Scrapy 安装、spider 配置和落库验证

很多同学装完前后端就算完事了,但这套系统的核心卖点是爬虫。爬虫不跑,数据库里只有初始示例数据,推荐效果根本体现不出来。所以我把爬虫单独拿一章写,只要按步骤来,最多半小时能跑通。

4.1 认识 spider 目录:scrapy.cfg 是工程入口

项目根目录下的spider文件夹是一个标准的 Scrapy 工程。这个结论可以从scrapy.cfg文件判断出来。scrapy.cfg是 Scrapy 项目的主配置文件,内容作用等同于告诉 Scrapy:settings 模块在哪、spiders 目录在哪。

标准配置一般是:

[settings] default = spider.settings [deploy] project = spider

[settings]一行指定了默认配置模块,我这里的写法是spider.settings,实际以项目文件里的模块名为准。[deploy]用于远程部署,本地跑爬虫时作用不大。只要scrapy.cfg和spiders目录在同一个上级目录下,scrapy crawl命令就能正确识别整个工程。

搞不清目录结构时,可以先在spider目录下执行:

scrapy list

如果能列出爬虫名字,比如gaokao,说明工程没问题。如果提示No module named spider.settings,多半是当前目录没切到scrapy.cfg所在的位置,或者 Python 环境没激活。

4.2 安装 Python 依赖:scrapy、pymysql、lxml 缺一不可

爬虫部分依赖 Python 环境。我这里用的是 Python3.8,安装命令:

pip install scrapy pymysql lxml

scrapy是爬虫框架,pymysql是爬虫管道里写 MySQL 用的,lxml是 HTML 解析加速组件。如果安装过程中 Twisted 编译报错,先升级 pip 再装一次:

python -m pip install --upgrade pip wheel pip install scrapy pymysql lxml

wheel包能让很多 Python 第三方库以预编译形式安装,不用从源码编译,Scrapy 依赖栈里正好需要这个。安装完成后验证:

scrapy version

能输出版本号就是装好了。如果你用的是 conda 或虚拟环境,记得先激活环境再执行scrapy命令,不然很可能调到一个 Python 目录下没装 Scrapy 的旧环境。

4.3 settings.py 配置数据库和管道:爬出来的数据往哪写

Scrapy 工程里真正要动手改的是spider/settings.py。这个文件控制并发数、下载延迟、是否启用管道、 MySQL 连接信息。以下是我常用的配置片段:

BOT_NAME = 'spider' SPIDER_MODULES = ['spider.spiders'] NEWSPIDER_MODULE = 'spider.spiders' DOWNLOAD_DELAY = 1.5 ROBOTSTXT_OBEY = True MYSQL_HOST = '127.0.0.1' MYSQL_PORT = 3306 MYSQL_DB = 'gaokao' MYSQL_USER = 'root' MYSQL_PASSWORD = 'root' ITEM_PIPELINES = { 'spider.pipelines.MysqlPipeline': 300, }

DOWNLOAD_DELAY = 1.5表示每个请求之间至少等 1.5 秒,这个值不只是礼貌,更是为了降低被目标站点封 IP 的概率。截图识别、院校详情这类数据抓得太快,很容易触发反爬。ROBOTSTXT_OBEY = True是遵守目标站点 robots 协议,毕设爬虫尽量开着。

数据库参数要和 2.3 一致,MYSQL_DB是库名,MYSQL_USER和MYSQL_PASSWORD是你本机 MySQL 的账密。重点说一下ITEM_PIPELINES:如果你注释掉它,scrapy 跑得再欢,数据也不会写库。这个字典里spider.pipelines.MysqlPipeline是管道类路径,后面的300是执行优先级,数字越小越靠前。如果项目里管道类名字不叫 MysqlPipeline,对应改成实际的类名。

4.4 运行爬虫:安装.bat 和运行.bat 到底做了什么

项目自带的spider/安装.bat和spider/运行.bat,无非就是把上面的 pip install 和 scrapy crawl 包了一层。我不太信任 .bat 里的相对路径,所以习惯直接在命令行手动跑。

先看爬虫名:

scrapy list

再运行:

scrapy crawl gaokao

如果你不想看日志,只想要结果,可以加--nolog:

scrapy crawl gaokao --nolog

运行结束后,如果末尾没有KeyError和MysqlPipeline报错,去数据库验证一下。登录 MySQL:

mysql -uroot -p

查询爬虫对应的表,比如院校表是school:

SELECT COUNT(*) FROM school;

爬虫跑完后这个表的行数相比初始数据应该有明显增加。如果 count 没变化,先别怀疑爬虫被封锁,优先检查 4.3 里的ITEM_PIPELINES有没有生效,以及管道类里的 insert SQL 字段名和表字段是否完全一致。字段名大小写不一致,MySQL 在 Linux 环境下会直接报错,Windows 下反而可能静默写入空值,这也是我见过最多的“没报错但没数据”的原因。

5. 常见问题与排查:这套系统最容易翻车的五个场景

从后端启动到爬虫入库,我积累了一批高频问题。每个都是“现象 → 原因 → 解决”结构,你照着对号入座就行。

5.1 后端启动后立刻退出,报 DataSource 初始化失败

现象:执行java -jar或mvn spring-boot:run后,控制台几秒内就结束,日志里有Failed to configure a DataSource: 'url' attribute is not specified。

原因:SpringBoot 没有读到数据库连接配置。最常见的是application.yml不在resources根目录,或者文件名写成了application.properties但是项目里同时存在两个同名配置,导致优先加载了空文件。

解决:检查src/main/resources下有没有application.yml,和application.properties二选一,别两个都留着。确认spring.datasource.url字段拼写完整,url别写成jdbc。改完重新mvn clean package -DskipTests再启动,因为有时没有重新编译导致旧配置被打进 jar。

5.2 MySQL 密码正确却连不上:Access denied 和 Public Key Retrieval

现象:Navicat 能连上 MySQL,后端或爬虫却报Access denied for user 'root'@'localhost',或者在日志里出现Public Key Retrieval is not allowed。

原因:这是 MySQL8 密码认证插件caching_sha2_password和旧 JDBC 驱动不兼容导致的。项目的 SQL 环境和驱动是按 5.7 准备的,你本机如果装了 MySQL8 就会出现这种“所以对不上”的怪问题。

解决:最干净的做法是换回 MySQL5.7。如果你坚持用 MySQL8,至少要在 JDBC URL 后面加两个参数:

jdbc:mysql://127.0.0.1:3306/gaokao?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai

也可以把 root 的密码插件改成老式的:

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '你的密码';

注意这个操作只对 MySQL8 有效,请确认你的版本再执行。我的建议还是少折腾,直接切到 5.7 最省心。

5.3 前端 npm install 在 node-sass 上反复失败

现象:执行1-install.bat或npm install时,进度条停在node-sass、node-gyp rebuild,最后报gyp ERR! stack Error: ENOENT。

原因:node-sass 是编译型包,它需要下载对应 Node 版本的二进制文件。Node16、Node18 出来后,老版本 node-sass 没有预编译二进制,于是走源码编译,进而需要 Visual Studio 的 C++ 构建工具,越装越离谱。

解决:先卸载你的新版 Node,装 Node 14.17.x。然后删除前端目录下的node_modules和package-lock.json,重新跑:

npm install

如果网络质量一般,可以给 npm 配镜像源,但记得换回官方源或私有源。装完看npm ls node-sass,只要显示node-sass@x.x.x没有红色报错,就可以继续npm run serve。从那以后我再不碰新版 Node 装 node-sass 项目,这是纯属给自己找活。

5.4 管理端登录后数据空白,但后端接口能通

现象:后台登录页能打开,账号密码也对,登录成功后列表页表格是空的。按 F12 看网络请求,接口要么 404,要么提示跨域。

原因:前端 dev server 和后端 SpringBoot 之间代理没对齐。Vue 项目里通常用vue.config.js的devServer.proxy把/api转发到http://localhost:8080,如果后端接口没有/api前缀,而前端在代理配置里统一加了/api,就会造成路径错位。

解决:打开前端工程的vue.config.js,看 proxy 配置里的 target 是不是http://localhost:8080,看接口前缀和后端 controller 的 RequestMapping 是否能对上。

devServer: { proxy: { '/api': { target: 'http://localhost:8080', changeOrigin: true } } }

如果后端工程的 context-path 是空的,接口路径没有/api,那我建议把前端 proxy 的前缀去掉,或者后端在application.yml里统一加server.servlet.context-path: /api。两边必须一致,改完重启前后端再试。

5.5 爬虫跑完没有数据入库,日志也没报错

现象:scrapy crawl gaokao正常结束,控制台没有红色异常,但 MySQL 里表 count 没变。这个问题比报错恶心,因为系统看起来“跑完了”,实际什么都没写。

原因:一是ITEM_PIPELINES没启用或注释掉了,items 被爬下来但没人处理;二是管道里的 insert SQL 字段名和数据库表字段名不一致,MySQL 的严格模式报错被吞掉;三是爬虫根本没匹配到目标站点结构,比如网页改版后 xpath 提取不到任何内容,items 是空的。

解决:先用 JSON 输出确认爬虫有没有产出 item:

scrapy crawl gaokao -o test.json

打开test.json,如果为空,说明是爬虫解析问题,去spiders里检查 xpath/css 选择器。如果 JSON 有数据,说明问题在管道,检查settings.py的ITEM_PIPELINES有没有注释,检查pipelines.py里的MYSQL_HOST等变量名有没有引用到 settings。最后,手动在 MySQL 里跑一条插入语句,确认当前用户对目标表有 insert 权限。

6. 最后验证:从管理后台到爬虫入库的全链路巡检

环境装完、服务跑起来之后,真正容易漏掉的是“整条数据链”。我自己的巡检习惯是遵循一条固定路径:后端进程 → 前端页面 → 爬虫数据 → 推荐结果。

先拿端口说话。后端 8080 要处于监听状态,前端 dev server 或 build 产物要能被浏览器访问。在命令行执行:

netstat -ano | findstr 8080

看到 TCP 监听状态后,浏览器分别打开两个前端入口:考生端先走登录注册,管理后台用项目说明文档里的管理员账号登录。登录不进去就回到 3.2 查数据库;登录后点几个关键页面:专业查询、院校查询、位次查询、招生计划、MBTI 职业性格测试、模拟志愿填报。这几个页面能列表展示数据,接口链路基本就没问题。

爬虫环节我习惯做一次三查:

检查项命令/方法预期结果
爬虫命令是否可用scrapy list输出爬虫名,不报错
爬虫数据是否落库SELECT COUNT(*) FROM school;行数大于初始值
脱敏数据是否参与推荐前端院校推荐页是否有爬取到的非示例院校页面出现真实抓取数据

最后再从数据库反查一条记录:挑一个刚爬取的院校名称,去前端搜索框里搜一下,如果搜索结果能搜到且点击进详情页,说明爬虫、后端、前端这条链路完全闭合。这里同样提醒别用生产环境真实数据,本地导入的只是演示数据,够用就行。

我早先给某模拟项目X做环境验收时,前后端都起来了,管理后台也进得去,我以为这事算完。结果第二天用户反馈推荐页没数据,查了一下午才发现爬虫的数据管道根本没开。从那以后我每次拿到这种带爬虫的毕设项目,都强制自己把“爬虫入库 → 数据库查数 → 前端搜得到”这一圈走完才敢说跑通了。这套检查流程看起来很笨,但能挡住一大半玄学问答,希望帮到你。

本文还有配套的精品资源,点击获取

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

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

立即咨询