资讯动态

Python项目实战:从抓取到提速的完整数据链路开发指南

发布时间:2026/10/27 5:57:27 来源:尧图企业网站定制
我的《Python 人工智能编程从零到精通》系列写到第十期正好是第一个分水岭。前面九期我们一直在跟语法、数据结构、函数、文件操作这些东西打交道说白了你已经能把代码写在命令行里跑起来但离“做点自己的东西”还有一层窗户纸。这一期我不打算再讲单个知识点而是带你把已经学会的东西串成一个完整的小项目抓数据、清洗、分析、画图、提速最后再加一点算法思维训练。无论你是跟着课程一路学过来的还是半路插进来想验证自己能不能动手这一期应该都能给你一个比较确定的答案学了这么久你其实已经能干活了。1. 为什么第十期我决定换一种教法用一个完整小项目串起前十期1.1 从语法点到工程习惯的跨越前九期我们学到的内容本质上都是“零件”变量、类型、函数、文件、正则、进程、异常处理。零件学过不等于会组装。很多人学到这个阶段最典型的症状是单看每个语法都能看懂但一打开空文件就不知道第一行该写什么。这个问题的根源不是知识不够而是缺少一个“完整的任务”来倒逼你做选择。做项目补东西和从头背语法效率完全不一样。我见过太多人把 Python 教程反复刷了三遍第四遍还是停留在“看懂”层面。原因很简单没有真实场景你的注意力就不知道往哪里放。一旦有了项目目标你会发现你查文档的次数会自然变多而且每一笔查询都带着明确问题问题导向的学习基本不会走神。所以我给第十期设计的目标不是“多学三十个新函数”而是“把一个真实的小项目从零写到能跑”。这期间你会自然遇到环境问题、依赖问题、编码问题、速度问题这些恰恰是正常项目里占比最大的部分。教科书不讲这些但现实工作中你每天都要面对。1.2 这个项目到底做了什么适合谁这一期的主角是一个“排行榜数据分析小工具”。思路很简单从一个公开接口抓一批带标题和数值的条目清洗成结构化数据做排序、筛选、去重画一张趋势图然后用多线程和协程让抓取速度提升几倍。整个过程不依赖任何重型框架只用 requests、pandas、matplotlib、queue 和 asyncio全都是 Python 生态里的家常便饭。这个选题我考虑了挺久。首先它足够简单不需要登录、不需要分布式、不需要数据库新手能撑住其次它的每一个环节都对应一类高频场景拿数据、洗数据、看数据、给数据提效往后你去做爬虫、做数据分析、做接口自动化、甚至做机器学习的数据预处理你都会再次遇到长得一模一样的问题。适合谁适合已经学完基础语法、想第一次完成“从零到完整运行”的新手也适合学了很久始终停留在题目练习、没真正跑通过一条完整链路的半新手。如果你是零基础第一期到第九期没看那这期你会有一部分名词看不懂但我的建议是你先跑起来代码然后再回去补概念效果反而更好。2. 开工前的环境自检少踩一半安装坑2.1 版本与解释器先确认你到底在用哪个 Python我知道一说到环境很多人就头疼但这块真的值得花一顿饭的功夫理顺。项目写不出来十个有六个卡在环境上装了个库却 import 不到、装了三个 Python 互相打架、pip install 报错报得人想砸电脑。这些基本都是“不知道自己到底在用哪个解释器”导致的。先做一个最简单的确认。打开终端依次运行python --version pip --version where python # Windows which python # Linux / macOS重点看 where 或 which 的结果。如果你发现系统里同时存在 C:\Users\你的名字\AppData\Local\Programs\Python、Anaconda 目录、还有 Microsoft Store 安装的 Python那恭喜你以后你每次装包都要小心了。pip 装到 A 解释器代码却用 B 解释器运行这种错位是新手安装失败的顶级原因。版本选择上我不推荐追新也不建议守旧。Python 3.8 到 3.11 是目前最稳的区间一方面主流教程和第三方库的文档都覆盖了这个范围另一方面像 pandas、numpy、matplotlib 这些大库的 Wheel 包在这几个版本上都发布得很及时。Linux 系统自带的 Python 版本往往偏旧尽量不要直接用系统版做项目更稳妥的是用 pyenv 或者直接官网下载安装包装完再手动配环境变量。Windows 上如果安装过程报 0x80070643通常是系统安装服务或缓存冲突最简单的处理是重启后关掉杀毒软件再装或者改用官方安装包里的 “Install launcher for all users” 选项。2.2 虚拟环境与 pip 换源让依赖安装不再玄学装 Python 本身只是第一步。真正让依赖管理变清爽的是虚拟环境。你可以把虚拟环境理解成一个“只属于当前项目的独立仓库”在这个环境里装什么库都不会污染系统里其他的 Python。尤其是你同时做好几个项目的时候A 项目要 pandas 1.5B 项目要 pandas 2.0没有虚拟环境就只能打架。创建虚拟环境其实就三条命令python -m venv .venv # Windows .venv\Scripts\activate # Linux / macOS source .venv/bin/activate激活之后终端提示符前面会出现 (.venv) 字样这时候你再用 pip 装包所有东西都只会进这个环境。很多网上教程喜欢让你直接 pip install但对新手我强烈建议养成“先激活虚拟环境再装包”的习惯它能省掉后续大量版本错乱问题。另外在国内网络环境下pip 默认源速度经常慢得离谱甚至直接超时挂掉。你完全没必要硬扛直接把 pip 源换成国内镜像就能解决python -m pip install --upgrade pip -i https://pypi.tuna.tsinghua.edu.cn/simple pip install requests pandas matplotlib -i https://pypi.tuna.tsinghua.edu.cn/simple镜像源的“为什么有效”特别简单它把 PyPI 的包内容缓存到了国内服务器你下载时候走的是国内链路速度自然快。这不是玄学是网络链路优化。你以后装 numpy、cv2 这些体积大的包遇到卡顿首先想到换源而不是反复重试默认源。2.3 VSCode 里的最后一步解释器选择不是玄学编辑器是很多人忽略的坑。你在终端里跑得好好的代码到 VSCode 里一运行就提示 ModuleNotFoundError原因几乎全是解释器选错了。VSCode 默认会用你系统里最近安装的那个 Python不一定是你的虚拟环境。解决办法两步走。第一步在扩展市场安装 Python 官方扩展第二步按 CtrlShiftP 打开命令面板输入 “Python: Select Interpreter”在弹出的列表里选你刚才创建的 .venv 环境。选完之后VSCode 右上角的运行按钮、底部状态栏、以及新建终端都会默认使用这个解释器。这里也顺便解决一个高频问题“python 连接 cmd 到底怎么连”。我经常看到有人问怎么在 Python 外面连一个命令行窗口其实你想多了。你打开终端敲 python跳出来的那个提示符就是 Python 解释器它本身就是跑在 cmd 或 PowerShell 里的一个进程不存在“连接”这个额外操作。你在编辑器里配置好解释器之后按终端按钮弹出的终端路径指向虚拟环境那就算“连上了”。3. 第一个完整数据管道从抓取到结构化数据3.1 requests 拿数据先看响应再谈解析项目的第一环是抓数据。我先声明一句爬虫不是为所欲为抓取前先确认目标是否有公开 API、是否有 robots 限制、是否允许采集这是职业底线问题。我们这里用的是公开接口、公开数据讲的是通用思路剩下的请你对自己抓的目标负责。requests 库的使用其实非常直接一个 get 请求就够了import requests headers { User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 Chrome/120.0 Safari/537.36 } url https://api.example.com/items # 换成你有权限访问的公开接口 resp requests.get(url, headersheaders, timeout10) resp.raise_for_status() # 状态码不是 2xx 时主动抛异常 data resp.json() print(type(data)) print(data.keys() if isinstance(data, dict) else len(data))为什么必须加 headers很多接口服务端会校验 User-Agent如果你不发这个头对方可能直接返回 403 或一段 HTML 错误页。而加 timeout 是为了避免遇到慢接口时你的程序无限期挂死这个参数看起来不起眼实际项目里是救命稻草。写完请求之后先不要急着写解析先打印一下 data 的结构。你看一眼它是字典还是列表、嵌套层级是什么样再决定下一步怎么提取。这是“先看数据再写代码”的工程习惯能省你大量调试时间。3.2 从字典列表到 DataFrame结构化数据的第一步抓回来的 JSON 通常是列表套字典的结构长这样[{title: ..., score: 95, date: ...}, ...]。我们可以先用列表推导把核心字段取出来再交给 pandas 去处理。import pandas as pd rows [ {title: item[title], score: item[score], date: item[date]} for item in data[items] ] df pd.DataFrame(rows) print(df.head()) print(df.dtypes)到这里你就已经完成了一次“非结构化数据到结构化数据”的转换。pandas 的 DataFrame 本质上是一张带列名的表格它比纯 Python 字典列表好在哪好在批量操作你可以一次性对整列做计算、筛选、排序、去重不需要手写 for 循环。这就是热词里“python 结构化数据”的实际含义——用统一的行列模型去组织数据后续一切分析都变得直观。清洗阶段有几个高频操作你都用得着df df.drop_duplicates(subset[title]) # 筛选一样的重复标题 df[score] pd.to_numeric(df[score], errorscoerce) # 类型转换非数值转 NaN df df.dropna(subset[score]) # 去掉缺失值 df df[df[score] 80] # 条件筛选 df df.sort_values(score, ascendingFalse) # 按分数降序这里我想展开讲一下类型转换。接口返回的 score 看起来是数字但很多时候实际上是字符串尤其是从网页或文件读入的数据。字符串做比较排序时是按字典序排的9 会排在 80 前面这就是所有“明明看起来是数字一排序就乱”问题的根源。pd.to_numeric 的作用就是把整列转成真正的数字类型转不了的变成 NaN再配合 dropna 把脏数据剔除后续统计才可靠。3.3 矩阵与数组切片没有想象中那么可怕数据量稍微大一点你就绕不开 numpy。pandas 底层的数据运算就是基于 numpy 的所以理解一点矩阵和数组切片对做数据处理特别有帮助。先看二维数组的创建这是热词“python 构建邻接矩阵”和“python 矩阵0”的经典基础import numpy as np # 创建一个 3 行 4 列的零矩阵 matrix np.zeros((3, 4), dtypeint) print(matrix) # 手动构建一个 4 节点图的邻接矩阵 n 4 adj [[0] * n for _ in range(n)] edges [(0, 1), (1, 2), (2, 3), (3, 0)] for u, v in edges: adj[u][v] 1 adj[v][u] 1 print(adj)这里有一个新手极容易踩的坑如果写 [[0] * n] * n表面看是建了一个 n 行矩阵实际上所有行都指向同一个列表对象改一行所有行一起变。用列表推导式 [[0] * n for _ in range(n)] 才是真正创建了 n 个独立列表。这个坑我当年也踩过调了半天才发现是引用共享的问题。写代码时务必记住列表乘号只适合一维拷贝思想二维矩阵一定要用推导式或 numpy。数组切片是另一个高频点。numpy 数组比列表多了一整套按行列切片的语法arr np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) print(arr[0, :]) # 第一行 print(arr[:, 1]) # 第二列 print(arr[1:, :2]) # 从第二行开始取前两列切片看起来像是语法细节但它决定了你处理表格数据时是否能“指哪打哪”。单纯靠 for 循环去取数据又慢又容易错学会切片之后你会发现很多数据筛选就是一行代码的事。4. 抓取提速串行请求、队列与协程4.1 先用多线程加 Queue 解决“慢”的问题数据管道写通了下一步就是效率问题。假设你的接口每次返回一条数据你需要抓 1000 条串行请求一个个排队每条假设 0.5 秒那就是 500 秒8 分多钟等到天荒地老。这种场景下第一反应应该是把并发加进来。最简单的并发方式是多线程。Python 的多线程在 CPU 密集型任务上有 GIL 锁限制但在网络 IO 这种等待型任务上非常好用因为线程在等待响应时会让出 CPU用并行等待换时间。搭配多线程的经典数据结构就是 Queue。这个队列的最大特点是不堵塞生产者往里放任务消费者从里面取任务两边速度不一致时它自己会协调。对应热词“python 队列 queue 不堵塞”核心价值就在这里。一个干净的线程池版本是这样的import requests from concurrent.futures import ThreadPoolExecutor, as_completed urls [fhttps://api.example.com/items?page{i} for i in range(20)] def fetch_one(url): resp requests.get(url, timeout10) resp.raise_for_status() return resp.json() with ThreadPoolExecutor(max_workers8) as pool: results [] for future in as_completed([pool.submit(fetch_one, u) for u in urls]): results.append(future.result()) print(len(results))ThreadPoolExecutor 比手动创建 Thread 好用得多它自带线程池管理max_workers 控制最大并发数不会无限开线程把你的电脑拖垮。为什么不推荐“线程嵌套线程”因为线程本身是操作系统资源嵌套创建会导致线程数失控调度开销剧增而且排查问题的时候你根本不知道哪个线程是哪个任务创建的。多线程千万别炫技用最标准的线程池就够了。4.2 协程才是网络 IO 的王道线程池能提速但还不是最优解。因为每个线程本身还有占用成本线程一多上下文切换的开销也很可观。更优雅的方式是用协程。协程你可以理解成一个“不进操作系统线程层面的、轻量级任务切换器”。一个线程里可以跑成千上万个协程每个协程阻塞等待网络时事件循环会自动把控制权切换给下一个协程。它和多线程的核心区别是多线程靠操作系统调度协程靠程序内部协作切换代价小得多并发规模大得多。用 asyncio 加 aiohttp 写一个异步抓取import asyncio import aiohttp async def fetch_one(session, url): async with session.get(url, timeout10) as resp: return await resp.json() async def main(): urls [fhttps://api.example.com/items?page{i} for i in range(20)] async with aiohttp.ClientSession() as session: tasks [fetch_one(session, url) for url in urls] results await asyncio.gather(*tasks) print(len(results)) asyncio.run(main())初学协程容易犯一个错写了一大堆 async def结果直接普通调用运行完发现啥也没发生。原因是协程函数调用时只会创建一个协程对象不会真的执行你必须把它交给事件循环去跑也就是 asyncio.run 或 asyncio.gather 这一步。记住协程不 await就是一张写了但没寄出去的信。4.3 线程嵌套线程为什么是反面教材我在项目里看过很多人写“处理一批任务时每个任务内部又开一个线程处理子任务”这属于典型的无意识并发。后果有两个第一任务量一大线程数变成平方级增长再好的机器也扛不住第二子线程和父线程之间如何收集结果、如何传递异常代码会迅速变得一团乱麻最终只能靠全局变量传数据又引入线程安全问题。正确的姿势永远是能用主流程顺序处理就顺序处理需要并发就统一交给线程池或协程。并发不是装饰品它是为了解决特定瓶颈才引入的工具。判断标准就一句话你的任务是不是大量时间花在等待外部响应上如果是并发有效如果只是 CPU 计算并发在 Python 里大概率帮倒忙。5. 数据可视化横坐标太密集的正确处理姿势5.1 先画一个能看的折线图数据清洗完下一步就是让它变得“肉眼可见”。matplotlib 是 Python 画图的基础库很多人觉得它丑其实是你没用对场景。数据探索阶段它完全够用而且控起来简单直接。先看最基础的画图import matplotlib.pyplot as plt df df.sort_values(date) plt.figure(figsize(12, 5)) plt.plot(df[date], df[score], markero, linewidth1.5) plt.title(分数趋势) plt.xlabel(日期) plt.ylabel(分数) plt.grid(True, alpha0.3) plt.show()到这里你会频繁遇到一个问题横坐标要么挤成一团黑乎乎看不清要么日期显示不全。这不是电脑坏了是我们的横轴标签数量超过了画布能承受的密度。热词“python 画图横坐标太密集”指的就是这个。5.2 解决横坐标密集旋转、抽稀与自动调整解决横坐标密集我的标准顺手操作有三板斧。第一斧是旋转标签让文字斜着放避免重叠plt.xticks(rotation45)第二斧是限制显示的刻度数量。别让 matplotlib 把每个日期都标出来设置一个最大刻度数量让它自动挑有代表性的显示plt.locator_params(axisx, nbins10)第三斧是自动调整画布布局防止标签被裁切plt.tight_layout()三斧头下来一张图的横坐标基本能看清了。如果你画的是分箱柱状图横轴是几千个类别那更合理的做法不是硬显示所有标签而是先聚合按周、按月的粒度算均值再画图。数据粒度降下来图自然就清了。记住一个原则画图的最终目的是让人看懂趋势不是为了展示所有原始信息。5.3 保存图片与中文显示问题调试期用 plt.show() 没问题但项目交付或写报告的时候你更可能需要把图直接存成文件。保存图片的姿势plt.savefig(score_trend.png, dpi150, bbox_inchestight)dpi 控制清晰度bbox_inchestight 会自动裁掉周围多余白边。请务必把 savefig 放在 show 之前因为 show 会清空当前画布你再 savefig 只能得到一张空白图。这个坑我踩过不止一次后来养成习惯存图代码永远紧跟绘图代码。中文显示是另一个高频问题。matplotlib 默认字体不支持中文所有中文都会显示成一个个方框。两行配置解决plt.rcParams[font.sans-serif] [SimHei] plt.rcParams[axes.unicode_minus] False第二行是为了解决坐标轴负号显示成方块的问题。字体设置因系统而异Windows 上 SimHei 一般可用Linux 上可能需要指定其他中文字体比如 WenQuanYi Zen Hei 或 Noto Sans CJK SC。画图前先固定好字体能省掉之后所有图的返工。6. 经典算法题训练李白打酒与邻接矩阵构建6.1 李白打酒从逆推理解循环与递推很多时候项目做完了还得练一点“题感”。算法题训练不是面试专用它真正的价值是逼你熟练使用递归、循环、状态转移这些核心思维方式。热词里有一个非常经典的题目“李白打酒”特别适合这个阶段。题目大意李白街上走提壶去买酒遇店加一倍见花喝一斗。三遇店和花喝光壶中酒问壶中原有多少酒。顺序是每一轮先遇店后见花。正向推导是 x - 2x - 2x - 1重复三次最后为 0。正向不好求那就倒着推最后一次之后是 0在当前轮遇到“见花”之前壶里应该有 1 斗因为喝掉一斗才变 0在遇到“遇店”之前壶里应该有 0.5 斗因为翻倍后变成 1。代码这么写wine 0 # 最后一次喝完壶里是 0 for _ in range(3): # 逆着处理三次遇店、见花 wine 1 # 把见花喝掉的那一斗加回来 wine / 2 # 把遇店翻倍产生的酒还原回去 print(round(wine, 4)) # 0.875答案就是 7/8 斗。这个题值得你反复做的原因是它用一次极简的模型把“状态转移”讲透了。你做任何动态规划、递归回溯题目本质都是在回答“从一个状态怎么走到下一个状态”。逆推的思维在数据修复、回溯算法里尤其常用。延伸一下如果题目改成“店里喝花顺序不确定总共有多少种方案”那就需要递归或 BFS 去枚举状态了网上有很多加强版你把基础版吃透再去碰加强版就不会觉得天书一样。6.2 邻接矩阵图存储结构的第一个模型图论是很多算法的基础而图的第一种存储方式就是邻接矩阵。什么叫邻接就是“相邻的边关系”。一个节点编号对应矩阵的一行一列matrix[i][j] 的值表示从 i 到 j 是否有边或边权是多少。上一章已经给过建矩阵的代码这里再补一个完整可跑的小例子n 5 adj [[0] * n for _ in range(n)] edges [(0, 1), (1, 2), (2, 3), (3, 4), (4, 0), (1, 4)] for u, v in edges: adj[u][v] 1 adj[v][u] 1 # 无向图需要双向标记 for row in adj: print(row)如果你做的是有向带权图就把 1 改成对应权重并且只标记 adj[u][v]不回标 adj[v][u]。邻接矩阵的优点是查询任意两点之间是否有边非常快时间复杂度 O(1)缺点是很稀疏的图用矩阵存会浪费大量空间。所以业界更常用邻接表去存稀疏图但理解邻接矩阵对后续理解矩阵运算、图神经网络、推荐系统里的共现矩阵都特别关键。顺带把热词“python 数组切片命令”在这再提一次numpy 数组切片配合邻接矩阵可以非常方便地按行取出“某个节点连了谁”比如 nbrs np.nonzero(adj[2])[0]一行代码拿到节点 2 的所有邻居编号。6.3 变量、类型与函数定义基础语法到底该怎么练前面讲了项目和算法我担心一部分读者觉得基础不牢所以这里单独把基础语法训练的事说透。热词里有“python 变量的类型练习题”、“python 定义变量”、“python 类型转换”、“python 定义函数”这些都是新手最常搜索的内容。我的经验是基础语法不要靠看书巩固要靠小题目巩固。给自己定一个小目标每天做 10 道“看一眼就写”的小题。比如把一个字符串按逗号拆成列表再把每个元素转成浮点数还去重写一个函数接收任意数量参数返回它们的均值把一个字典按键排序输出。这类题看起来简单但它能把变量绑定规则、类型转换、函数参数传递这些最核心的肌肉记忆练出来。定义函数有一个容易被忽略的点函数内部修改全局变量必须显式用 global否则你只是创建了一个同名局部变量。这个坑在项目代码里非常隐蔽表现是“我明明在外面改了变量函数里也运行了为什么最后结果没变”我见过很多人排查非常久。7. 常见问题排查实录与避坑速查表7.1 安装类问题速查网页搜索里高频出现的“python 安装、官网下载、环境变量配置、cv2 下载、numpy 安装、linux 系统安装 python”本质上是一个大类的问题。我把常见表现和解决办法整理成一张速查表你可以直接存下来对号入座。问题现象常见原因解决办法pip 安装很慢或超时默认源网络链路不给力换镜像源加 -i 参数速度立刻上来代码 import pandas 报 ModuleNotFoundError但 pip list 有 pandas解释器选错安装环境与运行环境不一致在 VSCode 里重新选择虚拟环境解释器或直接用 python -m pip 代替 pip 安装同一段代码终端能跑VSCode 里报错VSCode 使用的解释器不是当前环境命令面板选择正确的解释器重启终端numpy 安装失败提示找不到匹配版本Python 版本过新部分库还没有对应 Wheel降级到 3.8-3.11 范围或安装支持当前版本的库版本安装 cv2 报错包体积大、依赖复杂先升级 pip再单独安装 opencv-python避免与其他包混装Windows 安装 Python 报 0x80070643安装程序冲突或系统安装服务异常重启、关闭杀毒软件用官方安装包重新安装装时勾选 Add to PATH运行 ComfyUI 自定义节点提示“请先在你的 python 环境中运行 pip install -u --pre comfyui-m”项目要求对应 python 环境缺少节点依赖先激活该项目所在虚拟环境再按提示执行 pip 安装不要盲目往系统环境装安装类问题的核心就一句让 pip 和你的运行解释器指向同一位置。你可以在终端运行 python -m pip show pandas再运行 python -c import pandas; print(pandas.file)两个路径一致基本就说明环境配对成功了。7.2 运行时报错速查运行阶段的问题更零散但高频命中的基本就那么几类我挑几个典型的说。报错内容常见原因解决办法list index out of range访问了空列表或长度不足的列表打印 len 先确认数据量取下标前做存在性判断KeyError: xxx字典里没有这个键用 data.get(xxx) 返回值并判空或先打印 data.keys()AttributeError: NoneType object has no attribute xxx接口返回 None 被直接当对象用请求后检查 resp.json() 是否有内容逐级打印结构再取字段UnicodeDecodeError文件或网页编码不是默认编码打开文件时指定 encoding如 encodingutf-8Coroutine xxx was never awaited协程函数只调用没 await检查有没有 asyncio.run 或 await 去驱动事件循环画图中文全是方框matplotlib 默认字体不支持中文设置中文字体和负号支持见第 5.3 节我特别想强调第一条 list index out of range。新手一看到它就慌实际上它绝大多数时候是“数据没抓全”或“解析层级看错了”导致列表长度不足。调试时先把接口原始返回打印出来用数据说话比瞎猜下标快得多。7.3 我的几个观念层面的建议排查问题这件事方法比知识重要。我自己的习惯是“三步走”第一步重现问题找最小复现代码不要在大项目里蒙头找第二步打印关键变量看到哪一步数据形态开始不对就往那个方向查第三步改完一个点马上回跑测试确认不是“修好一个又拆掉一个”。这个习惯救了我很多次。有一次我写数据管道结果反复比预期少两行查了很久才发现是 drop_duplicates 默认把所有列都作为判断依据而我的数据每行都有唯一 id导致去重根本没生效。后来我养成了看函数文档的习惯每次用一个不熟悉的方法先确认它的默认参数再批量用。给新手最后一条建议报错信息永远是你最好的老师。很多人看到红字就头大其实每一行报错都在告诉你是哪个文件、哪一行、什么类型的问题。你把报错读全覆盖住一半的 bug 你已经能自己解决。我自己的实操是每做一个阶段就写一个 README 记录遇到的坑和解决办法。这些记录当时看起来平凡三个月后回头看全是财富。项目代码可以删掉重写但踩坑经历会一直在这才是从零到精通最值的积累。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑