news 2026/10/26 8:23:18

Python爬虫实战:南京二手房数据采集与可视化毕设全流程

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Python爬虫实战:南京二手房数据采集与可视化毕设全流程

简介:这份资源是面向计算机相关专业学生的南京二手房数据采集与可视化分析毕业设计完整项目,适合正在做大作业、课程设计或期末项目的学习者,也适合需要项目实战练习的初学者。项目经导师指导并获评审99分,代码完整可运行,小白也能按资料自行搭建。压缩包共156个文件,约39.99MB,包含18个Python脚本负责数据采集与清洗、18个CSV数据文件(含原始与清洗后的多版本二手房数据)、65张PNG图表与2张JPG图片用于可视化结果展示、15个HTML页面与11个JavaScript文件构成前端展示界面,另有TXT说明、INI配置、PPT答辩资料等辅助内容。目前已有81人学习下载。读者可获得从数据抓取、清洗到图表呈现的完整实现思路,配套数据库与答辩材料,便于快速理解项目结构、复现运行效果并用于毕业设计或课程设计参考。

1. 南京二手房数据采集与可视化:一套毕设从选题到答辩的完整落地路径

南京二手房市场有个很典型的特点:链家、贝壳、安居客上的挂牌数据更新频繁,但真正能拿来做分析的干净数据集,几乎没人免费给你。计算机毕设选题里,「基于 Python 的南京二手房数据采集及可视化分析」之所以年年有人做,核心原因就是它把爬虫、数据库、数据分析、可视化四条主线串成了一条完整链路,工作量够、技术点全、答辩时也讲得清楚。但真正动手你会发现,翻车点不在写代码,而在反爬策略、字段清洗、数据库表结构设计这三处。这篇笔记按我实际做过的路径拆一遍:从环境搭到采集脚本,从 MySQL 建表到可视化出图,再到答辩时老师最爱追问的几个点。适合正在做计算机毕设、需要一套能跑通、能讲明白、能写进论文的完整方案的人。

2. 环境准备与数据源选型:为什么南京二手房适合用链家做入口

2.1 Python 环境与依赖库的版本选择

做数据采集类毕设,环境是第一道坎。我一般推荐 Python 3.8 到 3.10 之间,太新的版本某些库兼容性反而会出问题。安装方式上,直接用 python 官网下载安装包最稳,别图省事用系统自带的。装完之后第一件事是配虚拟环境,避免把全局环境搞乱。

# 创建虚拟环境,名字叫 nj_house python -m venv nj_house # Windows 激活 nj_house\Scripts\activate # macOS / Linux 激活 source nj_house/bin/activate # 一次性装齐核心依赖 pip install requests==2.31.0 beautifulsoup4==4.12.2 lxml==4.9.3 pandas==2.0.3 pymysql==1.1.0 sqlalchemy==2.0.19 matplotlib==3.7.2 pyecharts==2.0.3

这里每个库都有明确分工:requests负责发请求,beautifulsoup4加lxml做 HTML 解析,pandas做数据清洗和统计,pymysql加sqlalchemy负责入库,matplotlib和pyecharts分别做静态图和交互图。版本号不是随便写的,pandas 2.x和sqlalchemy 2.x搭配pymysql 1.1是目前最不容易出兼容问题的组合。如果你在 python 安装 numpy 库的方法上卡住,其实 pandas 装好之后 numpy 会自动带上,不用单独折腾。

提示:虚拟环境激活后,命令行前面会出现(nj_house)前缀,看到这个才说明环境生效了。

2.2 数据源对比:链家、贝壳、安居客哪个更适合毕设

选数据源这件事,直接决定你后面采集顺不顺利。我把三个主流平台的实际表现列一下:

平台反爬强度字段完整度分页规律适合毕设程度
链家中等高(含单价、朝向、楼层)清晰,pg参数推荐
贝壳较高高需处理加密参数一般
安居客高中参数混淆不推荐

链家的二手房列表页 URL 结构是https://nj.lianjia.com/ershoufang/pg{页码}/,分页规律非常干净,翻页只需要改pg后面的数字。贝壳虽然数据也全,但它的请求参数里带了加密签名,对毕设来说调试成本太高。安居客的字段缺失比较严重,很多房源不显示单价,后期清洗会很痛苦。所以我的建议是:主采集用链家,如果要做数据量对比,可以少量补充贝壳的数据作为交叉验证。

2.3 目标字段的确定与表结构预设计

在写采集代码之前,先把你要抓的字段定下来,这直接决定数据库表怎么建。南京二手房分析常用的字段有这些:

  • 小区名称(community)
  • 户型(layout,如 3室2厅)
  • 面积(area,单位平米)
  • 朝向(orientation)
  • 楼层(floor)
  • 装修情况(decoration)
  • 挂牌总价(total_price,单位万)
  • 单价(unit_price,单位元/平米)
  • 所在区域(district,如鼓楼、江宁)
  • 数据采集时间(crawl_time)

字段定好之后,数据库表结构基本就出来了。这里有个血泪经验:total_price和unit_price一定要用DECIMAL类型而不是FLOAT,否则后期做价格统计时会出现299.99999这种玄学数字,答辩时被老师看到很尴尬。

3. 采集脚本编写:从列表页到详情页的完整抓取逻辑

3.1 列表页请求与房源链接提取

采集的第一步是拿到列表页里所有房源的详情页链接。链家的列表页结构比较规整,每个房源卡片都在class="clear LOGVIEWDATA LOGVIEW"的li标签里,标题链接在class="title"的a标签中。

import requests from bs4 import BeautifulSoup import time import random # 请求头,User-Agent 必须带,否则链家直接返回 403 HEADERS = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) " "AppleWebKit/537.36 (KHTML, like Gecko) " "Chrome/120.0.0.0 Safari/537.36", "Accept-Language": "zh-CN,zh;q=0.9", } def get_detail_urls(page): """抓取指定页码的列表页,返回该页所有房源详情页链接""" url = f"https://nj.lianjia.com/ershoufang/pg{page}/" resp = requests.get(url, headers=HEADERS, timeout=10) if resp.status_code != 200: print(f"第 {page} 页请求失败,状态码:{resp.status_code}") return [] soup = BeautifulSoup(resp.text, "lxml") # 每个房源卡片的标题链接 links = soup.select("ul.sellListContent li.clear a.title") detail_urls = [link.get("href") for link in links if link.get("href")] print(f"第 {page} 页共提取到 {len(detail_urls)} 条房源链接") return detail_urls if __name__ == "__main__": all_urls = [] for pg in range(1, 6): # 先跑前 5 页测试 urls = get_detail_urls(pg) all_urls.extend(urls) # 随机延时 2 到 5 秒,模拟人工浏览节奏 time.sleep(random.uniform(2, 5)) print(f"合计获取 {len(all_urls)} 条详情页链接")

这段代码的逻辑很直白:构造列表页 URL,发请求,用 BeautifulSoup 解析 HTML,通过 CSS 选择器定位到每个房源的标题链接。time.sleep(random.uniform(2, 5))这行是关键,固定间隔的请求很容易被识别为爬虫,随机延时能大幅降低被封的概率。timeout=10是防止某个请求卡死导致整个脚本挂起。

注意:链家的列表页一页默认 30 条房源,如果你要采集 1000 条数据,大概需要翻 34 页。别一次性跑太多,建议分批跑,中间间隔几分钟。

3.2 详情页字段解析与数据清洗

拿到详情页链接之后,逐个请求并解析字段。详情页的结构比列表页复杂一些,但字段位置相对固定。

import re def parse_detail(url): """解析单个房源详情页,返回结构化字典""" resp = requests.get(url, headers=HEADERS, timeout=10) if resp.status_code != 200: return None soup = BeautifulSoup(resp.text, "lxml") data = {} try: # 总价,页面上的文本类似 "320万" total_price_text = soup.select_one("span.total").get_text(strip=True) data["total_price"] = float(re.sub(r"[^\d.]", "", total_price_text)) # 单价,文本类似 "35,678元/平米" unit_price_text = soup.select_one("span.unitPriceValue").get_text(strip=True) data["unit_price"] = float(re.sub(r"[^\d.]", "", unit_price_text)) # 小区名称 data["community"] = soup.select_one("a.info").get_text(strip=True) # 区域信息,通常在 breadcrumb 里 area_info = soup.select("div.areaName span.info a") data["district"] = area_info[0].get_text(strip=True) if area_info else "未知" # 户型、面积、朝向等基础属性 base_info = soup.select("div.base div.content ul li") for item in base_info: text = item.get_text(strip=True) if "室" in text and "厅" in text: data["layout"] = text elif "平米" in text: data["area"] = float(re.sub(r"[^\d.]", "", text)) elif "朝向" in text or text in ["东", "南", "西", "北", "南北"]: data["orientation"] = text elif "楼层" in text or "楼" in text: data["floor"] = text elif "装修" in text or "精装" in text or "简装" in text: data["decoration"] = text except Exception as e: print(f"解析失败:{url},原因:{e}") return None data["source_url"] = url return data

解析逻辑的核心是「定位 + 清洗」两步走。定位靠 CSS 选择器,清洗靠正则表达式。比如总价字段,页面上显示的是320万,你需要用re.sub(r"[^\d.]", "", text)把非数字字符全部去掉,再转成float。这里有个容易翻车的地方:有些房源的总价是320.5万,如果你的正则写成了[^\d],小数点会被吃掉,变成3205,数据就完全错了。所以正则里一定要保留.。

3.3 反爬应对:请求头、延时与异常重试

链家的反爬不算特别狠,但如果你不注意这几点,跑不了几十条就会被封 IP。

第一,User-Agent必须带,而且最好准备几个轮换。第二,请求间隔不能太短,我一般用random.uniform(2, 5),偶尔穿插random.uniform(5, 8)的长延时。第三,遇到403或429状态码时,不要硬刚,先sleep十几秒再重试。

def safe_request(url, max_retry=3): """带重试机制的请求函数""" for attempt in range(max_retry): try: resp = requests.get(url, headers=HEADERS, timeout=10) if resp.status_code == 200: return resp elif resp.status_code in (403, 429): wait = (attempt + 1) * 10 print(f"被限流,等待 {wait} 秒后重试...") time.sleep(wait) else: print(f"状态码 {resp.status_code},跳过") return None except requests.RequestException as e: print(f"请求异常:{e},第 {attempt + 1} 次重试") time.sleep(5) return None

这个重试函数的逻辑是:正常返回就返回,遇到限流就递增等待时间,遇到其他异常就重试。max_retry=3是经验值,超过 3 次还失败的基本可以放弃了,继续重试只会浪费时间。

4. 数据库设计与入库:MySQL 表结构与批量插入

4.1 建库建表 SQL 与字段类型选择

数据库这块,毕设里用 MySQL 最常见,也最容易讲清楚。建表的时候有几个字段类型的选择需要特别注意。

CREATE DATABASE IF NOT EXISTS nj_house DEFAULT CHARSET utf8mb4 COLLATE utf8mb4_general_ci; USE nj_house; CREATE TABLE IF NOT EXISTS house_info ( id INT AUTO_INCREMENT PRIMARY KEY, community VARCHAR(100) NOT NULL COMMENT '小区名称', layout VARCHAR(50) COMMENT '户型', area DECIMAL(8,2) COMMENT '面积(平米)', orientation VARCHAR(20) COMMENT '朝向', floor VARCHAR(50) COMMENT '楼层', decoration VARCHAR(30) COMMENT '装修情况', total_price DECIMAL(10,2) COMMENT '总价(万)', unit_price DECIMAL(10,2) COMMENT '单价(元/平米)', district VARCHAR(50) COMMENT '所在区域', source_url VARCHAR(255) COMMENT '数据来源链接', crawl_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '采集时间', INDEX idx_district (district), INDEX idx_unit_price (unit_price) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='南京二手房信息表';

字段类型的选择理由:area用DECIMAL(8,2)是因为面积最多到 999999.99 平米,两位小数够用;total_price和unit_price用DECIMAL(10,2)是为了避免浮点误差;district和unit_price上建索引,是因为后期做区域均价统计和价格区间筛选时会频繁用到这两个字段。字符集用utf8mb4而不是utf8,是因为小区名称里偶尔会出现生僻字或特殊符号,utf8mb4兼容性更好。

4.2 Python 批量入库脚本与去重策略

入库的时候,最怕的就是重复数据。同一个房源可能因为你多次运行脚本而被插入多次。解决办法是在入库前先查一下source_url是否已存在。

import pymysql from sqlalchemy import create_engine import pandas as pd # 数据库连接配置 DB_CONFIG = { "host": "localhost", "port": 3306, "user": "root", "password": "your_password", "database": "nj_house", "charset": "utf8mb4", } def save_to_db(house_list): """将房源列表批量写入数据库,自动跳过已存在的记录""" if not house_list: print("没有数据需要入库") return conn = pymysql.connect(**DB_CONFIG) cursor = conn.cursor() insert_sql = """ INSERT INTO house_info (community, layout, area, orientation, floor, decoration, total_price, unit_price, district, source_url) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s) """ success_count = 0 skip_count = 0 for house in house_list: # 先检查 source_url 是否已存在 cursor.execute("SELECT id FROM house_info WHERE source_url = %s", (house.get("source_url"),)) if cursor.fetchone(): skip_count += 1 continue try: cursor.execute(insert_sql, ( house.get("community"), house.get("layout"), house.get("area"), house.get("orientation"), house.get("floor"), house.get("decoration"), house.get("total_price"), house.get("unit_price"), house.get("district"), house.get("source_url"), )) success_count += 1 except Exception as e: print(f"插入失败:{house.get('source_url')},原因:{e}") conn.commit() cursor.close() conn.close() print(f"入库完成:成功 {success_count} 条,跳过重复 {skip_count} 条")

这段代码的核心逻辑是「先查后插」。虽然逐条查询效率不算最高,但对毕设级别的数据量(几千条)来说完全够用,而且逻辑清晰,答辩时好讲。如果你追求效率,可以把source_url设成UNIQUE索引,然后用INSERT IGNORE或ON DUPLICATE KEY UPDATE,但那样代码可读性会下降。

提示:password字段记得换成你自己的 MySQL 密码,别直接复制粘贴就跑了。

4.3 数据校验:入库后怎么确认没丢字段

数据入库之后,别急着做分析,先跑几条校验 SQL 确认数据质量。

-- 总记录数 SELECT COUNT(*) AS total FROM house_info; -- 各区域房源数量分布 SELECT district, COUNT(*) AS cnt FROM house_info GROUP BY district ORDER BY cnt DESC; -- 检查是否有空值 SELECT COUNT(*) AS null_area FROM house_info WHERE area IS NULL; SELECT COUNT(*) AS null_price FROM house_info WHERE unit_price IS NULL; -- 单价异常值检查(低于 5000 或高于 100000 的可能是脏数据) SELECT * FROM house_info WHERE unit_price < 5000 OR unit_price > 100000;

这几条 SQL 分别检查总量、区域分布、空值和异常值。如果null_area或null_price的数量超过总数的 5%,说明解析逻辑有问题,需要回去检查详情页的字段定位。异常值检查也很重要,南京二手房单价正常范围大概在 1 万到 8 万之间,超出这个范围的要么是别墅,要么是数据错误。

5. 可视化分析与避坑指南:出图逻辑和那些让人翻车的细节

5.1 区域均价柱状图与价格分布直方图

可视化是毕设答辩时最直观的部分。我一般用matplotlib做静态图放进论文,用pyecharts做交互图用于答辩演示。

import matplotlib.pyplot as plt import pandas as pd from sqlalchemy import create_engine # 设置中文字体,否则图表上的中文会变成方块 plt.rcParams["font.sans-serif"] = ["SimHei"] plt.rcParams["axes.unicode_minus"] = False engine = create_engine("mysql+pymysql://root:your_password@localhost:3306/nj_house?charset=utf8mb4") # 各区域均价 df_district = pd.read_sql( "SELECT district, AVG(unit_price) AS avg_price, COUNT(*) AS cnt " "FROM house_info GROUP BY district HAVING cnt >= 10 ORDER BY avg_price DESC", engine ) fig, ax = plt.subplots(figsize=(12, 6)) bars = ax.bar(df_district["district"], df_district["avg_price"], color="#4C72B0") ax.set_xlabel("区域") ax.set_ylabel("均价(元/平米)") ax.set_title("南京各区域二手房均价对比") ax.tick_params(axis="x", rotation=45) # 在柱子上标注数值 for bar, price in zip(bars, df_district["avg_price"]): ax.text(bar.get_x() + bar.get_width() / 2, bar.get_height() + 500, f"{price:.0f}", ha="center", va="bottom", fontsize=9) plt.tight_layout() plt.savefig("district_avg_price.png", dpi=150) plt.show()

这段代码做了三件事:从数据库读取各区域均价,用柱状图展示,在每根柱子上标注具体数值。HAVING cnt >= 10是为了过滤掉样本量太少的区域,避免某个区域只有两三条数据导致均价失真。plt.rcParams["font.sans-serif"] = ["SimHei"]这行必须加,否则中文会显示成方块,这是新手最常翻的车之一。

5.2 面积与总价的散点图及户型分布饼图

散点图用来观察面积和总价的相关性,饼图用来展示户型分布。

# 面积 vs 总价散点图 df_scatter = pd.read_sql( "SELECT area, total_price, district FROM house_info " "WHERE area IS NOT NULL AND total_price IS NOT NULL AND area < 500", engine ) fig, ax = plt.subplots(figsize=(10, 6)) scatter = ax.scatter(df_scatter["area"], df_scatter["total_price"], c=df_scatter["total_price"], cmap="viridis", alpha=0.6, s=20) ax.set_xlabel("面积(平米)") ax.set_ylabel("总价(万)") ax.set_title("南京二手房面积与总价关系") plt.colorbar(scatter, label="总价(万)") plt.tight_layout() plt.savefig("area_price_scatter.png", dpi=150) plt.show() # 户型分布饼图 df_layout = pd.read_sql( "SELECT layout, COUNT(*) AS cnt FROM house_info " "WHERE layout IS NOT NULL GROUP BY layout ORDER BY cnt DESC LIMIT 8", engine ) fig, ax = plt.subplots(figsize=(8, 8)) ax.pie(df_layout["cnt"], labels=df_layout["layout"], autopct="%1.1f%%", startangle=90, textprops={"fontsize": 10}) ax.set_title("南京二手房户型分布") plt.tight_layout() plt.savefig("layout_pie.png", dpi=150) plt.show()

散点图里area < 500这个过滤条件是为了排除极端值,有些别墅面积上千平米,会把整个图的比例尺拉得没法看。饼图只取前 8 个户型,是因为户型种类太多,全画上去标签会重叠。

5.3 避坑清单:采集与分析中最容易翻车的 5 个点

现象一:脚本跑了几页之后全部返回 403。原因:请求频率太高,被链家识别为爬虫。 解决:把time.sleep的间隔调大到 3 到 8 秒,并且每跑 5 页休息 30 秒。如果已经被封,换个网络环境或者等几个小时再跑。

现象二:入库后发现area字段全是 NULL。原因:详情页的字段定位选择器写错了,或者页面结构和你写代码时不一样。 解决:打开一个详情页,按 F12 检查面积字段的实际 HTML 结构,把选择器改对。链家偶尔会调整页面结构,所以采集前先手动验证一两个页面。

现象三:matplotlib 图表上的中文显示成方块。原因:没有设置中文字体。 解决:加上plt.rcParams["font.sans-serif"] = ["SimHei"]和plt.rcParams["axes.unicode_minus"] = False。如果系统没有 SimHei 字体,可以换成Microsoft YaHei或PingFang SC。

现象四:数据库里的total_price出现了299.99999这种数字。原因:字段类型用了FLOAT而不是DECIMAL。 解决:建表时就用DECIMAL(10,2),如果已经建好了,用ALTER TABLE house_info MODIFY total_price DECIMAL(10,2);改过来。

现象五:重复运行脚本导致数据库里有大量重复数据。原因:没有做去重逻辑。 解决:入库前先按source_url查重,或者给source_url加UNIQUE索引,用INSERT IGNORE插入。

6. 答辩加分项:数据量扩充、交互式大屏与论文图表规范

答辩的时候,老师最常问的几个问题是:「你采集了多少条数据?」「数据怎么保证真实性?」「你的分析和结论有什么实际意义?」这三个问题,其实都可以提前准备好答案。

先说数据量。我建议至少采集 2000 条以上,覆盖南京 8 个以上的区。如果时间充裕,可以分批次采集,比如今天跑 500 条,明天跑 500 条,这样既能避免被封,又能积累足够的数据量。采集时间跨度也可以写进论文,比如「数据采集时间为 2024 年 3 月至 4 月」,显得更严谨。

再说交互式大屏。pyecharts可以生成 HTML 文件,答辩时直接用浏览器打开,比静态图更有冲击力。比如用Bar做区域均价、用Pie做户型分布、用Map做区域热力图,三个图拼在一个 HTML 页面里,就是一个简易的数据大屏。

from pyecharts.charts import Bar, Pie, Page from pyecharts import options as opts # 区域均价柱状图 bar = ( Bar() .add_xaxis(df_district["district"].tolist()) .add_yaxis("均价(元/平米)", df_district["avg_price"].round(0).tolist()) .set_global_opts( title_opts=opts.TitleOpts(title="南京各区域二手房均价"), xaxis_opts=opts.AxisOpts(name="区域", axislabel_opts=opts.LabelOpts(rotate=45)), yaxis_opts=opts.AxisOpts(name="均价"), ) ) # 户型分布饼图 pie = ( Pie() .add("", [list(z) for z in zip(df_layout["layout"], df_layout["cnt"])]) .set_global_opts(title_opts=opts.TitleOpts(title="户型分布")) .set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {d}%")) ) # 组合成一个页面 page = Page(layout=Page.DraggablePageLayout) page.add(bar, pie) page.render("nj_house_dashboard.html")

这段代码生成的nj_house_dashboard.html可以直接用浏览器打开,图表支持拖拽和缩放,答辩演示效果比静态图好很多。Page.DraggablePageLayout允许你在页面上自由拖动图表位置,调整到满意的布局后保存即可。

最后说论文图表规范。毕设论文里的图表有几个硬性要求:图要有编号和图题,表要有编号和表头,坐标轴要有单位,数据来源要标注。我一般会在论文里写「数据来源:链家南京二手房频道,采集时间 2024 年 3 月」,这样老师一看就知道你的数据不是编的。另外,论文里的图表不要直接截图粘贴,尽量用代码生成的高分辨率图片,dpi=150或dpi=300都可以,打印出来清晰度够。

做这个毕设最大的教训是:别等到最后一周才开始跑数据。采集脚本调试、数据清洗、可视化出图,每一步都可能卡住。我当时的习惯是每天跑一批数据,跑完就检查入库质量,有问题当天解决。这样到答辩前,你手里有干净的数据、能跑的代码、好看的图表,心里就不慌。希望帮到你。

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

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/26 8:23:18

claude-mem 详解:给 Claude 终端装上持久化记忆

用过 Claude 官方终端的人&#xff0c;十有八九都会遇到同一个问题&#xff1a;它记不住你。今天开个新会话&#xff0c;昨天交代过的偏好、密钥约定、项目背景全忘光了&#xff0c;你又得把同样的背景信息重新敲一遍。这种“金鱼记忆”在写代码、跑脚本这种高频重复对话场景里…

作者头像 李华
网站建设 2026/10/26 8:23:09

AI Agent越聊越笨?上下文工程5个关键取舍与实践

先把话说在前面&#xff1a;我自己踩过一个特别典型的坑。半年前我做了一个带读网页、查资料、自动写总结这类工具的 Agent&#xff0c;丢进长时间会话里跑&#xff0c;前 10 轮表现惊为天人&#xff0c;说什么都能接住。可跑到第 25 轮左右&#xff0c;它开始记错用户偏好&…

作者头像 李华
网站建设 2026/10/26 8:23:08

t3code全栈脚手架:端到端类型安全的Next.js + tRPC实践指南

前两天把一个攒了很久的 side project 用 t3code 重新搭了一版&#xff0c;整个过程比我预想中顺不少。顺手把 t3code 的使用心得和实现细节整理成文&#xff0c;给打算从零开始做全栈应用、又不想在脚手架配置上浪费太多时间的同学做个参考。t3code 是一个基于 T3 技术栈的全栈…

作者头像 李华
网站建设 2026/10/26 8:23:07

智能体系统SkillMastery架构设计与产业化实践

1. SkillMastery系统架构解析SkillMastery作为一套面向全领域的智能体系统&#xff0c;其核心架构采用了分层模块化设计。我在实际部署中发现&#xff0c;这种架构能够有效平衡灵活性与性能需求。系统主要分为以下四个层级&#xff1a;1.1 基础能力层基础能力层负责处理原始数据…

作者头像 李华
网站建设 2026/10/26 8:22:26

DeepSeek Harness插件开发:本地AI工作台的技能协议与实战

1. DeepSeek Harness 是什么&#xff0c;它和你熟悉的 IDE 插件根本不是一回事很多人第一次看到“DeepSeek Harness 插件开发”这个标题&#xff0c;下意识就联想到 IntelliJ IDEA 里点几下就能装上的代码补全插件&#xff0c;或者 Chrome 浏览器右上角那个带小图标、点开就能翻…

作者头像 李华