+SpringBoot+Vue高考志愿推薦系統(tǒng):本地部署與版本避坑教程)
簡(jiǎn)介這套《基于爬蟲(chóng)的高考志愿智能推薦系統(tǒng)》是完整的Java畢設(shè)項(xiàng)目資源包適合正在準(zhǔn)備畢業(yè)設(shè)計(jì)的計(jì)算機(jī)相關(guān)專(zhuān)業(yè)學(xué)生以及希望學(xué)習(xí)SpringBoot前后端分離開(kāi)發(fā)、Vue前端、爬蟲(chóng)與知識(shí)圖譜應(yīng)用的開(kāi)發(fā)者。系統(tǒng)包含考生端與后臺(tái)管理端實(shí)現(xiàn)登錄注冊(cè)、專(zhuān)業(yè)/院校/歷年錄取數(shù)據(jù)查詢(xún)、MBTI職業(yè)性格測(cè)試、模擬志愿填報(bào)、志愿管理、后臺(tái)數(shù)據(jù)維護(hù)等功能并通過(guò)爬蟲(chóng)獲取高校錄取數(shù)據(jù)結(jié)合知識(shí)圖譜與智能匹配算法為考生提供個(gè)性化推薦。資源包共671個(gè)文件壓縮后約34.56MB核心內(nèi)容為Java后端源碼與Vue前端源碼另含MySQL數(shù)據(jù)庫(kù)腳本、python爬蟲(chóng)腳本、配置文件、說(shuō)明文檔、項(xiàng)目PPT以及大量界面靜態(tài)資源目錄結(jié)構(gòu)清晰便于按模塊閱讀和二次開(kāi)發(fā)。附帶說(shuō)明文檔與答辯PPT能夠幫助使用者快速理清項(xiàng)目架構(gòu)和業(yè)務(wù)邏輯。目前已有87人學(xué)習(xí)適合需要一套可運(yùn)行、可講解的完整畢設(shè)項(xiàng)目作為參照的開(kāi)發(fā)者使用。1. 開(kāi)裝之前這套“爬蟲(chóng)高考志愿推薦”項(xiàng)目坑全在環(huán)境版本上很多畢設(shè)項(xiàng)目解壓就能跑但「基于爬蟲(chóng)的高考志愿智能推薦系統(tǒng)」不是。它一條鏈上掛著 Scrapy 爬蟲(chóng)、SpringBoot 后端、Vue 前端和 MySQL5.7 四樣?xùn)|西任何一個(gè)版本不對(duì)表現(xiàn)都不是“報(bào)錯(cuò)”而是“看起來(lái)裝了、就是跑不起來(lái)”。我第一次裝的時(shí)候用了 JDK17 和 MySQL8后端啟動(dòng)直接崩爬蟲(chóng)跑完數(shù)據(jù)庫(kù)一張表沒(méi)寫(xiě)。后來(lái)把環(huán)境切回 JDK1.8、Maven3.6、MySQL5.7這套 Java Vue 前后端分離的項(xiàng)目才正常走通。這篇文章就按我實(shí)際的操作順序?qū)懴冗x版、再裝后端、再跑爬蟲(chóng)、最后聯(lián)調(diào)驗(yàn)證。適合正在用 Java SpringBoot 做畢設(shè)的同學(xué)也適合想快速在本地把“數(shù)據(jù)采集 推薦系統(tǒng)”這個(gè)組合跑起來(lái)的開(kāi)發(fā)者。2. 環(huán)境準(zhǔn)備JDK1.8、Maven3.6.3、MySQL5.7、Node14 的選型和安裝裝這套系統(tǒng)的第一道坎不是編碼是版本。項(xiàng)目環(huán)境說(shuō)明里寫(xiě)得很清楚開(kāi)發(fā)語(yǔ)言 Java、框架 SpringBoot、JDK1.8、服務(wù)器 tomcat7、數(shù)據(jù)庫(kù) MySQL5.7、前端 Vue。這些版本看著老實(shí)際上是這個(gè)項(xiàng)目的“安全區(qū)”。你先別想著升到 JDK17 或者 MySQL8先把這組版本落到本機(jī)。2.1 版本清單為什么不能隨手拿新版下面這張表是我在多次安裝后固定下來(lái)的推薦版本并列了翻車(chē)點(diǎn)。組件推薦版本備注JDK1.88u202 及以上SpringBoot 2.x 老項(xiàng)目在 JDK11/17 下偶發(fā)反射和字節(jié)碼兼容問(wèn)題Maven3.6.33.8 對(duì)中央倉(cāng)庫(kù)校驗(yàn)更嚴(yán)格個(gè)別舊依賴(lài)會(huì)下載失敗MySQL5.7項(xiàng)目 SQL 和 JDBC 驅(qū)動(dòng)按 5.7 寫(xiě)MySQL8 密碼插件和時(shí)區(qū)都變Node.js14.17.x前端依賴(lài) node-sassNode16/18 在編譯階段基本必炸Python3.8 / 3.9Scrapy 在 Python3.10 上偶爾裝不上 Twisted 的預(yù)編譯輪子Tomcat不需要單獨(dú)裝環(huán)境說(shuō)明里的 tomcat7 對(duì)應(yīng) SpringBoot 內(nèi)嵌容器外部裝反而搶 8080 端口注意SpringBoot 2.x 本身是內(nèi)嵌 Tomcat 的所以“服務(wù)器 tomcat7”這一項(xiàng)在實(shí)際運(yùn)行中由 jar 包自己托管。你不需要再裝一個(gè)外部 Tomcat7裝了反而會(huì)和后端端口沖突。Maven 和 Node 版本沒(méi)有在項(xiàng)目說(shuō)明里鎖死但我一般建議按表里走能少踩一半坑。2.2 配置 JAVA_HOME 和 MAVEN_HOME三個(gè)最容易踩的路徑坑先確認(rèn) JDK 和 Maven 已經(jīng)解壓到本地目錄。我的習(xí)慣是統(tǒng)一放在D:\dev下路徑里不要有中文和空格不然 Maven 和 npm 都可能鬧脾氣。命令行里先做臨時(shí)驗(yàn)證打開(kāi) CMD執(zhí)行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 目錄臨時(shí)加入當(dāng)前窗口的 PATH。注意JAVA_HOME指向的是 JDK 安裝根目錄而不是bin目錄也不要自己拼上jre。很多同學(xué)就是在這里多寫(xiě)了一層路徑導(dǎo)致mvn -v能出來(lái)但java -version報(bào)找不到。驗(yàn)證完當(dāng)前窗口后再考慮永久生效。我不推薦直接用setx PATH ...去覆蓋因?yàn)閟etx會(huì)把當(dāng)前%PATH%展開(kāi)后寫(xiě)入超過(guò) 1024 字符的部分會(huì)被截?cái)嗟扔诎严到y(tǒng) PATH 弄丟一半。我一般直接右鍵“此電腦 → 屬性 → 高級(jí)系統(tǒng)設(shè)置 → 環(huán)境變量”在系統(tǒng)變量里新建變量名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這個(gè)做法的好處是每個(gè)變量單獨(dú)維護(hù)不會(huì)因?yàn)楦采w PATH 把其他工具搞掛。保存后一定要重新開(kāi)一個(gè) CMD再執(zhí)行java -version mvn -v看到Java(TM) SE Runtime Environment和Apache Maven 3.6.3就說(shuō)明 JDK 和 Maven 已經(jīng)進(jìn)入系統(tǒng)。如果mvn -v里顯示的 Java Version 不是 1.8多半是 PATH 里還有更高位的 JDK 在前面把 JAVA_HOME 的優(yōu)先級(jí)提前即可。2.3 初始化 MySQL5.7 數(shù)據(jù)庫(kù)先建庫(kù)再導(dǎo)入 .sql數(shù)據(jù)庫(kù)這塊我建議用 MySQL5.7如果本機(jī)已經(jīng)有 8.0先考慮卸載或者用端口區(qū)分。項(xiàng)目里自帶的 SQL 文件是按 5.7 的語(yǔ)法和字符集導(dǎo)出的直接吃 MySQL8 也不是不行但后續(xù)驅(qū)動(dòng)、密碼驗(yàn)證、時(shí)區(qū)問(wèn)題會(huì)一起冒出來(lái)。登錄 MySQLmysql -uroot -p進(jìn)入命令行后建庫(kù)CREATE DATABASE IF NOT EXISTS gaokao DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;這里的utf8mb4比utf8多覆蓋了一部分生僻字和表情符號(hào)。簡(jiǎn)歷里有考生姓名、院校全稱(chēng)用utf8mb4更穩(wěn)。COLLATE utf8mb4_general_ci是 MySQL5.7 里常見(jiàn)的排序規(guī)則如果你導(dǎo)入時(shí)發(fā)現(xiàn) SQL 文件里已經(jīng)寫(xiě)了表級(jí)字符集以原文件為準(zhǔn)。建完庫(kù)后用 Navicat 雙擊打開(kāi)gaokao數(shù)據(jù)庫(kù)右鍵 → 運(yùn)行 SQL 文件選中項(xiàng)目里sql目錄下的 SQL 文件。導(dǎo)入之前先看一遍文件開(kāi)頭確認(rèn)里面有沒(méi)有CREATE DATABASE或USE gaokao這樣的語(yǔ)句。如果 SQL 文件本身就是從某個(gè)庫(kù)里導(dǎo)出的頭部通常帶著庫(kù)名那你直接導(dǎo)入即可不需要手動(dòng)建庫(kù)。反之如果文件上來(lái)就是CREATE TABLE那就必須先建庫(kù)再導(dǎo)入否則會(huì)報(bào) 1046 錯(cuò)誤。導(dǎo)入完成后刷新左側(cè)欄你至少能看到用戶(hù)、院校、專(zhuān)業(yè)、位次、咨詢(xún)、MBTI 等相關(guān)的數(shù)據(jù)表。2.4 Maven 依賴(lài)下載太慢先確認(rèn) settings.xml 是可用的后端是 Maven 工程第一次打包要拉大量依賴(lài)。如果你所在網(wǎng)絡(luò)訪問(wèn)中央倉(cāng)庫(kù)很慢mvn clean package會(huì)卡在下載階段。我的做法是檢查 Mavenconf\settings.xml里的本地倉(cāng)庫(kù)路徑和鏡像配置。localRepositoryD:/dev/maven_repo/localRepository mirrors mirror idcentral/id urlhttps://repo.maven.apache.org/maven2/url mirrorOfcentral/mirrorOf /mirror /mirrorslocalRepository決定依賴(lài)緩存到哪不要放在 C 盤(pán)系統(tǒng)盤(pán)項(xiàng)目拉完 SpringBoot 全家桶后可能接近 1GB。mirror的mirrorOf寫(xiě)成central表示只對(duì)中央倉(cāng)庫(kù)生效。如果你有內(nèi)網(wǎng)或?qū)W校提供的鏡像把url換成你的鏡像地址即可。沒(méi)有鏡像資源時(shí)保持中央倉(cāng)庫(kù)也能跑只是第一次會(huì)等很久耐心點(diǎn)別中斷。3. SpringBoot 后端裝起來(lái)三分鐘理解目錄結(jié)構(gòu)和 Maven 打包環(huán)境準(zhǔn)備好后開(kāi)始處理后端。這一步的目標(biāo)是把 SpringBoot 后端跑在 8080 端口同時(shí)確認(rèn)資源目錄下兩個(gè)前端工程能被識(shí)別。3.1 項(xiàng)目結(jié)構(gòu)梳理springboot2a1qfv22 里到底有什么解壓項(xiàng)目壓縮包后主體目錄大概是這樣的基于爬蟲(chóng)高考志愿智能推薦系統(tǒng)/ ├─ spider/ # Scrapy 爬蟲(chóng)模塊 │ ├─ scrapy.cfg │ ├─ 安裝.bat │ └─ 運(yùn)行.bat └─ springboot2a1qfv22/ # SpringBoot 后端主工程 └─ src/main/resources/ ├─ admin/admin/ # 后臺(tái)管理員前端Vue └─ front/front/ # 考生端前臺(tái)Vuespringboot2a1qfv22是后端工程根目錄里面的src/main/resources下同時(shí)放著兩個(gè) Vue 前端子工程。這個(gè)結(jié)構(gòu)在畢設(shè)項(xiàng)目里非常常見(jiàn)后端把前端代碼塞進(jìn) resources 里開(kāi)發(fā)時(shí)前后端分離跑部署時(shí)前端 build 產(chǎn)物再合回 SpringBoot 的靜態(tài)目錄。admin/admin是后臺(tái)管理員界面對(duì)應(yīng)專(zhuān)業(yè)管理、院校管理、高考咨詢(xún)管理、招生計(jì)劃管理、位次管理、用戶(hù)管理、MBTI 職業(yè)性格測(cè)試管理這些頁(yè)面。front/front是考生端對(duì)應(yīng)登錄注冊(cè)、專(zhuān)業(yè)查詢(xún)、院校查詢(xún)、位次查詢(xún)、MBTI 測(cè)試、模擬志愿填報(bào)、志愿管理、個(gè)人中心。3.2 改數(shù)據(jù)庫(kù)連接application.yml 的四個(gè)參數(shù)進(jìn)入后端工程找到src/main/resources/application.yml也可能是application.properties取決于項(xiàng)目生成時(shí)的配置。這個(gè)文件是后端連數(shù)據(jù)庫(kù)、綁定端口的關(guān)鍵。示例配置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 里建的庫(kù)名一致。useSSLfalse是為了避免舊驅(qū)動(dòng)和新 MySQL 之間做 SSL 握手報(bào)警告。serverTimezoneAsia/Shanghai在 MySQL8 下是必填5.7 下加上也不會(huì)錯(cuò)。username和password改成你本機(jī) MySQL 的實(shí)際賬號(hào)如果 MySQL 的 root 密碼不是 root這里不改后端啟動(dòng)會(huì)直接報(bào)登錄失敗。改完配置后可以先啟動(dòng)一次看能不能連庫(kù)不用等到最后。在項(xiàng)目根目錄執(zhí)行mvn spring-boot:run第一次啟動(dòng)會(huì)很慢Maven 會(huì)下載大量依賴(lài)。如果你不想等可以用 IDEA 打開(kāi)后端工程等依賴(lài)索引完畢后直接運(yùn)行主類(lèi)??吹?Spring Boot 的啟動(dòng)日志并且沒(méi)有Failed to configure a DataSource字樣說(shuō)明數(shù)據(jù)庫(kù)連接已經(jīng)通了。3.3 Maven 打包跳過(guò)測(cè)試生成可直接發(fā)布的 jar開(kāi)發(fā)階段跑mvn spring-boot:run沒(méi)問(wèn)題但部署階段還是打成 jar 更干凈。打包命令mvn clean package -DskipTestsclean會(huì)清掉之前編譯出來(lái)的舊 class避免增量編譯產(chǎn)生臟數(shù)據(jù)。-DskipTests是跳過(guò)測(cè)試編譯和測(cè)試執(zhí)行畢設(shè)項(xiàng)目里的單元測(cè)試往往依賴(lài)數(shù)據(jù)庫(kù)環(huán)境本地跑測(cè)試很容易因?yàn)榄h(huán)境不完整而失敗所以打包時(shí)直接跳過(guò)。打包完成后target目錄下會(huì)出現(xiàn)一個(gè)springboot2a1qfv22.jar之類(lèi)的文件。啟動(dòng)它java -jar target/springboot2a1qfv22.jar啟動(dòng)成功后瀏覽器訪問(wèn)http://localhost:8080。如果你沒(méi)提前跑前端這時(shí)看到的應(yīng)該是后端默認(rèn)主頁(yè)或者 404這是正常的因?yàn)榍岸速Y源還沒(méi) build 進(jìn)來(lái)。后端接口層面可以通過(guò)http://localhost:8080/xxx試探常見(jiàn)路徑也可以直接用 IDE 右下角的 Swagger 接口列表入口確認(rèn)。3.4 resources/admin/admin 里的 .bat 腳本1-install、2-run、3-build 的順序在admin/admin和front/front目錄下項(xiàng)目自帶了一組 .bat 腳本順序編號(hào)很清晰1-install.bat、2-run.bat、3-build.bat。這是給不熟悉命令行的人準(zhǔn)備的本質(zhì)上就是把 npm 命令包裝起來(lái)。# 1-install.bat 里的內(nèi)容一般是 npm install # 2-run.bat 里的內(nèi)容一般是 npm run serve # 3-build.bat 里的內(nèi)容一般是 npm run build我第一次跑后端時(shí)只啟動(dòng)了 Java 后端忘了先 build 前端結(jié)果管理后臺(tái)打開(kāi)全是空白。后面形成習(xí)慣前端一定先npm install開(kāi)發(fā)階段用npm run serve起 dev server聯(lián)調(diào)完成后再npm run build把產(chǎn)物輸出到后端 resources 的 static 目錄讓 SpringBoot 托管前端頁(yè)面。順序上我建議是后端先起來(lái)保證 8080 通。前端1-install安裝依賴(lài)。前端2-run跑開(kāi)發(fā)模式瀏覽器訪問(wèn) dev server 端口。聯(lián)調(diào)接口沒(méi)問(wèn)題后執(zhí)行3-build打包把產(chǎn)物放回后端重新打 jar。這套順序能避免“前端 404 但接口正?!边@種兩邊對(duì)不上的情況。注意如果npm install報(bào) node-sass 找不到請(qǐng)先回頭看 2.1 的 Node 版本。4. 爬蟲(chóng)模塊裝起來(lái)Scrapy 安裝、spider 配置和落庫(kù)驗(yàn)證很多同學(xué)裝完前后端就算完事了但這套系統(tǒng)的核心賣(mài)點(diǎn)是爬蟲(chóng)。爬蟲(chóng)不跑數(shù)據(jù)庫(kù)里只有初始示例數(shù)據(jù)推薦效果根本體現(xiàn)不出來(lái)。所以我把爬蟲(chóng)單獨(dú)拿一章寫(xiě)只要按步驟來(lái)最多半小時(shí)能跑通。4.1 認(rèn)識(shí) spider 目錄scrapy.cfg 是工程入口項(xiàng)目根目錄下的spider文件夾是一個(gè)標(biāo)準(zhǔn)的 Scrapy 工程。這個(gè)結(jié)論可以從scrapy.cfg文件判斷出來(lái)。scrapy.cfg是 Scrapy 項(xiàng)目的主配置文件內(nèi)容作用等同于告訴 Scrapysettings 模塊在哪、spiders 目錄在哪。標(biāo)準(zhǔn)配置一般是[settings] default spider.settings [deploy] project spider[settings]一行指定了默認(rèn)配置模塊我這里的寫(xiě)法是spider.settings實(shí)際以項(xiàng)目文件里的模塊名為準(zhǔn)。[deploy]用于遠(yuǎn)程部署本地跑爬蟲(chóng)時(shí)作用不大。只要scrapy.cfg和spiders目錄在同一個(gè)上級(jí)目錄下scrapy crawl命令就能正確識(shí)別整個(gè)工程。搞不清目錄結(jié)構(gòu)時(shí)可以先在spider目錄下執(zhí)行scrapy list如果能列出爬蟲(chóng)名字比如gaokao說(shuō)明工程沒(méi)問(wèn)題。如果提示No module named spider.settings多半是當(dāng)前目錄沒(méi)切到scrapy.cfg所在的位置或者 Python 環(huán)境沒(méi)激活。4.2 安裝 Python 依賴(lài)scrapy、pymysql、lxml 缺一不可爬蟲(chóng)部分依賴(lài) Python 環(huán)境。我這里用的是 Python3.8安裝命令pip install scrapy pymysql lxmlscrapy是爬蟲(chóng)框架pymysql是爬蟲(chóng)管道里寫(xiě) MySQL 用的lxml是 HTML 解析加速組件。如果安裝過(guò)程中 Twisted 編譯報(bào)錯(cuò)先升級(jí) pip 再裝一次python -m pip install --upgrade pip wheel pip install scrapy pymysql lxmlwheel包能讓很多 Python 第三方庫(kù)以預(yù)編譯形式安裝不用從源碼編譯Scrapy 依賴(lài)棧里正好需要這個(gè)。安裝完成后驗(yàn)證scrapy version能輸出版本號(hào)就是裝好了。如果你用的是 conda 或虛擬環(huán)境記得先激活環(huán)境再執(zhí)行scrapy命令不然很可能調(diào)到一個(gè) Python 目錄下沒(méi)裝 Scrapy 的舊環(huán)境。4.3 settings.py 配置數(shù)據(jù)庫(kù)和管道爬出來(lái)的數(shù)據(jù)往哪寫(xiě)Scrapy 工程里真正要?jiǎng)邮指牡氖莝pider/settings.py。這個(gè)文件控制并發(fā)數(shù)、下載延遲、是否啟用管道、 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表示每個(gè)請(qǐng)求之間至少等 1.5 秒這個(gè)值不只是禮貌更是為了降低被目標(biāo)站點(diǎn)封 IP 的概率。截圖識(shí)別、院校詳情這類(lèi)數(shù)據(jù)抓得太快很容易觸發(fā)反爬。ROBOTSTXT_OBEY True是遵守目標(biāo)站點(diǎn) robots 協(xié)議畢設(shè)爬蟲(chóng)盡量開(kāi)著。數(shù)據(jù)庫(kù)參數(shù)要和 2.3 一致MYSQL_DB是庫(kù)名MYSQL_USER和MYSQL_PASSWORD是你本機(jī) MySQL 的賬密。重點(diǎn)說(shuō)一下ITEM_PIPELINES如果你注釋掉它scrapy 跑得再歡數(shù)據(jù)也不會(huì)寫(xiě)庫(kù)。這個(gè)字典里spider.pipelines.MysqlPipeline是管道類(lèi)路徑后面的300是執(zhí)行優(yōu)先級(jí)數(shù)字越小越靠前。如果項(xiàng)目里管道類(lèi)名字不叫 MysqlPipeline對(duì)應(yīng)改成實(shí)際的類(lèi)名。4.4 運(yùn)行爬蟲(chóng)安裝.bat 和運(yùn)行.bat 到底做了什么項(xiàng)目自帶的spider/安裝.bat和spider/運(yùn)行.bat無(wú)非就是把上面的 pip install 和 scrapy crawl 包了一層。我不太信任 .bat 里的相對(duì)路徑所以習(xí)慣直接在命令行手動(dòng)跑。先看爬蟲(chóng)名scrapy list再運(yùn)行scrapy crawl gaokao如果你不想看日志只想要結(jié)果可以加--nologscrapy crawl gaokao --nolog運(yùn)行結(jié)束后如果末尾沒(méi)有KeyError和MysqlPipeline報(bào)錯(cuò)去數(shù)據(jù)庫(kù)驗(yàn)證一下。登錄 MySQLmysql -uroot -p查詢(xún)爬蟲(chóng)對(duì)應(yīng)的表比如院校表是schoolSELECT COUNT(*) FROM school;爬蟲(chóng)跑完后這個(gè)表的行數(shù)相比初始數(shù)據(jù)應(yīng)該有明顯增加。如果 count 沒(méi)變化先別懷疑爬蟲(chóng)被封鎖優(yōu)先檢查 4.3 里的ITEM_PIPELINES有沒(méi)有生效以及管道類(lèi)里的 insert SQL 字段名和表字段是否完全一致。字段名大小寫(xiě)不一致MySQL 在 Linux 環(huán)境下會(huì)直接報(bào)錯(cuò)Windows 下反而可能靜默寫(xiě)入空值這也是我見(jiàn)過(guò)最多的“沒(méi)報(bào)錯(cuò)但沒(méi)數(shù)據(jù)”的原因。5. 常見(jiàn)問(wèn)題與排查這套系統(tǒng)最容易翻車(chē)的五個(gè)場(chǎng)景從后端啟動(dòng)到爬蟲(chóng)入庫(kù)我積累了一批高頻問(wèn)題。每個(gè)都是“現(xiàn)象 → 原因 → 解決”結(jié)構(gòu)你照著對(duì)號(hào)入座就行。5.1 后端啟動(dòng)后立刻退出報(bào) DataSource 初始化失敗現(xiàn)象執(zhí)行java -jar或mvn spring-boot:run后控制臺(tái)幾秒內(nèi)就結(jié)束日志里有Failed to configure a DataSource: url attribute is not specified。原因SpringBoot 沒(méi)有讀到數(shù)據(jù)庫(kù)連接配置。最常見(jiàn)的是application.yml不在resources根目錄或者文件名寫(xiě)成了application.properties但是項(xiàng)目里同時(shí)存在兩個(gè)同名配置導(dǎo)致優(yōu)先加載了空文件。解決檢查src/main/resources下有沒(méi)有application.yml和application.properties二選一別兩個(gè)都留著。確認(rèn)spring.datasource.url字段拼寫(xiě)完整url別寫(xiě)成jdbc。改完重新mvn clean package -DskipTests再啟動(dòng)因?yàn)橛袝r(shí)沒(méi)有重新編譯導(dǎo)致舊配置被打進(jìn) jar。5.2 MySQL 密碼正確卻連不上Access denied 和 Public Key Retrieval現(xiàn)象Navicat 能連上 MySQL后端或爬蟲(chóng)卻報(bào)Access denied for user rootlocalhost或者在日志里出現(xiàn)Public Key Retrieval is not allowed。原因這是 MySQL8 密碼認(rèn)證插件caching_sha2_password和舊 JDBC 驅(qū)動(dòng)不兼容導(dǎo)致的。項(xiàng)目的 SQL 環(huán)境和驅(qū)動(dòng)是按 5.7 準(zhǔn)備的你本機(jī)如果裝了 MySQL8 就會(huì)出現(xiàn)這種“所以對(duì)不上”的怪問(wèn)題。解決最干凈的做法是換回 MySQL5.7。如果你堅(jiān)持用 MySQL8至少要在 JDBC URL 后面加兩個(gè)參數(shù)jdbc:mysql://127.0.0.1:3306/gaokao?useSSLfalseallowPublicKeyRetrievaltrueserverTimezoneAsia/Shanghai也可以把 root 的密碼插件改成老式的ALTER USER rootlocalhost IDENTIFIED WITH mysql_native_password BY 你的密碼;注意這個(gè)操作只對(duì) MySQL8 有效請(qǐng)確認(rèn)你的版本再執(zhí)行。我的建議還是少折騰直接切到 5.7 最省心。5.3 前端 npm install 在 node-sass 上反復(fù)失敗現(xiàn)象執(zhí)行1-install.bat或npm install時(shí)進(jìn)度條停在node-sass、node-gyp rebuild最后報(bào)gyp ERR! stack Error: ENOENT。原因node-sass 是編譯型包它需要下載對(duì)應(yīng) Node 版本的二進(jìn)制文件。Node16、Node18 出來(lái)后老版本 node-sass 沒(méi)有預(yù)編譯二進(jìn)制于是走源碼編譯進(jìn)而需要 Visual Studio 的 C 構(gòu)建工具越裝越離譜。解決先卸載你的新版 Node裝 Node 14.17.x。然后刪除前端目錄下的node_modules和package-lock.json重新跑npm install如果網(wǎng)絡(luò)質(zhì)量一般可以給 npm 配鏡像源但記得換回官方源或私有源。裝完看npm ls node-sass只要顯示node-sassx.x.x沒(méi)有紅色報(bào)錯(cuò)就可以繼續(xù)npm run serve。從那以后我再不碰新版 Node 裝 node-sass 項(xiàng)目這是純屬給自己找活。5.4 管理端登錄后數(shù)據(jù)空白但后端接口能通現(xiàn)象后臺(tái)登錄頁(yè)能打開(kāi)賬號(hào)密碼也對(duì)登錄成功后列表頁(yè)表格是空的。按 F12 看網(wǎng)絡(luò)請(qǐng)求接口要么 404要么提示跨域。原因前端 dev server 和后端 SpringBoot 之間代理沒(méi)對(duì)齊。Vue 項(xiàng)目里通常用vue.config.js的devServer.proxy把/api轉(zhuǎn)發(fā)到http://localhost:8080如果后端接口沒(méi)有/api前綴而前端在代理配置里統(tǒng)一加了/api就會(huì)造成路徑錯(cuò)位。解決打開(kāi)前端工程的vue.config.js看 proxy 配置里的 target 是不是http://localhost:8080看接口前綴和后端 controller 的 RequestMapping 是否能對(duì)上。devServer: { proxy: { /api: { target: http://localhost:8080, changeOrigin: true } } }如果后端工程的 context-path 是空的接口路徑?jīng)]有/api那我建議把前端 proxy 的前綴去掉或者后端在application.yml里統(tǒng)一加server.servlet.context-path: /api。兩邊必須一致改完重啟前后端再試。5.5 爬蟲(chóng)跑完沒(méi)有數(shù)據(jù)入庫(kù)日志也沒(méi)報(bào)錯(cuò)現(xiàn)象scrapy crawl gaokao正常結(jié)束控制臺(tái)沒(méi)有紅色異常但 MySQL 里表 count 沒(méi)變。這個(gè)問(wèn)題比報(bào)錯(cuò)惡心因?yàn)橄到y(tǒng)看起來(lái)“跑完了”實(shí)際什么都沒(méi)寫(xiě)。原因一是ITEM_PIPELINES沒(méi)啟用或注釋掉了items 被爬下來(lái)但沒(méi)人處理二是管道里的 insert SQL 字段名和數(shù)據(jù)庫(kù)表字段名不一致MySQL 的嚴(yán)格模式報(bào)錯(cuò)被吞掉三是爬蟲(chóng)根本沒(méi)匹配到目標(biāo)站點(diǎn)結(jié)構(gòu)比如網(wǎng)頁(yè)改版后 xpath 提取不到任何內(nèi)容items 是空的。解決先用 JSON 輸出確認(rèn)爬蟲(chóng)有沒(méi)有產(chǎn)出 itemscrapy crawl gaokao -o test.json打開(kāi)test.json如果為空說(shuō)明是爬蟲(chóng)解析問(wèn)題去spiders里檢查 xpath/css 選擇器。如果 JSON 有數(shù)據(jù)說(shuō)明問(wèn)題在管道檢查settings.py的ITEM_PIPELINES有沒(méi)有注釋檢查pipelines.py里的MYSQL_HOST等變量名有沒(méi)有引用到 settings。最后手動(dòng)在 MySQL 里跑一條插入語(yǔ)句確認(rèn)當(dāng)前用戶(hù)對(duì)目標(biāo)表有 insert 權(quán)限。6. 最后驗(yàn)證從管理后臺(tái)到爬蟲(chóng)入庫(kù)的全鏈路巡檢環(huán)境裝完、服務(wù)跑起來(lái)之后真正容易漏掉的是“整條數(shù)據(jù)鏈”。我自己的巡檢習(xí)慣是遵循一條固定路徑后端進(jìn)程 → 前端頁(yè)面 → 爬蟲(chóng)數(shù)據(jù) → 推薦結(jié)果。先拿端口說(shuō)話。后端 8080 要處于監(jiān)聽(tīng)狀態(tài)前端 dev server 或 build 產(chǎn)物要能被瀏覽器訪問(wèn)。在命令行執(zhí)行netstat -ano | findstr 8080看到 TCP 監(jiān)聽(tīng)狀態(tài)后瀏覽器分別打開(kāi)兩個(gè)前端入口考生端先走登錄注冊(cè)管理后臺(tái)用項(xiàng)目說(shuō)明文檔里的管理員賬號(hào)登錄。登錄不進(jìn)去就回到 3.2 查數(shù)據(jù)庫(kù)登錄后點(diǎn)幾個(gè)關(guān)鍵頁(yè)面專(zhuān)業(yè)查詢(xún)、院校查詢(xún)、位次查詢(xún)、招生計(jì)劃、MBTI 職業(yè)性格測(cè)試、模擬志愿填報(bào)。這幾個(gè)頁(yè)面能列表展示數(shù)據(jù)接口鏈路基本就沒(méi)問(wèn)題。爬蟲(chóng)環(huán)節(jié)我習(xí)慣做一次三查檢查項(xiàng)命令/方法預(yù)期結(jié)果爬蟲(chóng)命令是否可用scrapy list輸出爬蟲(chóng)名不報(bào)錯(cuò)爬蟲(chóng)數(shù)據(jù)是否落庫(kù)SELECT COUNT(*) FROM school;行數(shù)大于初始值脫敏數(shù)據(jù)是否參與推薦前端院校推薦頁(yè)是否有爬取到的非示例院校頁(yè)面出現(xiàn)真實(shí)抓取數(shù)據(jù)最后再?gòu)臄?shù)據(jù)庫(kù)反查一條記錄挑一個(gè)剛爬取的院校名稱(chēng)去前端搜索框里搜一下如果搜索結(jié)果能搜到且點(diǎn)擊進(jìn)詳情頁(yè)說(shuō)明爬蟲(chóng)、后端、前端這條鏈路完全閉合。這里同樣提醒別用生產(chǎn)環(huán)境真實(shí)數(shù)據(jù)本地導(dǎo)入的只是演示數(shù)據(jù)夠用就行。我早先給某模擬項(xiàng)目X做環(huán)境驗(yàn)收時(shí)前后端都起來(lái)了管理后臺(tái)也進(jìn)得去我以為這事算完。結(jié)果第二天用戶(hù)反饋推薦頁(yè)沒(méi)數(shù)據(jù)查了一下午才發(fā)現(xiàn)爬蟲(chóng)的數(shù)據(jù)管道根本沒(méi)開(kāi)。從那以后我每次拿到這種帶爬蟲(chóng)的畢設(shè)項(xiàng)目都強(qiáng)制自己把“爬蟲(chóng)入庫(kù) → 數(shù)據(jù)庫(kù)查數(shù) → 前端搜得到”這一圈走完才敢說(shuō)跑通了。這套檢查流程看起來(lái)很笨但能擋住一大半玄學(xué)問(wèn)答希望幫到你。本文還有配套的精品資源點(diǎn)擊獲取