據(jù)爬蟲+分析+可視化框架:從爬取到圖表的全鏈路拆解)
簡介一套完整的Python股票數(shù)據(jù)爬蟲、分析與可視化框架面向計(jì)算機(jī)相關(guān)專業(yè)正在做畢業(yè)設(shè)計(jì)、課程設(shè)計(jì)或期末大作業(yè)的學(xué)生也適合需要項(xiàng)目實(shí)戰(zhàn)練習(xí)的學(xué)習(xí)者。項(xiàng)目共11個(gè)文件壓縮包約260KB包括5個(gè)Python腳本、2個(gè)pyc編譯文件、1個(gè)txt依賴清單、1個(gè)HTML模板、1個(gè)JS圖表庫和1個(gè)MD文檔py腳本承擔(dān)采集、處理與界面邏輯HTML與JS構(gòu)成可視化頁面txt與MD幫助快速復(fù)現(xiàn)依賴環(huán)境、了解項(xiàng)目結(jié)構(gòu)。核心流程覆蓋股票基礎(chǔ)信息爬取、歷史行情數(shù)據(jù)采集、工具函數(shù)封裝與依賴管理可視化端基于ECharts展示行情瀏覽頁面形成從數(shù)據(jù)抓取到界面展示的完整閉環(huán)。整體框架定位為98分畢業(yè)設(shè)計(jì)系統(tǒng)源碼經(jīng)過嚴(yán)格調(diào)試附有項(xiàng)目說明文檔便于快速運(yùn)行與二次開發(fā)可作為畢業(yè)設(shè)計(jì)或期末大作業(yè)的完整參考方案。目前已有282人學(xué)習(xí)/瀏覽適合需要完整參考方案或項(xiàng)目實(shí)戰(zhàn)練習(xí)的學(xué)習(xí)者。1. 這不是“又一個(gè)爬蟲demo”Python股票數(shù)據(jù)爬蟲分析可視化框架到底能幫你交付什么如果你正處于畢業(yè)設(shè)計(jì)、課程設(shè)計(jì)或期末大作業(yè)的周期里最怕的不是沒思路而是手里拿到的“參考項(xiàng)目”根本跑不起來。Python股票數(shù)據(jù)爬蟲分析可視化框架這套資源我拆完第一感受是它不是那種幾十行代碼的玩具爬蟲而是一套把數(shù)據(jù)采集、內(nèi)存緩存、圖表渲染、前端模板串成一條完整鏈路的工整項(xiàng)目。它解決的是“從股票數(shù)據(jù)源到瀏覽器里出圖表”的全流程問題適合正在做畢設(shè)的計(jì)算機(jī)相關(guān)專業(yè)學(xué)生也適合想練完整項(xiàng)目手感、又不想從零攢框架的初學(xué)者。這套東西的妙處在于分層很清楚爬蟲歸爬蟲、視圖歸視圖、入口歸入口哪怕你想換數(shù)據(jù)源、換圖表類型都能在不動(dòng)整體結(jié)構(gòu)的前提下改。接下來我把每個(gè)文件的實(shí)際作用、跑通順序和真正的坑都拆給你看。2. 先讀懂工程骨架這個(gè)股票分析框架的模塊劃分與數(shù)據(jù)流2.1 目錄里每個(gè)文件是干什么的我拿到資源后第一步永遠(yuǎn)是先列文件清單而不是急著跑。這個(gè)框架的核心文件分布得很典型從上到下能看出作者的層劃分習(xí)慣文件/目錄職責(zé)定位一句話說明data_scrapy/stock_basic_scrapy.py股票基礎(chǔ)信息爬蟲抓股票代碼、名稱、行業(yè)等基礎(chǔ)列表data_scrapy/history_stock_quotes_scrapy.py歷史行情爬蟲抓個(gè)股日線、成交量、漲跌幅等歷史行情data_scrapy/utils/通用工具模塊存放公共方法比如請求頭構(gòu)造、字段清洗myDict.py自定義字典/緩存容器內(nèi)存級數(shù)據(jù)暫存避免頻繁重爬requirements.txt依賴清單聲明項(xiàng)目運(yùn)行所需的第三方包data_viewer/rightview.py圖表裝配邏輯把爬來的數(shù)據(jù)組織成圖表可用的JSON結(jié)構(gòu)data_viewer/template.html前端模板瀏覽器最終渲染的頁面骨架data_viewer/echarts.min.js本地ECharts庫圖表渲染依賴放在本地避免外鏈?zhǔn)ain.py項(xiàng)目入口串聯(lián)數(shù)據(jù)采集、裝配、頁面服務(wù)的啟動(dòng)點(diǎn)這個(gè)分層的好處是你想只跑爬蟲看數(shù)據(jù)那就不碰data_viewer你想只調(diào)頁面效果就預(yù)置一份JSON數(shù)據(jù)喂給模板。畢設(shè)答辯時(shí)老師問“你的項(xiàng)目是怎么組織的”照這個(gè)結(jié)構(gòu)講邏輯比“我寫了一個(gè)爬蟲”有說服力得多。2.2 數(shù)據(jù)是怎么從網(wǎng)頁走到圖表的整個(gè)框架的數(shù)據(jù)流一句話描述就是爬蟲模塊把網(wǎng)頁數(shù)據(jù)解析成Python結(jié)構(gòu)經(jīng)過myDict做內(nèi)存暫存再交給rightview.py轉(zhuǎn)成ECharts的option格式最后注入template.html由echarts.min.js渲染成圖表。這條鏈路里最容易斷的不是爬蟲而是中間的“數(shù)據(jù)裝配”環(huán)節(jié)。很多學(xué)生自己寫畢設(shè)時(shí)爬蟲跑完數(shù)據(jù)就往終端一打印前端拿不到結(jié)構(gòu)化的東西。這個(gè)框架把rightview.py單獨(dú)拎出來就是為了讓“原始數(shù)據(jù)”和“圖表數(shù)據(jù)”解耦。爬蟲側(cè)輸出的常見結(jié)構(gòu)是這樣的每只股票一個(gè)字典包含代碼、名稱、日期序列、收盤價(jià)序列、成交量序列。rightview.py要做的就是把這種縱向的“多股票多維字段”拆成ECharts里series需要的橫向格式。如果這里不做拆分前端拿到的數(shù)據(jù)會顯得很笨重。我一般會建議拿到資源后先打印rightview.py的輸入和輸出各一條確認(rèn)數(shù)據(jù)字段名是否對得上。這個(gè)動(dòng)作能幫你避免后面白屏?xí)r一頭霧水。2.3 最小閉環(huán)怎么先讓它跑起來在改任何代碼之前先按我給的順序跑通一次。打開終端在項(xiàng)目根目錄執(zhí)行# 安裝依賴建議用 Python 3.8 的虛擬環(huán)境 pip install -r requirements.txt # 第一步單獨(dú)跑基礎(chǔ)信息爬蟲驗(yàn)證網(wǎng)絡(luò)和數(shù)據(jù)解析是否正常 python data_scrapy/stock_basic_scrapy.py # 第二步單獨(dú)跑歷史行情爬蟲驗(yàn)證個(gè)股K線數(shù)據(jù)能否落地 python data_scrapy/history_stock_quotes_scrapy.py # 第三步啟動(dòng)入口打開可視化頁面 python main.py這里的依賴清單是這類爬蟲項(xiàng)目的標(biāo)配requests負(fù)責(zé)發(fā)起HTTP請求lxml配合xpath做頁面解析flask用來提供本地頁面服務(wù)main.py常見做法是用Flask起一個(gè)本地端口。如果main.py運(yùn)行后提示端口被占用把代碼里的端口參數(shù)改掉就行不影響全局。我拆項(xiàng)目時(shí)有個(gè)習(xí)慣先看跑通的最小閉環(huán)占多少步。這個(gè)框架三步能見效果屬于負(fù)擔(dān)比較小的那種。跑通后再看數(shù)據(jù)準(zhǔn)不準(zhǔn)、圖表全不全那時(shí)候才有資格談改造。3. 爬蟲層拆解股票基礎(chǔ)信息與歷史行情的抓取邏輯3.1 兩個(gè)爬蟲腳本怎么分工stock_basic_scrapy.py和history_stock_quotes_scrapy.py雖然名字里都帶scrapy但它們實(shí)際是標(biāo)準(zhǔn)的requests腳本只是按模塊命名習(xí)慣掛了個(gè)scrapy后綴。這種命名在畢設(shè)里很常見不用糾結(jié)。兩個(gè)腳本的分工很明確腳本抓取粒度數(shù)據(jù)用途更新頻率stock_basic_scrapy.py股票維度代碼、名稱、行業(yè)生成基礎(chǔ)列表供用戶選擇低頻一天一次足夠history_stock_quotes_scrapy.py時(shí)間維度每日開高低收、成交量繪制K線、走勢圖做分析高頻需要控制節(jié)流分工清晰的最大好處是出了問題能定位列表沒抓到看第一個(gè)腳本K線不對看第二個(gè)腳本不用在兩個(gè)文件里來回翻。3.2 基礎(chǔ)信息爬蟲的核心邏輯stock_basic_scrapy.py要解決的事情是把全市場股票的基礎(chǔ)信息拉下來并穩(wěn)定解析。常見的實(shí)現(xiàn)方式是用requests加xpath先定位表格行節(jié)點(diǎn)再從每行里提取代碼和名稱。我會這樣組織核心邏輯import requests from lxml import html # 目標(biāo)地址以公開股票列表頁為例具體以項(xiàng)目內(nèi)配置為準(zhǔn) LIST_URL https://example.com/stock_list # 占位項(xiàng)目里是實(shí)際數(shù)據(jù)源地址 def fetch_stock_basic(): headers { User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64), Referer: https://example.com/, # 部分站點(diǎn)會校驗(yàn)來源 } resp requests.get(LIST_URL, headersheaders, timeout10) resp.encoding resp.apparent_encoding # 優(yōu)先按頁面實(shí)際編碼解析 tree html.fromstring(resp.text) stocks [] # 常見頁面的行節(jié)點(diǎn)定位具體xpath以項(xiàng)目實(shí)際頁面為準(zhǔn) for row in tree.xpath(//table/tbody/tr): code row.xpath(./td[1]/text()) name row.xpath(./td[2]/text()) if code and name: stocks.append({code: code[0].strip(), name: name[0].strip()}) return stocks這段代碼的重點(diǎn)是兩個(gè)地方resp.encoding resp.apparent_encoding和xpath取文本后要strip()。前者解決中文亂碼后者解決文本里的換行空格污染數(shù)據(jù)。headers里的User-Agent不是可有可無的裝飾很多公開數(shù)據(jù)源對空UA的請求直接返回403或跳驗(yàn)證碼頁面。項(xiàng)目里如果stock_basic_scrapy.py被注釋掉了headers你補(bǔ)上UA和Referer大概率就能從“抓不到”變成“能抓到”。3.3 歷史行情腳本里的翻頁與節(jié)流history_stock_quotes_scrapy.py比基礎(chǔ)信息復(fù)雜因?yàn)樗鎸Υ罅總€(gè)股的逐日數(shù)據(jù)。常見做法是按股票代碼遍歷每只股票按日期參數(shù)請求K線接口拿到JSON后直接解析。核心邏輯長這樣import time import requests from myDict import MyDict # 項(xiàng)目自帶的內(nèi)存緩存容器 QUOTE_API https://example.com/api/quote # 占位項(xiàng)目里是行情接口地址 def fetch_history_quotes(stock_code, page_size100): cache_key fhistory:{stock_code} cache_data MyDict.get(cache_key) if cache_data: return cache_data # 命中緩存直接返回避免重復(fù)請求 quotes [] for page in range(1, 5): # 控制總頁數(shù)避免一次性請求過多 params { code: stock_code, page: page, pageSize: page_size, fields: date,open,close,high,low,volume, } try: resp requests.get(QUOTE_API, paramsparams, timeout10) data resp.json() quotes.extend(data.get(data, [])) except Exception as e: print(fpage {page} 請求失敗: {e}) break # 單頁失敗先停不要連環(huán)重試 time.sleep(0.3) # 關(guān)鍵每頁之間做節(jié)流 MyDict.set(cache_key, quotes, expire3600) # 緩存一小時(shí) return quotes這里的兩個(gè)參數(shù)值得細(xì)看。page_size決定單次請求的數(shù)據(jù)量我習(xí)慣用100因?yàn)槎鄶?shù)接口單頁上限就在這個(gè)量級太大反而容易被服務(wù)端拒絕。time.sleep(0.3)是硬節(jié)流控制在每秒約3次請求既能跑完數(shù)據(jù)又不至于觸發(fā)接口的風(fēng)控。try...except里要注意失敗后我只break當(dāng)前股票的翻頁而不是整只股票重試。這是血淚經(jīng)驗(yàn)——行情接口偶爾超時(shí)很正常為了一頁數(shù)據(jù)把整只股票重抓一遍代價(jià)太高。3.4 請求頭與限流能不能跑全量數(shù)據(jù)的關(guān)鍵這幾個(gè)腳本單獨(dú)跑一兩頁數(shù)據(jù)沒問題但畢設(shè)演示要的是“跑全量數(shù)據(jù)”。全量意味著請求數(shù)量成倍上升這時(shí)候決定成敗的不是解析邏輯而是請求頭完整度和限流策略。請求頭至少要有User-Agent、Referer、Accept三項(xiàng)。Referer尤其容易被忽略有些數(shù)據(jù)源會校驗(yàn)請求是從哪個(gè)頁面跳過來的缺了它直接返回空數(shù)據(jù)。我見過最玄學(xué)的場景爬蟲偶爾成功偶爾失敗最后發(fā)現(xiàn)是Referer時(shí)有時(shí)無。限流方面兩個(gè)腳本之間也要錯(cuò)峰?;A(chǔ)信息爬蟲跑完再跑行情爬蟲不要并行。如果行情腳本加了time.sleep還是被限制優(yōu)先看是不是IP層面的問題解決辦法是把每頁間隔從0.3秒調(diào)到1.5秒犧牲速度換穩(wěn)定性。4. 可視化層main.py、rightview.py與template.html的聯(lián)動(dòng)機(jī)制4.1 main.py入口腳本到底做了什么main.py不是爬蟲也不是圖表代碼而是整個(gè)框架的“裝配車間”。它做的事情一般有三件調(diào)用爬蟲模塊拿數(shù)據(jù)、把數(shù)據(jù)傳給rightview.py生成圖表配置、啟動(dòng)本地服務(wù)讓瀏覽器能訪問template.html。常見的main.py實(shí)現(xiàn)基于Flask寫法大概是這樣from flask import Flask, render_template from data_scrapy.stock_basic_scrapy import fetch_stock_basic from data_viewer.rightview import build_chart_option app Flask(__name__, template_folderdata_viewer) app.route(/) def index(): stocks fetch_stock_basic() # 1. 拿數(shù)據(jù) option build_chart_option(stocks) # 2. 裝配圖表配置 return render_template(template.html, chart_optionoption) if __name__ __main__: app.run(host127.0.0.1, port8080, debugFalse)這里第一個(gè)要理解的點(diǎn)是template_folder參數(shù)。template.html在data_viewer目錄下如果不指定模板文件夾Flask默認(rèn)去templates目錄找就會報(bào)TemplateNotFound。項(xiàng)目里如果main.py已經(jīng)配置好你不需要?jiǎng)尤绻阕约翰痖_重寫入口這是一個(gè)高頻翻車點(diǎn)。debugFalse也建議保持調(diào)試時(shí)用debugTrue雖然能熱重載但爬蟲類項(xiàng)目里熱重載可能引發(fā)重復(fù)請求把數(shù)據(jù)源搞封了就得不償失。4.2 rightview.py把“數(shù)據(jù)”翻譯成“圖表語言”rightview.py存在的意義是把Python字典數(shù)據(jù)結(jié)構(gòu)翻譯成ECharts的option對象。ECharts能渲染什么完全取決于你給它什么樣的series和xAxis。這個(gè)腳本的核心邏輯一般是構(gòu)造時(shí)間軸和對應(yīng)的行情序列def build_chart_option(stock_data): dates [item[date] for item in stock_data] close_prices [item[close] for item in stock_data] volumes [item[volume] for item in stock_data] option { title: {text: 收盤價(jià)走勢}, tooltip: {trigger: axis}, xAxis: {type: category, data: dates}, yAxis: {type: value}, series: [ {name: 收盤價(jià), type: line, data: close_prices}, {name: 成交量, type: bar, data: volumes}, ], } return option這里值得注意的細(xì)節(jié)是tooltip的trigger設(shè)為axis。對于時(shí)間序列數(shù)據(jù)按軸觸發(fā)提示比按點(diǎn)觸發(fā)好用得多鼠標(biāo)劃過去能看到整條豎線上的所有指標(biāo)答辯演示時(shí)觀感更好。rightview.py里如果還想加K線圖只需要把type從line換成candlestick并把data結(jié)構(gòu)改成“開高低收”的四元組數(shù)組。這個(gè)腳本是擴(kuò)展圖表類型的理想位置因?yàn)樗呀?jīng)和爬蟲解耦了。4.3 template.html與echarts.min.js的配合寫法和路徑坑template.html承擔(dān)的是最終渲染。它內(nèi)部必須做三件事引入echarts.min.js、準(zhǔn)備一個(gè)圖表容器div、在腳本里讀取后端傳入的chart_option并初始化圖表。我用最小代碼說明它和本地JS庫的配合方式!DOCTYPE html html langzh-CN head meta charsetUTF-8 title股票分析可視化/title !-- 注意這里引用的是本地文件不是CDN -- script src{{ url_for(static, filenameecharts.min.js) }}/script /head body div idchart stylewidth: 900px; height: 520px;/div script const chart echarts.init(document.getElementById(chart)); // chart_option 由后端通過模板變量注入 chart.setOption({{ chart_option | tojson }}); /script /body /htmltemplate.html有幾個(gè)隱含約定。第一echarts.min.js必須放在Flask能訪問到的static目錄下如果項(xiàng)目里它和template.html同目錄那main.py要么配了static_folder要么直接把JS路徑寫死為相對路徑。第二{{ chart_option | tojson }}是后端對象到前端JS對象的關(guān)鍵轉(zhuǎn)換少了tojson過濾器Python字典會被渲染成{ date: ... }這種帶引號的格式ECharts直接報(bào)錯(cuò)。如果你改了main.py的端口或路由記得同步檢查template.html里的資源引用路徑。白屏問題里有一半是JS文件沒加載成功打開瀏覽器控制臺看到404就說明路徑寫錯(cuò)了。另一個(gè)常見問題是圖表容器div沒有被渲染出來檢查是不是模板里漏掉了閉合標(biāo)簽。5. 避坑與排查把這套框架跑順的五條實(shí)戰(zhàn)記錄5.1 現(xiàn)象小數(shù)據(jù)量正常一跑全量就被攔截第一次跑完基礎(chǔ)信息爬蟲我只請求了兩頁一切正常。換成全量列表后第三頁開始返回空數(shù)據(jù)再過幾頁直接提示“訪問頻繁”。原因是代碼里對全量場景沒有節(jié)流請求頻率遠(yuǎn)超數(shù)據(jù)源容忍閾值。解決給每頁請求加上time.sleep(random.uniform(0.5, 1.5))讓請求間隔有隨機(jī)抖動(dòng)比固定時(shí)長的節(jié)流更難被識別。另一個(gè)兜底是給requests.get加retries邏輯遇到單次失敗休息5秒再重試不要連環(huán)請求。5.2 現(xiàn)象歷史行情返回的日期字段亂碼跑history_stock_quotes_scrapy.py時(shí)日期和名稱字段打印出來是亂碼但數(shù)字字段正常。這是典型的編碼問題JSON接口通常返回UTF-8但如果腳本在請求后手動(dòng)指定了錯(cuò)誤的編碼中文就會碎掉。解決不要手動(dòng)設(shè)置resp.encoding讓requests按響應(yīng)頭自動(dòng)判斷如果自動(dòng)判斷還亂碼再強(qiáng)制resp.encoding utf-8。這個(gè)坑的隱蔽之處在于它只在特定接口出現(xiàn)基礎(chǔ)信息腳本正常不代表行情腳本也正常。5.3 現(xiàn)象main.py啟動(dòng)后頁面白屏控制臺報(bào)ECharts未定義頁面能打開HTML但圖表區(qū)域一片空白檢查控制臺發(fā)現(xiàn)echarts is not defined。原因基本指向echarts.min.js沒有加載成功要么是路徑寫成CDN但當(dāng)前環(huán)境不能訪問外網(wǎng)要么是本地路徑層級不對。解決確認(rèn)echarts.min.js的實(shí)際位置把script標(biāo)簽的src改成相對路徑或Flask的url_for正確寫法。改完強(qiáng)制刷新瀏覽器CtrlF5避免緩存干擾。從那以后我再?zèng)]因?yàn)镴S庫路徑白屏超過五分鐘。5.4 現(xiàn)象第二次運(yùn)行main.py圖表數(shù)據(jù)還是上一次的這是myDict.py的緩存特性導(dǎo)致的典型誤用。第一次跑完整個(gè)市場數(shù)據(jù)被寫進(jìn)內(nèi)存字典第二次運(yùn)行入口腳本時(shí)命中了緩存直接跳過重新爬取。數(shù)據(jù)源沒變還好但如果過了幾天再跑緩存里的舊數(shù)據(jù)會誤導(dǎo)分析。解決查myDict.py里緩存的過期機(jī)制。如果有expire參數(shù)在main.py或爬蟲腳本里把它設(shè)成合理值如果沒有過期機(jī)制在入口腳本加一個(gè)--fresh參數(shù)運(yùn)行時(shí)強(qiáng)制清空緩存。畢設(shè)演示前一天跑數(shù)據(jù)時(shí)一定先清緩存再拉新數(shù)據(jù)否則圖上日期停留在昨天。5.5 現(xiàn)象xpath取不到數(shù)據(jù)解析結(jié)果為空列表stock_basic_scrapy.py之前好好的過段時(shí)間再跑xpath提取結(jié)果變成空。爬蟲腳本最怕的就是頁面結(jié)構(gòu)調(diào)整表格列順序一變./td[1]/text()就指向了錯(cuò)誤內(nèi)容。解決先用瀏覽器開發(fā)者工具重新檢查當(dāng)前頁面結(jié)構(gòu)確認(rèn)列順序和class名。如果數(shù)據(jù)是通過JavaScript異步加載的那requests拿到的靜態(tài)源碼里根本沒有表格節(jié)點(diǎn)需要用無頭瀏覽器或直接改找數(shù)據(jù)接口。這個(gè)判斷很重要先分清是頁面變了還是數(shù)據(jù)是動(dòng)態(tài)渲染的再?zèng)Q定改xpath還是換數(shù)據(jù)源。6. 改造與驗(yàn)證讓這套“高分畢業(yè)設(shè)計(jì)”真正變成你的項(xiàng)目拿到資源后最忌諱的是原封不動(dòng)交上去。畢設(shè)答辯和課程作業(yè)都會查重、看工作量所以至少要完成三件事驗(yàn)證它能跑、改動(dòng)其中一層、補(bǔ)充自己的說明。先說我驗(yàn)證項(xiàng)目的固定流程# 1. 驗(yàn)證基礎(chǔ)信息爬蟲輸出條數(shù)要大于100 python data_scrapy/stock_basic_scrapy.py | wc -l # 2. 驗(yàn)證歷史行情爬蟲重點(diǎn)看單只股票的日期范圍 python data_scrapy/history_stock_quotes_scrapy.py --code 600000 # 3. 驗(yàn)證可視化啟動(dòng)后打開頁面確認(rèn)圖表真實(shí)渲染 python main.py驗(yàn)證完成后我建議改造方向有三個(gè)第一把數(shù)據(jù)落成SQLite加一個(gè)簡單的存儲層這樣就不用每次啟動(dòng)都重爬第二把數(shù)據(jù)源從現(xiàn)有接口換成Tushare或akshare替換stock_basic_scrapy.py里的請求邏輯即可rightview.py和template.html完全不用動(dòng)第三把模板擴(kuò)展成可視化大屏風(fēng)格利用ECharts的多圖表網(wǎng)格能力把走勢、成交量、漲跌分布放在同一屏。這部分是這個(gè)項(xiàng)目最有價(jià)值的地方分層設(shè)計(jì)決定了你改一層不影響其他層。爬蟲換成新數(shù)據(jù)源輸出結(jié)構(gòu)保持代碼、名稱、日期、收盤價(jià)、成交量這些字段可視化層就能原樣工作。我當(dāng)時(shí)為了驗(yàn)證這個(gè)說法把兩個(gè)爬蟲腳本都換了數(shù)據(jù)源只改了請求地址和字段映射圖表一次渲染成功。最后說一個(gè)我自己的習(xí)慣每次接到這類畢設(shè)資源我都會先建一個(gè)干凈的Python虛擬環(huán)境從零按requirements.txt裝依賴跑通后再動(dòng)代碼。這個(gè)動(dòng)作能看清這套源碼真正的運(yùn)行條件也方便我寫自己的畢設(shè)記錄。這幾步走完這套Python股票數(shù)據(jù)爬蟲分析可視化框架才算真的屬于你了而不是僅僅存在于下載文件夾里。希望這份拆解幫到你。本文還有配套的精品資源點(diǎn)擊獲取