ARTICLE DETAIL

资讯详情

深耕商务建站与企业官网运营的一线实战洞察。

爬虫+SpringBoot+Vue高考志愿推荐系统:本地部署与版本避坑教程

爬虫+SpringBoot+Vue高考志愿推荐系统:本地部署与版本避坑教程 简介这套《基于爬虫的高考志愿智能推荐系统》是完整的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.88u202 及以上SpringBoot 2.x 老项目在 JDK11/17 下偶发反射和字节码兼容问题Maven3.6.33.8 对中央仓库校验更严格个别旧依赖会下载失败MySQL5.7项目 SQL 和 JDBC 驱动按 5.7 写MySQL8 密码插件和时区都变Node.js14.17.x前端依赖 node-sassNode16/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_HOMEC:\Program Files\Java\jdk1.8.0_202 set MAVEN_HOMED:\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 也不是不行但后续驱动、密码验证、时区问题会一起冒出来。登录 MySQLmysql -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里的本地仓库路径和镜像配置。localRepositoryD:/dev/maven_repo/localRepository mirrors mirror idcentral/id urlhttps://repo.maven.apache.org/maven2/url mirrorOfcentral/mirrorOf /mirror /mirrorslocalRepository决定依赖缓存到哪不要放在 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/ # 考生端前台Vuespringboot2a1qfv22是后端工程根目录里面的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?useUnicodetruecharacterEncodingutf8useSSLfalseserverTimezoneAsia/Shanghai username: root password: root driver-class-name: com.mysql.jdbc.Driver这里url里的127.0.0.1:3306/gaokao必须和 2.3 里建的库名一致。useSSLfalse是为了避免旧驱动和新 MySQL 之间做 SSL 握手报警告。serverTimezoneAsia/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 -DskipTestsclean会清掉之前编译出来的旧 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 托管前端页面。顺序上我建议是后端先起来保证 8080 通。前端1-install安装依赖。前端2-run跑开发模式浏览器访问 dev server 端口。联调接口没问题后执行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 项目的主配置文件内容作用等同于告诉 Scrapysettings 模块在哪、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 lxmlscrapy是爬虫框架pymysql是爬虫管道里写 MySQL 用的lxml是 HTML 解析加速组件。如果安装过程中 Twisted 编译报错先升级 pip 再装一次python -m pip install --upgrade pip wheel pip install scrapy pymysql lxmlwheel包能让很多 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如果你不想看日志只想要结果可以加--nologscrapy crawl gaokao --nolog运行结束后如果末尾没有KeyError和MysqlPipeline报错去数据库验证一下。登录 MySQLmysql -uroot -p查询爬虫对应的表比如院校表是schoolSELECT 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 rootlocalhost或者在日志里出现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?useSSLfalseallowPublicKeyRetrievaltrueserverTimezoneAsia/Shanghai也可以把 root 的密码插件改成老式的ALTER USER rootlocalhost 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-sassx.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 输出确认爬虫有没有产出 itemscrapy 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做环境验收时前后端都起来了管理后台也进得去我以为这事算完。结果第二天用户反馈推荐页没数据查了一下午才发现爬虫的数据管道根本没开。从那以后我每次拿到这种带爬虫的毕设项目都强制自己把“爬虫入库 → 数据库查数 → 前端搜得到”这一圈走完才敢说跑通了。这套检查流程看起来很笨但能挡住一大半玄学问答希望帮到你。本文还有配套的精品资源点击获取
返回列表
PREV
查看更多资讯
NEXT
返回资讯列表