環(huán)境搭建:JDK與爬蟲全流程實(shí)戰(zhàn))
簡介這套基于爬蟲的高考志愿智能推薦系統(tǒng)Java畢設(shè)項(xiàng)目采用SpringBootVue前后端分離架構(gòu)面向計(jì)算機(jī)專業(yè)本科畢業(yè)設(shè)計(jì)、Java全棧學(xué)習(xí)或教育類系統(tǒng)二次開發(fā)。系統(tǒng)完整覆蓋考生端與后臺(tái)管理端包含登錄注冊(cè)、專業(yè)/院校/位次查詢、MBTI職業(yè)性格測試、院校識(shí)別、收藏管理、模擬志愿填報(bào)與志愿管理后臺(tái)支持專業(yè)、院校、咨詢、招生計(jì)劃、用戶及MBTI測試管理。技術(shù)上通過Python爬蟲抓取中國教育在線歷年錄取數(shù)據(jù)結(jié)合知識(shí)圖譜與智能匹配算法為考生提供個(gè)性化志愿推薦。壓縮包共671個(gè)文件以Java源碼、Vue組件、Python腳本、SQL數(shù)據(jù)庫為主另含設(shè)計(jì)文檔、答辯PPT與說明文檔整體僅34.56MB目錄結(jié)構(gòu)清晰。目前已有87人學(xué)習(xí)適合需要完整畢業(yè)設(shè)計(jì)參考、快速理解前后端分離項(xiàng)目或研究教育數(shù)據(jù)推薦系統(tǒng)的開發(fā)者具有較高的實(shí)戰(zhàn)與學(xué)習(xí)價(jià)值。1. 這套高考志愿推薦系統(tǒng)卡在JDK版本上的次數(shù)最多拿到這份「基于爬蟲的高考志愿智能推薦系統(tǒng)」源碼包時(shí)我第一反應(yīng)是這套東西肯定好裝——SpringBoot 2.x Vue 前后端分離JDK 1.8、MySQL 5.7、Maven 都是老搭檔了。結(jié)果第一次啟動(dòng)就翻車后端一直報(bào)UnsupportedClassVersionError查了半天才發(fā)現(xiàn)本機(jī)默認(rèn) JDK 是 17而項(xiàng)目是按 JDK 1.8 編譯的。這類 SpringBoot 老項(xiàng)目對(duì) JDK 版本極敏感換個(gè)大版本編譯直接黑匣子式報(bào)錯(cuò)。這份源碼帶爬蟲、知識(shí)圖譜、MBTI 測試、模擬填報(bào)一整套功能適合畢設(shè)或者想跑通「爬蟲采集 → 數(shù)據(jù)落庫 → 推薦匹配」全鏈路的開發(fā)者。這篇筆記就是我從零裝到跑通的全過程版本怎么選、參數(shù)怎么配、壞了怎么救都在里面。2. 環(huán)境準(zhǔn)備JDK 1.8 Maven MySQL 5.7 的版本取舍2.1 JDK 1.8SpringBoot 老項(xiàng)目最不能亂動(dòng)的一環(huán)這套系統(tǒng)后端是 SpringBoot 2.x開發(fā)語言 Java摘要在環(huán)境說明里寫死了 JDK 1.8。這不是建議是硬性要求。SpringBoot 2.x 雖然能在高版本 JDK 上跑但項(xiàng)目里如果用了依賴 JDK 1.8 內(nèi)部 API 的庫換到 JDK 11 以上就會(huì)遇到j(luò)ava.lang.NoClassDefFoundError這類詭異報(bào)錯(cuò)。所以我裝環(huán)境的第一步不是裝新而是把本機(jī)已有的 JDK 版本理清楚。我一般先執(zhí)行一條命令確認(rèn)當(dāng)前 shell 里到底用的是哪個(gè) JDKjava -version javac -version echo $JAVA_HOME如果輸出里帶17、21這類字樣但又不是 1.8說明環(huán)境變量指向錯(cuò)了。不要急著卸載老項(xiàng)目和新項(xiàng)目共存是常態(tài)正確做法是把 JDK 1.8 單獨(dú)裝到一個(gè)固定路徑比如C:\Java\jdk1.8.0_202然后在系統(tǒng)環(huán)境變量里把JAVA_HOME指向它再把%JAVA_HOME%\bin挪到PATH的最前面。注意Windows 下PATH里如果同時(shí)存在多個(gè) JDK 的 bin 目錄誰在前面誰生效這是裝環(huán)境最容易忽略的一個(gè)點(diǎn)。JDK 1.8 的最后一個(gè)免費(fèi)公共版本是 8u202我一直用這個(gè)版本穩(wěn)定也沒有后續(xù) Oracle 的授權(quán)問題。裝完確認(rèn)一下java -version # 期望輸出包含 java version 1.8.0_2022.2 Maven 配置鏡像、倉庫與編譯期的依賴坑Maven 是這個(gè) SpringBoot 項(xiàng)目能否編譯通過的關(guān)鍵。項(xiàng)目帶了pom.xml所有依賴都靠它拉取。Maven 版本我建議選 3.6.x跟 JDK 1.8 配合最穩(wěn)3.9 雖然也能用但對(duì)某些老插件的兼容性反而矯情。裝完 Maven 后先改settings.xml這一步不做后面編譯時(shí)下載依賴能卡到你懷疑人生。settings.xml一般在 Maven 安裝目錄的conf下我習(xí)慣把本地倉庫指到一個(gè)獨(dú)立盤符再配一個(gè)國內(nèi)鏡像。核心配置長這樣localRepositoryD:/maven/repository/localRepository mirrors mirror idaliyun/id mirrorOfcentral/mirrorOf urlhttps://maven.aliyun.com/repository/public/url /mirror /mirrorslocalRepository指定依賴包落盤路徑mirrorOf設(shè)成central表示中央倉庫的請(qǐng)求全部走阿里云鏡像。這一步默認(rèn)不配的話Maven 會(huì)去訪問中央倉庫老項(xiàng)目的依賴又多又碎網(wǎng)絡(luò)稍微一抖就報(bào)Could not transfer artifact然后整個(gè)編譯流程卡死。配完鏡像后驗(yàn)證一下mvn -version能看到 Maven 版本號(hào)和Java version: 1.8.0_202就說明環(huán)境變量沒問題。這里還有個(gè)血淚經(jīng)驗(yàn)如果mvn -version顯示的 Java 版本不是 1.8優(yōu)先查JAVA_HOMEMaven 本身不挑 JDK它只是把JAVA_HOME的路徑透傳給編譯插件。2.3 MySQL 5.7 初始化字符集與密碼策略決定后面能不能連上數(shù)據(jù)庫這塊摘要里寫的是 MySQL 5.7一句話帶過但實(shí)際安裝時(shí)坑不少。MySQL 8.x 默認(rèn)的密碼加密方式是caching_sha2_password而這套項(xiàng)目大概率用的是老驅(qū)動(dòng)不認(rèn)這個(gè)加密方式連接時(shí)報(bào)Unable to load authentication plugin。所以別貪新老老實(shí)實(shí)裝 MySQL 5.7。Windows 上裝 5.7 建議下載 zip 包手動(dòng)初始化不要用安裝版——安裝版會(huì)默認(rèn)裝成 Windows 服務(wù)、寫一堆注冊(cè)表后邊想換版本很麻煩。手動(dòng)初始化流程# 解壓后進(jìn)入 bin 目錄執(zhí)行初始化 mysqld --initialize-insecure --basedirD:/mysql-5.7.44 --datadirD:/mysql-5.7.44/data--initialize-insecure表示 root 賬戶初始密碼為空適合本地開發(fā)省去翻日志找隨機(jī)密碼的功夫。初始化完還需要手動(dòng)建一個(gè)my.ini關(guān)鍵幾項(xiàng)如下[mysqld] basedirD:/mysql-5.7.44 datadirD:/mysql-5.7.44/data port3306 character-set-serverutf8mb4 [client] default-character-setutf8mb4utf8mb4比utf8多支持 emoji 和生僻字高考志愿系統(tǒng)里院校名稱、專業(yè)名稱偶爾會(huì)帶特殊字符用utf8mb4省得插入數(shù)據(jù)報(bào)Incorrect string value。配好后啟動(dòng)服務(wù)mysqld --console另開一個(gè)窗口連進(jìn)去改密碼mysql -uroot -p ALTER USER rootlocalhost IDENTIFIED BY 你的密碼;注意5.7 的ALTER USER默認(rèn)走mysql_native_password這正是 SpringBoot 老驅(qū)動(dòng)能識(shí)別的認(rèn)證方式別手動(dòng)改成別的。3. 數(shù)據(jù)庫與后端啟動(dòng)SpringBoot 服務(wù)是怎么一步步跑起來的3.1 數(shù)據(jù)庫導(dǎo)入用 Navicat 跑 SQL 的正確姿勢源碼壓縮包里帶 MySQL 數(shù)據(jù)庫文件一般是一個(gè).sql腳本。我用 Navicat 導(dǎo)入的步驟是新建連接填 localhost、端口 3306、用戶名 root、密碼填剛設(shè)置的連接成功后右鍵新建數(shù)據(jù)庫庫名跟腳本里的CREATE DATABASE保持一致然后右鍵這個(gè)庫選「運(yùn)行 SQL 文件」把腳本拖進(jìn)去執(zhí)行。這里有個(gè)關(guān)鍵點(diǎn)導(dǎo)入之前先確認(rèn)腳本的字符集。Navicat 導(dǎo)入時(shí)如果識(shí)別錯(cuò)編碼中文全變亂碼后面頁面上看到的所有院校名、專業(yè)名全是「錕斤拷」。我一般的做法是先用記事本打開.sql文件看前 20 行找SET NAMES utf8mb4或DEFAULT CHARSET這類標(biāo)記沒有的話導(dǎo)入時(shí)手動(dòng)把編碼選成 UTF-8。導(dǎo)入完成后驗(yàn)證一下表數(shù)量和數(shù)據(jù)量USE 數(shù)據(jù)庫名; SHOW TABLES; SELECT COUNT(*) FROM 專業(yè)表;表名可能跟業(yè)務(wù)詞不完全一致但至少要看到用戶表、專業(yè)表、院校表、錄取數(shù)據(jù)表這四類核心表存在。如果COUNT(*)是 0說明導(dǎo)入的數(shù)據(jù)有問題或者導(dǎo)錯(cuò)了庫趁早重來別拖到后邊啟動(dòng)才發(fā)現(xiàn)。3.2 后端配置修改application.yml 里的三個(gè)關(guān)鍵項(xiàng)SpringBoot 項(xiàng)目的配置集中在src/main/resources/application.yml里啟動(dòng)之前必須逐個(gè)核對(duì)。我整理了一份檢查清單端口、數(shù)據(jù)源、MyBatis 映射路徑。這三項(xiàng)錯(cuò)一個(gè)服務(wù)要么起不來要么起來后接口全 500。server: port: 8080 spring: datasource: url: jdbc:mysql://localhost:3306/數(shù)據(jù)庫名?useUnicodetruecharacterEncodingutf8mb4useSSLfalseserverTimezoneAsia/Shanghai username: root password: 你的密碼 driver-class-name: com.mysql.jdbc.DriveruseSSLfalse必須加本機(jī)開發(fā)環(huán)境沒有證書不加會(huì)報(bào) SSL 連接告警甚至失敗。serverTimezoneAsia/Shanghai也是必須的——MySQL 5.7 的時(shí)區(qū)默認(rèn)跟系統(tǒng)不一致不加的話日期字段查出來會(huì)差 8 個(gè)小時(shí)模擬志愿填報(bào)的時(shí)間戳全亂。driver-class-name有的項(xiàng)目寫com.mysql.cj.jdbc.Driver有的寫老驅(qū)動(dòng)com.mysql.jdbc.Driver以項(xiàng)目里 pom.xml 的 MySQL 驅(qū)動(dòng)版本為準(zhǔn)改錯(cuò)會(huì)直接ClassNotFoundException。3.3 編譯與啟動(dòng)兩種啟動(dòng)方式各自的適用場景后端啟動(dòng)有兩類方式IDE 里跑和命令行跑。IDE 方式適合調(diào)試——斷點(diǎn)、熱部署都在里面Eclipse 或 IDEA 導(dǎo)入 Maven 項(xiàng)目后直接右鍵SpringBootApplication主類運(yùn)行。命令行方式適合部署和復(fù)現(xiàn)問題。# 在項(xiàng)目根目錄執(zhí)行先編譯再啟動(dòng) mvn clean package -DskipTests java -jar target/xxx.jarclean package會(huì)清理舊產(chǎn)物并重新打包-DskipTests跳過測試代碼避免測試類里連不上數(shù)據(jù)庫導(dǎo)致打包失敗。這套項(xiàng)目里還帶了1-install.bat、2-run.bat這類腳本本質(zhì)就是上面這兩條命令的封裝。我習(xí)慣先用命令行跑一次全流程走通、日志不報(bào)錯(cuò)之后再進(jìn) IDE 加斷點(diǎn)調(diào)試具體功能模塊。啟動(dòng)成功的標(biāo)志不是控制臺(tái)停住而是日志里出現(xiàn)Started Application in x.xxx seconds或者 Tomcat 端口號(hào)被打印出來??吹竭@行字后端才算是真正起來了。4. 前端與爬蟲Vue 管理后臺(tái)構(gòu)建 Scrapy 數(shù)據(jù)采集鏈路4.1 Vue 前端依賴安裝與構(gòu)建node_modules 黑洞怎么避開前端目錄在src/main/resources/admin/admin和src/main/resources/front/front下面一個(gè)管后臺(tái)管理端一個(gè)管考生端。兩者都是 Vue 項(xiàng)目各自要npm install一次。前端裝依賴是這套系統(tǒng)里最玄學(xué)的環(huán)節(jié)——同樣的命令不同 Node 版本結(jié)果可能完全不一樣。這套源碼對(duì)應(yīng)的 Vue 項(xiàng)目要看 package.json 里 vue 的版本決定 Node 版本。Vue 2.x 的老項(xiàng)目建議用 Node 10 或 12 這一代Vue 3.x 可以用 Node 14 以上。我之前在 Node 18 上裝一個(gè) Vue 2 的老項(xiàng)目node-sass編譯直接報(bào)錯(cuò)換回 Node 12 一次通過。判斷項(xiàng)目到底是哪一代看package.json里的vue字段就知道。安裝命令本身不復(fù)雜npm install但執(zhí)行前我建議先看一眼package.json里有沒有node-sass。有的話這個(gè)包是 Node 版本敏感度最高的依賴它要通過 node-gyp 編譯原生模塊Node 版本對(duì)不上必掛。解決方式有兩種一是切換到匹配的 Node 版本二是把node-sass換成sass然后稍微改一下引入方式。對(duì)畢設(shè)項(xiàng)目來說我建議直接換 Node 版本改動(dòng)最小。依賴裝完后的構(gòu)建命令是npm run build構(gòu)建產(chǎn)物是一個(gè)dist目錄里面是純靜態(tài)文件可以丟給 Nginx 托管也可以讓 SpringBoot 直接當(dāng)靜態(tài)資源加載。前端開發(fā)模式下用的是npm run dev會(huì)起一個(gè)帶熱更新的開發(fā)服務(wù)器。4.2 Scrapy 爬蟲install 與運(yùn)行流程爬蟲這塊用的是 Scrapy源碼包里有獨(dú)立的spider目錄里面帶了scrapy.cfg、安裝.bat、運(yùn)行.bat。Scrapy 是 Python 的框架所以本機(jī)還得有個(gè) Python 環(huán)境。3.7 到 3.10 之間都行Scrapy 對(duì) Python 版本要求不算苛刻。安裝.bat本質(zhì)就是pip install scrapy如果 pip 下載慢臨時(shí)切到國內(nèi)源pip install scrapy -i https://pypi.tuna.tsinghua.edu.cn/simple裝完驗(yàn)證一下scrapy version運(yùn)行.bat對(duì)應(yīng)的命令是scrapy crawl 爬蟲名爬蟲名要去spiders目錄下的具體爬蟲文件里看一般是start_urls和name屬性里定義的字符串。啟動(dòng)后如果控制臺(tái)開始刷[scrapy.core.engine]之類的日志說明爬蟲已經(jīng)在跑。這套爬蟲需要單獨(dú)執(zhí)行執(zhí)行前確認(rèn)目標(biāo)數(shù)據(jù)庫連接配置跟后端一致——因?yàn)榕赖降脑盒d浫?shù)據(jù)要寫進(jìn) MySQL通常配置在 Scrapy 項(xiàng)目的pipelines.py或者settings.py里。它的數(shù)據(jù)源是對(duì)公開放出的教育類錄取數(shù)據(jù)站點(diǎn)采集的是歷年分?jǐn)?shù)線這類公開內(nèi)容。4.3 前后端聯(lián)調(diào)跨域與端口配置后端起在8080前端開發(fā)服務(wù)器默認(rèn)起在9527之類的端口。兩個(gè)端口不一樣瀏覽器就會(huì)報(bào)跨域錯(cuò)誤頁面能打開但接口全紅。處理方式兩種一是后端加CrossOrigin或者全局 CORS 配置二是前端開發(fā)環(huán)境配代理轉(zhuǎn)發(fā)。老 Vue 項(xiàng)目一般通過config/index.js里的proxyTable做代理proxyTable: { /api: { target: http://localhost:8080, changeOrigin: true } }這段配置的意思是前端發(fā)出的所有/api開頭請(qǐng)求都由開發(fā)服務(wù)器轉(zhuǎn)發(fā)到8080端口的后端服務(wù)。changeOrigin: true保證請(qǐng)求頭里的 Host 被替換成目標(biāo)地址不然部分后端框架會(huì)拒絕非本機(jī)來源的請(qǐng)求。后端那邊如果自己寫了 CORS 配置注意別跟前端代理同時(shí)開——雙份跨域處理偶發(fā)沖突表現(xiàn)是請(qǐng)求能到后端但響應(yīng)被瀏覽器攔了肉眼極難排查。我一般選前端代理這條路后端少碰配置。5. 常見問題排查啟動(dòng)失敗的 5 個(gè)高頻坑與解決記錄5.1 端口被占用導(dǎo)致后端起不來現(xiàn)象啟動(dòng) SpringBoot 時(shí)日志報(bào)Web server failed to start. Port 8080 was already in use或者直接拋BindException。原因本機(jī)其他進(jìn)程占用了 8080 端口常見的有微信開發(fā)者工具、本地 Tomcat、另一個(gè) SpringBoot 進(jìn)程。解決先查誰占用了端口再?zèng)Q定殺進(jìn)程還是換端口。netstat -ano | findstr 8080 taskkill /PID 進(jìn)程號(hào) /F如果是想換端口直接改application.yml里的server.port但要注意前端代理配置里的target端口同步改掉否則前端轉(zhuǎn)發(fā)還是打到舊端口。5.2 MySQL 5.7 密碼認(rèn)證方式引發(fā)連接失敗現(xiàn)象后端啟動(dòng)日志報(bào)Access denied for user rootlocalhost但 Navicat 用同樣的賬號(hào)密碼連得好好的。原因Navicat 和 JDBC 驅(qū)動(dòng)走不同的認(rèn)證流程。常見場景是用戶密碼里帶了、#這種特殊字符在application.yml里被解析出錯(cuò)或者密碼確實(shí)是錯(cuò)的Navicat 記住了歷史密碼。解決先排除特殊字符問題——密碼里的特殊字符在 YAML 里要用引號(hào)包起來比如password: abc123。確認(rèn)無誤后用命令行手動(dòng)驗(yàn)證mysql -uroot -p你的密碼 -e SELECT 1能執(zhí)行成功說明認(rèn)證沒問題問題在配置解析上執(zhí)行失敗說明密碼就是不對(duì)回 MySQL 里重置。5.3 Maven 依賴下載卡住或編譯失敗現(xiàn)象執(zhí)行mvn clean package時(shí)卡在Downloading...半小時(shí)不動(dòng)或者報(bào)Could not resolve dependencies某個(gè)jar顯示Last updated時(shí)間很久遠(yuǎn)。原因默認(rèn)走了中央倉庫網(wǎng)絡(luò)延遲高或者某個(gè)依賴版本在鏡像里沒有緩存。解決檢查settings.xml里的鏡像配置是否生效。確認(rèn)方式mvn help:effective-settings這個(gè)命令會(huì)打印實(shí)際生效的 settings 內(nèi)容能看到mirrorOf是否真的指到了阿里云鏡像。如果鏡像配置沒問題但某個(gè)包還是拉不下來去倉庫目錄把這個(gè)包的.lastUpdated后綴文件刪掉再重新編譯。Maven 默認(rèn)不重試失敗的下載不刪這個(gè)文件會(huì)一直報(bào)同樣的錯(cuò)。5.4 前端 npm install 報(bào)錯(cuò)或 build 失敗現(xiàn)象npm install時(shí)報(bào)node-gyp rebuild失敗或者npm run build時(shí)內(nèi)存溢出日志尾部是JS stack trace。原因依賴?yán)镉行枰幾g原生模塊的包還是 node-sass 的問題Node 版本不匹配構(gòu)建時(shí) Webpack 內(nèi)存不夠則是 Node 默認(rèn)堆大小限制。解決Node 版本不對(duì)就換版本這是最省事的路徑。換完版本后先刪掉已有的node_modules再重裝避免舊包殘留rm -rf node_modules package-lock.json npm install如果是構(gòu)建內(nèi)存溢出單獨(dú)調(diào)大 Node 堆內(nèi)存npm run build --max_old_space_size40965.5 Scrapy 爬蟲能啟動(dòng)但采集不到數(shù)據(jù)現(xiàn)象scrapy crawl啟動(dòng)后日志刷了一堆翻頁也正常但數(shù)據(jù)庫里一條新數(shù)據(jù)都沒寫入。原因最常出在數(shù)據(jù)庫寫入管道上——數(shù)據(jù)庫表結(jié)構(gòu)跟 Scrapy item 字段對(duì)不上或者數(shù)據(jù)庫連接配置用的還是默認(rèn)的 SQLite數(shù)據(jù)被寫進(jìn)了本地.db文件而不是 MySQL。解決先看 Scrapy 項(xiàng)目的settings.py里的ITEM_PIPELINES配置確認(rèn)啟用了哪個(gè)管道類再打開對(duì)應(yīng)的pipelines.py看里面連的是什么數(shù)據(jù)庫。如果連的是 MySQL檢查host、user、password、db四項(xiàng)是否跟后端application.yml一致。改完后重啟爬蟲看日志里有沒有出現(xiàn)Item stored之類的成功標(biāo)記。6. 裝完怎么驗(yàn)證跑通功能級(jí)自測清單與數(shù)據(jù)鏈路驗(yàn)證環(huán)境全部裝好、服務(wù)都能啟動(dòng)之后別急著截圖交差先按業(yè)務(wù)主鏈路把功能過一遍。我一般按「數(shù)據(jù) → 接口 → 頁面」三層驗(yàn)證順序不能反底層數(shù)據(jù)有問題上層頁面再好看也是假跑通。第一層驗(yàn)證數(shù)據(jù)完整性。登錄 MySQL 服務(wù)確認(rèn)爬蟲采集的數(shù)據(jù)已經(jīng)落庫。查看錄取數(shù)據(jù)表的記錄數(shù)SELECT COUNT(*) FROM 錄取數(shù)據(jù)表; SELECT COUNT(*) FROM 專業(yè)表; SELECT COUNT(*) FROM 院校表;三個(gè)表的數(shù)量級(jí)應(yīng)該跟正常業(yè)務(wù)量匹配如果全是 0后邊的推薦匹配就是空轉(zhuǎn)。第二層驗(yàn)證后端接口。打開瀏覽器直接訪問幾個(gè)關(guān)鍵接口路徑確認(rèn)返回 JSON 而不是 404 或 500。比如http://localhost:8080/api/專業(yè)查詢接口?keyword計(jì)算機(jī)接口返回正常 JSON 數(shù)組就算通過。這一步我發(fā)現(xiàn)很多人跳過直接在頁面上點(diǎn)點(diǎn)點(diǎn)結(jié)果接口報(bào)錯(cuò)被瀏覽器控制臺(tái)吞了還以為是前端渲染問題。第三層驗(yàn)證頁面功能。用考生賬號(hào)走一遍核心鏈路注冊(cè)登錄 → 查詢專業(yè)和院校 → 做一次 MBTI 職業(yè)性格測試 → 進(jìn)入模擬志愿填報(bào) → 添加幾個(gè)志愿 → 查看推薦結(jié)果。后臺(tái)管理端也值得花十分鐘過一遍用管理員賬號(hào)登錄確認(rèn)專業(yè)管理、院校管理、位次管理這幾個(gè)菜單能打開、能編輯、能保存。數(shù)據(jù)鏈路驗(yàn)證還有一個(gè)技巧看推薦結(jié)果是否正確關(guān)聯(lián)了歷史錄取數(shù)據(jù)。模擬填報(bào)后推薦列表里應(yīng)該能看到院校的歷年分?jǐn)?shù)線信息——這些數(shù)據(jù)來自爬蟲采集。如果推薦列表有院校但分?jǐn)?shù)線全是空的說明爬蟲采集的年份字段沒對(duì)接到推薦邏輯上要回溯檢查爬蟲數(shù)據(jù)字段的映射。從那以后我每次拿到老項(xiàng)目源碼都強(qiáng)制自己先走一遍這條鏈路查 JDK 版本、確認(rèn)數(shù)據(jù)庫認(rèn)證方式、編譯一次后端、構(gòu)建一次前端、跑一個(gè)爬蟲任務(wù)、最后點(diǎn)一遍關(guān)鍵頁面。六個(gè)環(huán)節(jié)全綠才敢說「跑通了」。希望這篇筆記能幫到你少走我走過的這些彎路。本文還有配套的精品資源點(diǎn)擊獲取