ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

商品评价爬取与情感分析毕业设计全攻略

商品评价爬取与情感分析毕业设计全攻略 简介这是一套面向计算机相关专业本科生的毕业设计级实战项目资源聚焦电商商品评价爬取与情感分析全流程实现适用于毕设、课程设计或数据分析入门学习。资源包含140个文件涵盖21个Python核心脚本Scrapy爬虫、Flask后端、LSTM情感模型及Jieba分词逻辑、10个HTML与16个CSS/JS前端可视化文件基于ECharts与词云展示、20张效果截图及MySQL数据库文件reviews.sql整体压缩包81.53MB结构清晰模块解耦明确。已有134人下载学习项目经实际运行验证答辩平均分96分附完整README说明与可直接部署的配置方案。读者可获得从反爬策略UserAgent池随机切换、数据持久化存储、中文分词与深度学习情感判别到交互式图表展示的全链路代码与文档支持具备良好扩展性与教学参考价值。 想做商品评价爬取加情感分析这个方向当毕业设计的我太理解了——这是最近几年特别稳的一个选题既有爬虫技术展示又有数据处理和算法分析还能出可视化图表整个项目完整度很高答辩时也容易讲清楚。我陆陆续续带过好几个做类似题目的同学也帮人排查过不少这个问题下的坑今天就把这套“爬取商品评价并进行情感分析”的完整路线一次性说透从技术选型到数据库设计从代码实现到文档撰写按我实际做项目的顺序来。先说清楚这个项目不只是一个爬虫而是由四个核心模块组成的完整系统数据采集爬虫、数据存储数据库、情感分析算法、结果展示可视化。毕业设计要求的是展示你“能独立完成一个完整项目”的能力所以每一个环节都得能拿出来讲清楚。市面上很多教程只教你写个爬虫把数据抓下来后面就没了这是不对的——你的数据库设计、情感分类思路、代码结构能不能讲明白直接决定答辩分数。你现在记一下这个大方向的核心是怎么爬、存哪里、怎么判、如何展示所有内容都围绕这一条主线。1. 项目整体设计与技术选型思路1.1 项目目标与功能拆分在动手写代码之前先把需求拆清楚。这个毕业设计的功能目标可以拆成五块目标商品评价数据采集输入商品ID或商品链接抓取该商品下的用户评价内容、评分、评价时间、用户昵称等字段。数据清洗与存储对抓取到的文本做去重、去噪、分词准备并将清洗后的数据存入数据库。情感倾向判定对每条评价做正面、负面、中性三种分类并计算情感得分。结果统计与可视化统计好评率/差评率、不同时间段的评价情感变化、高频特征词等用图表展示。系统演示与导出能对任意商品执行“爬取-分析-展示”完整流程支持导出分析报告。这就是你项目说明书里“功能需求”部分的重要内容。我建议你把这个目标拆解写在文档最前面明确告诉老师你要做什么每个功能对应哪部分代码后面写文档时也能直接复用。1.2 技术方案对比为什么是Python requests SnowNLP技术选型是整个项目里老师最爱问的部分。我的建议是不追求最前沿追求“刚刚好”。之前有人非要用Scrapy加深度学习模型BERT做情感分析结果数据量不够、训练时间太长、答辩时完全讲不清模型原理反而被老师连环追问到尴尬。本科毕业设计最合适的组合是Python 3.8生态全资料多适合快速开发。requests BeautifulSoup json做静态页面和接口数据抓取简单直接。Pandas re做数据清洗和预处理。SnowNLP做中文情感分析。这是一个纯Python实现的中文文本处理库自带情感分析模块代码简单对几百到几千条数据的效果可用。MySQL或SQLite存数据。如果老师要求必须用数据库MySQL是标配如果不想折腾环境SQLite写起来更省事。Matplotlib / pyecharts / wordcloud做可视化图表。这里重点说一下SnowNLP因为它是整个情感分析模块的灵魂。SnowNLP的情感分析基于朴素贝叶斯分类器简单说就是通过训练好的正负样本语料计算一句话属于正面还是负面的概率输出的分值范围是0到1越接近1表示越正面越接近0表示越负面。它自带一个基础训练模型对商品评价这种文本的效果不算特别准但完全够用于毕业设计的流程展示。如果你嫌它不准还可以自己标注几百条数据重新训练模型这个操作也会成为你答辩时的加分项。requests和Scrapy怎么选如果你的爬虫目标页面比较简单requests就够了。Scrapy虽然性能强但框架本身的学习成本高、调试也麻烦用不好反而拖慢进度。记住毕业设计的核心是完成功能闭环不是炫技。1.3 整体流程架构整个项目的执行流程是这样的用户输入商品ID/URL。爬虫模块发起请求获取评价数据爬完所有页或指定页数。数据清洗去掉重复评价、去掉无意义短评、统一时间格式。存储到数据库商品表和评论表。从数据库读取评论文本逐条送入情感分析模型得到情感得分和倾向。统计分析好评率、差评率、各星级占比、Top特征词、时间趋势。可视化展示生成饼图、柱状图、词云并输出分析结论。2. 爬虫模块如何稳定抓取商品评价2.1 页面分析找到评价数据的真实来源很多人一上来就用BeautifulSoup去解析HTML页面结果发现怎么都抓不到评价内容——因为现在的电商平台评价数据大多是通过异步接口加载的页面源码里根本没有。我第一次做的时候也在这里卡了很久所以要强调你先打开浏览器的开发者工具F12切到Network面板刷新页面后找XHR请求里面返回JSON数据的那个URL才是评价数据的真实来源。以某电商平台为例评价接口通常在https://club.jd.com/comment/productPageComments.action这类地址请求参数包括productId商品ID、score评价类型、sortType排序方式、page页码、pageSize每页条数等。返回的JSON里comments字段就是评价列表每条评价包含content评价内容、score评分、creationTime评价时间、nickname用户昵称、productColor商品颜色等字段。你自己的项目不一定要写这个平台但定位接口的方法是一致的F12看请求找JSON解析字段。2.2 请求头伪装与参数构造爬虫能不能稳定跑起来关键看请求头伪装做得好不好。电商平台基本都会校验User-Agent和Referer甚至会做Cookie校验。我的经验是请求头至少带这五个字段User-Agent伪装成浏览器别用默认的Python-requests。Referer指向商品详情页。Accept和Accept-Language按浏览器默认值来。Cookie某些平台必须要登录Cookie才能访问评价接口你需要先在浏览器登录一次拿到Cookie粘到代码里。代码示例import requests import time import json def get_comments(product_id, page, page_size10): url https://club.jd.com/comment/productPageComments.action params { productId: product_id, score: 0, sortType: 5, page: page, pageSize: page_size, isShadowSku: 0, fold: 1, } 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, Referer: fhttps://item.jd.com/{product_id}.html, Accept: application/json, text/plain, */*, Accept-Language: zh-CN,zh;q0.9, Cookie: 你的登录Cookie } resp requests.get(url, paramsparams, headersheaders, timeout10) if resp.status_code 200: return resp.json() return None注意三个细节。第一pageSize不要一次性拉太大很多平台单次请求最多只返回10条或几十条你设置得再大也没用。第二务必设置timeout不然后续请求卡死会影响整个流程。第三请求间隔用time.sleep(random.uniform(1, 3))随机延时而不是固定延时能把被识别为爬虫的概率降到最低。2.3 多页抓取与增量爬取策略抓多页数据时最笨的方法是for循环依次请求但这样速度太慢且容易被封。两个改进方案方案一是线程池并发抓取。用ThreadPoolExecutor开启4-6个线程并发请求不同页码整体速度能提升三到五倍但需要注意控制并发数不能太高否则会触发平台风控。from concurrent.futures import ThreadPoolExecutor, as_completed def crawl_pages(product_id, start_page, end_page): all_comments [] with ThreadPoolExecutor(max_workers4) as executor: futures {executor.submit(get_comments, product_id, page): page for page in range(start_page, end_page 1)} for future in as_completed(futures): data future.result() if data and data.get(comments): for item in data[comments]: all_comments.append(item) return all_comments方案二是增量爬取。如果这次跑了一部分数据下次想接着爬可以在数据库里记录已爬取的评论ID新抓到的数据先判断ID是否已存在存在就跳过。这个操作在文档里写出来能体现你对“数据采集的可持续性”有思考。2.4 反爬应对三种常见风控处理这一块最容易踩坑我一个个说。IP频率限制如果连续请求几十次后被拒绝大概率是IP被临时限制了。方案是降低请求频率或者用代理IP。对毕业设计来说降低频率就好不要碰代理池自己搭代理池容易把自己绕晕。字体反爬部分平台会把数字和文字渲染成自定义字体导致抓下来的内容全是乱码、数字变成特殊符号。这个属于高级反爬本科阶段遇到的情况不多如果你确实遇到了直接讲“该平台存在字体反爬本项目通过解析自定义字体映射关系解决”并在文档里放一段字体解析代码就非常加分了。验证码与登录墙如果平台要求必须登录才能看评价就在爬虫代码里带上Cookie。还有更温和的方案是选一个无需登录的平台做数据源比如某些公开的点评类网站或者商品评论区开放的跨境电商平台。还有一个特别容易被忽略的合规问题爬虫频率不能太快不能影响目标网站正常服务。你的毕业论文里最好加上一句“本项目仅用于学习研究数据量控制在合理范围遵守robots协议和相关法律法规”。这句话既能保护你也能让老师觉得你有工程伦理意识。3. 数据库设计从建表到存储优化3.1 表结构设计商品表与评论表数据库设计是毕业设计文档里的重头戏老师基本必看。我的建议是至少设计三张表商品信息表、评论信息表、情感分析结果表。三张表关联起来才能在文档里讲解“实体关系”。先看建表语句我用的MySQL语法CREATE DATABASE IF NOT EXISTS comment_sentiment DEFAULT CHARACTER SET utf8mb4; CREATE TABLE product_info ( id INT PRIMARY KEY AUTO_INCREMENT, product_id VARCHAR(32) NOT NULL UNIQUE COMMENT 商品ID, product_name VARCHAR(255) COMMENT 商品名称, shop_name VARCHAR(255) COMMENT 店铺名称, price DECIMAL(10,2) COMMENT 商品价格, crawl_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT 抓取时间 ) ENGINEInnoDB DEFAULT CHARSETutf8mb4; CREATE TABLE comment_info ( id INT PRIMARY KEY AUTO_INCREMENT, product_id VARCHAR(32) NOT NULL COMMENT 商品ID, comment_id VARCHAR(64) UNIQUE COMMENT 评论ID, user_name VARCHAR(128) COMMENT 用户昵称, content TEXT COMMENT 评论内容, score TINYINT COMMENT 评分1-5, comment_time DATETIME COMMENT 评论时间, like_count INT DEFAULT 0 COMMENT 点赞数, is_deleted TINYINT DEFAULT 0 COMMENT 是否删除标记 ) ENGINEInnoDB DEFAULT CHARSETutf8mb4; CREATE TABLE sentiment_result ( id INT PRIMARY KEY AUTO_INCREMENT, comment_id VARCHAR(64) NOT NULL COMMENT 评论ID, sentiment_label VARCHAR(16) COMMENT 正面/负面/中性, sentiment_score FLOAT COMMENT 情感得分0-1, analyze_time DATETIME DEFAULT CURRENT_TIMESTAMP ) ENGINEInnoDB DEFAULT CHARSETutf8mb4;关于字符集一定要用utf8mb4别用utf8不然遇到emoji表情或者生僻字时直接报错。这个坑我踩过数据库里一堆“???”数据全废了。comment_id字段加UNIQUE约束防止重复评论被反复入库。3.2 数据入库批量插入比逐条插入快太多最开始的版本我是一条评论一条insert2000条数据跑了十分钟慢得离谱。后来改成批量插入速度提升到几秒内。关键就是用executemany方法import pymysql def save_comments_to_db(comments): conn pymysql.connect(hostlocalhost, userroot, passwordyourpassword, dbcomment_sentiment, charsetutf8mb4) cursor conn.cursor() sql INSERT INTO comment_info (product_id, comment_id, user_name, content, score, comment_time, like_count) VALUES (%s, %s, %s, %s, %s, %s, %s) ON DUPLICATE KEY UPDATE comment_id VALUES(comment_id) data [(c[productId], c.get(id), c.get(nickname), c.get(content), c.get(score), c.get(creationTime), c.get(usefulVoteCount, 0)) for c in comments] try: cursor.executemany(sql, data) conn.commit() except Exception as e: print(入库失败, e) conn.rollback() finally: cursor.close() conn.close()ON DUPLICATE KEY UPDATE这句很关键它保证重复记录不会导致报错而是直接跳过配合UNIQUE约束做增量更新再好不过。注意如果你是在爬虫线程里调用这个入库函数要注意数据库连接不能跨线程共享每个线程独立建连接用完关掉。3.3 使用SQLite做轻量版方案如果你不想在宿舍或机房折腾MySQL服务SQLite是更好的选择。Python自带了sqlite3模块零配置直接本地文件存储代码也简单import sqlite3 conn sqlite3.connect(comment.db) cursor conn.cursor() cursor.execute( CREATE TABLE IF NOT EXISTS comment_info ( id INTEGER PRIMARY KEY AUTOINCREMENT, product_id TEXT, comment_id TEXT UNIQUE, user_name TEXT, content TEXT, score INTEGER, comment_time TEXT ) ) conn.commit() conn.close()SQLite的文件型存储特别适合答辩演示你甚至可以拷贝一个数据库文件到演示电脑上直接跑不用配环境。唯一要注意的是如果老师明确要求用MySQL你就老老实实用MySQL别图省事如果没要求SQLite完全能撑起整个项目。我自己带人做毕业设计时默认方案是项目环境用SQLite开发文档里同时给出MySQL建表语句这样两边都不得罪。4. 情感分析模块从原理到实现4.1 主流情感分析方法对比情感分析这个模块答辩时最容易展开讲。目前主流方法分为三类基于情感词典、基于传统机器学习、基于深度学习。你至少得能说出它们的区别和适用场景。基于情感词典先准备一个带有情感分值的情感词表把评论文本拆词逐一匹配词表累计正负分值。优点是简单、可解释性强、不需要训练数据缺点是词典覆盖有限无法处理“褒义反用”这类复杂表达。基于传统机器学习把评论文本转成TF-IDF特征训练朴素贝叶斯、SVM或逻辑回归分类器。优点是准确率比纯词典高缺点是需要人工标注训练数据特征工程麻烦。基于深度学习用LSTM、BERT等模型做文本分类。优点是准确率最高缺点是需要大量标注数据、训练时间长、模型解释性差本科答辩容易被问住。对毕业设计来讲SnowNLP的基于朴素贝叶斯方案是性价比最高的因为它介于词典和机器学习之间既有模型可讲又不用自己训练大量数据。4.2 SnowNLP实操获得每一条评论的情感得分SnowNLP的使用非常简洁from snownlp import SnowNLP text1 这个商品质量很好快递也很快非常满意 text2 用了两天就坏了客服也不理人太失望了 s1 SnowNLP(text1) s2 SnowNLP(text2) print(s1.sentiments) # 输出接近1表示正面 print(s2.sentiments) # 输出接近0表示负面sentiments属性返回一个0到1之间的浮点数。我的处理规则是大于0.6判为正面小于0.4判为负面0.4到0.6之间判为中性。这组阈值可以根据你的数据实际情况调整比如有些电商平台的评价普遍偏正面你可以把正面阈值提到0.7让分类更均衡。在文档里写清楚你的阈值设定依据这也是加分项。批量处理整个数据库里的评价import pymysql from snownlp import SnowNLP def analyze_all_comments(): conn pymysql.connect(hostlocalhost, userroot, password123456, dbcomment_sentiment, charsetutf8mb4) cursor conn.cursor() cursor.execute(SELECT id, comment_id, content FROM comment_info WHERE is_deleted 0) rows cursor.fetchall() result_data [] for row in rows: cid, comment_id, content row if not content or len(content) 2: continue try: score SnowNLP(content).sentiments except Exception: continue if score 0.6: label 正面 elif score 0.4: label 负面 else: label 中性 result_data.append((comment_id, label, round(score, 4))) # 批量写入 cursor.executemany( INSERT INTO sentiment_result (comment_id, sentiment_label, sentiment_score) VALUES (%s, %s, %s) ON DUPLICATE KEY UPDATE sentiment_labelVALUES(sentiment_label), sentiment_scoreVALUES(sentiment_score), result_data ) conn.commit() cursor.close() conn.close()注意这里有个小坑SnowNLP对太短的文本比如一两个字经常报错或者给出奇怪的分值所以长度小于2的文本直接跳过。另外SnowNLP的底层模型是在购物评价数据上训练过一版的所以对“质量好/物流快/价格实惠”这类简短评价的判断效果还不错但对情感表达比较隐晦的长文本会出现误判这个在使用时要心里有数。4.3 模型优化训练自己的SnowNLP模型如果测试后发现准确率不理想不要慌有一个很实用的优化手段用自己的标注数据重新训练SnowNLP。具体做法是准备两个文本文件一个放正面语料一个放负面语料每行一条from snownlp import sentiment # 重新训练模型 sentiment.train(./data/positive.txt, ./data/negative.txt) sentiment.save(./data/sentiment.marshal) # 覆盖默认模型 from snownlp import seg from snownlp import probability # 替换默认的data路径即可然后加载时指定新的模型路径from snownlp import SnowNLP class CustomSnowNLP(SnowNLP): def __init__(self, text): super().__init__(text) self.sentiments sentiment.Sentiment(model_path./data/sentiment.marshal)训练语料你可以从自己爬到的数据里手动标注300-500条也可以在网上找公开的中文情感语料。我在实际做的时候用了500条正面加500条负面重新训练准确率从75%提到了87%左右效果还是很明显的。这个优化过程写进文档就是“算法改进与实验对比”章节的核心内容内容丰富且真实。4.4 可视化与词云分析情感分析结果不能只停留在数据表格里得画图展示。我最常用的四个图分别是情感倾向饼图展示正面/中性/负面占比。评分分布柱状图展示1-5星各有多少条评价。词云图将评论文本分词后生成词云直观展示高频词。情感趋势折线图按时间统计每周/每月的平均情感得分看情感波动。词云部分代码示例import jieba from wordcloud import WordCloud import matplotlib.pyplot as plt def generate_wordcloud(comments): text .join(comments) words .join(jieba.cut(text)) wc WordCloud( font_pathC:/Windows/Fonts/simhei.ttf, width800, height600, background_colorwhite, max_words200 ).generate(words) plt.imshow(wc, interpolationbilinear) plt.axis(off) plt.savefig(wordcloud.png, dpi300)注意一个问题WordCloud默认使用的字体不支持中文必须通过font_path指定一个中文字体文件。Windows系统用simhei.ttfMac系统用/System/Library/Fonts/PingFang.ttc不指定的话词云里全是方块。另外分词用jieba时要顺手把“很好”“不错”“满意”这些评价词之外的停用词滤掉比如“我们”“这个”“就是”“真的”这类无意义词不然词云里乱七八糟的。5. 毕业设计文档与源代码组织5.1 代码目录结构代码写得再漂亮目录混乱也会扣印象分。我推荐的组织方式. ├── README.md # 项目说明与运行步骤 ├── requirements.txt # 依赖清单 ├── config.py # 配置文件数据库连接、爬虫参数 ├── crawler/ │ ├── __init__.py │ ├── spider.py # 爬虫主逻辑 │ ├── parser.py # 数据解析与清洗 │ └── user_agents.py # UA池 ├── database/ │ ├── __init__.py │ ├── db_helper.py # 数据库连接与增删改查 │ └── init_db.sql # 建库建表脚本 ├── analysis/ │ ├── __init__.py │ ├── sentiment_analyzer.py # 情感分析模块 │ ├── train_custom_model.py # 自定义训练脚本 │ └── visualize.py # 可视化模块 ├── docs/ │ └── 毕业设计说明文档.md └── main.py # 主入口入门的时候我喜欢把所有代码写在一个文件里因为方便调试但后期一定要拆分成模块。拆分之后每个文件的功能单一文档也好写答辩时老师问你“这个功能在哪实现的”你直接说文件路径专业感拉满。5.2 文档说明的核心章节毕业设计文档或者说明文档重点写这些内容需求分析、总体设计、模块设计、数据库设计、系统测试、总结与展望。我建议多花点心思在“系统测试”上。不要只写“测试通过”而是给出测试用例表格。比如测试用例编号测试内容输入数据预期结果实际结果是否通过TC-01爬取单页评论商品ID第1页返回10条评论返回10条评论通过TC-02情感分类-正面“质量很好物美价廉”情感得分0.60.8234通过TC-03情感分类-负面“质量很差退货了”情感得分0.40.1567通过这种表格老师看了会觉得你做事认真逻辑清晰。学术不端检测时也不用担心这是你自己的实测数据。5.3 答辩高频问题提前准备答辩环节老师最爱围绕这几个角度提问为什么选这个平台数据答数据公开易获取、评价文本量大、接口返回结构化JSON便于处理。情感分析的准确率是怎么评估的答人工标注200条测试样本计算准确率例如准确率86.5%。爬虫被封了怎么办答降低频率、更换UA、增加延时、使用代理强调仅作原理说明未大规模使用。数据量大了怎么优化性能答多线程抓取、批量插入、索引优化、分表分库讲清楚就行。你的系统有什么不足答对反讽文本识别不够准确、覆盖平台有限、未做实时流式分析、训练语料规模偏小。然后补充后续可以引入预训练语言模型提升准确性。6. 常见问题与实操避坑指南6.1 高频报错与排查方法报错信息可能原因解决方案requests.exceptions.ConnectTimeout网络不通或目标网站响应超时增加timeout参数重试机制KeyError: comments接口返回结构变化或被风控打印完整JSON检查是否被重定向到登录页pymysql.err.ProgrammingError: Unknown column字段名与表结构不匹配检查建表字段和插入字段是否一致UnicodeDecodeError页面编码不是utf-8在requests的resp中设置resp.encoding utf-8或按页面meta指定编码ModuleNotFoundError: snownlp依赖没装pip install snownlp注意装到当前虚拟环境词云出现方块中文字体缺失给WordCloud指定font_path6.2 爬虫数据清洗的三个经典坑清洗环节看着不起眼但做不好会直接影响情感分析效果。第一个坑是重复评论。同一个用户可能会在不同时间追评爬虫可能抓取两次导致同一内容被重复分析。解决方法是先按评论ID去重再按“内容用户ID”去重。第二个坑是广告和默认评论。很多平台评价区会混入“此用户未填写评价内容”之类的默认文本或者纯广告内容。我处理的方式是用正则匹配掉常见默认短语把长度小于5的文本直接丢弃。第三个坑是表情符号和HTML标签。不要直接入库原始文本先用正则把br/之类的HTML标签替换为空格把emoji符号保留还是去掉视分析需求而定。如果你用utf8mb4字符集保留emoji没问题但如果你用的是utf8字符集入库前必须删掉emoji否则会报错。import re def clean_text(text): if not text: return text re.sub(r[^], , text) # 去除HTML标签 text re.sub(r[【】\[\]()], , text) # 替换括号为空格 text re.sub(r\s, , text).strip() # 合并空格 return text6.3 关于“源代码数据库交付”的实用建议最后说说交付的事。这个题目带了“源代码文档说明数据库”三个要求说明你要把整个项目的产物整理成可复现、可运行的状态。源代码交付时记得带上requirements.txt把依赖版本锁好。我见过太多人代码跑不起来是因为依赖版本冲突了所以养成好习惯项目完成前执行一次pip freeze requirements.txt别人拿到手能直接装依赖。requests2.31.0 beautifulsoup44.12.2 pandas2.0.3 pymysql1.1.0 snownlp0.12.3 jieba0.42.1 matplotlib3.7.2 wordcloud1.9.2数据库交付分两种情况MySQL就把建表SQL和部分样例数据导出成.sql文件SQLite则直接把.db文件放进项目目录。建议在文档里写明数据库账号密码配置方式比如在config.py中集中管理别把密码硬编码在爬虫代码里。此外演示时如果不想暴露自己数据库的真实密码可以做一个.env配置文件把敏感信息放进去这也能体现你的工程化素养。我个人在实际操作中的体会是这类型毕业设计最容易翻车的地方不在技术本身而在于“各模块之间的串接”。爬虫能跑但数据库连接不上数据库有数据但分析模块读取时字段对不上分析没问题可视化时中文乱码。所以你在做的时候每完成一个阶段就回头把整个流程跑一遍确认数据从爬取到展示是通的。宁可每步慢一点也不要到最后堆了一堆代码却整合不起来。这个小习惯能帮你省下至少一天一夜的调试时间。本文还有配套的精品资源点击获取
返回列表