基于淘宝京东爬虫与商品评论情感分析的评价系统设计实战 📅 发布时间:2026/9/8 22:30:58 👁 浏览次数: 简介面向Python毕业设计、期末大作业及课程设计场景这套基于淘宝、京东爬虫与商品评论情感分析的商品评价系统是一份可直接运行的高分项目源码评审分达98分难度适中且经助教审定适合需要完整实战项目的学习者参考。包体共103个文件压缩包约55.57MB涵盖Python源码、电商评论CSV数据集、深度学习模型文件pt/lstmmodel、可视化图表与HTML结果页等从数据爬取、清洗到情感分析建模均有对应实现。附带文档说明可帮助快速理解项目结构目前已有110人学习下载内容完整度较高。通过源码与数据可掌握淘宝、京东商品评论采集流程、中文评论情感分析模型训练与评价系统构建思路尤其适合希望以较高质量完成毕设或课设的Python学习者。 直接开头做电商评论分析这类题目每年都有不少同学选但大部分都死在同一个地方爬虫爬到一半被封、情感分析做得像玩具、系统各模块拼不起来。这个“基于淘宝、京东爬虫及商品评论情感分析的商品评价系统”算是同类题目里比较完整的套路——采集、清洗、分析、可视化、Web展示一条龙既有技术深度又容易出成果。我用这篇文章把整个项目的设计思路、核心实现和踩坑记录完整梳理一遍希望能给正在做类似毕设或者想练手爬虫NLP的同学一些拿来就能用的参考。1. 项目定位这个东西到底在做什么1.1 核心需求拆解先说清楚这个系统干了什么。它本质上是一个电商评论数据的“采集分析展示”管道从淘宝、京东抓取指定商品的用户评论对评论文本做情感极性判断好评/中评/差评再把分析结果通过Web界面呈现给用户。拆开来看系统包含四个能力商品评论数据采集支持按关键词搜索商品、按商品ID采集评论覆盖淘宝和京东两个平台。数据清洗与存储对抓下来的文本做去重、去噪、分词存入MySQL。情感分析引擎判断每条评论的情感倾向并计算好评率、情感得分等指标。可视化展示通过图表呈现评论分布、情感占比、关键词云等。这个项目之所以适合作为毕设是因为它踩中了几个关键点有网络爬虫这个硬核技术撑着有自然语言处理的理论深度还有完整的Web系统作为成果展示论文里每个环节都有东西可写。1.2 为什么选淘宝和京东很多同学会纠结到底抓哪个平台我的建议是选两个一个综合类、一个垂直类这样对比起来更有说服力。淘宝覆盖全品类、评论量大、反爬手段相对灵活京东评论接口相对稳定、数据结构规整还额外提供了商品属性、服务评分等维度。两者的数据格式差异恰好为系统设计提出了真实需求——需要做平台适配层用统一的评论模型承接不同来源的数据。这部分在论文里可以作为一个重点来写多源异构数据的统一处理。1.3 系统边界与工作量评估这个项目如果一个人从头写合理的工作量大概是爬虫模块占30%情感分析占25%Web端占25%数据清洗和文档写作占20%。我见过不少同学在爬虫上死磕太久结果留给情感分析和系统整合的时间不够最后只能草草收场。合理的做法是先把最简可用的版本跑通——哪怕先只抓京东一种商品、只用规则做简单情感判断——然后再逐层增强。2. 技术选型与总体架构设计2.1 语言与框架选择后端语言没什么悬念用Python。爬虫生态最成熟就是Pythonrequests、Scrapy、BeautifulSoup、Selenium这些库都是现成的情感分析方面有SnowNLP、jieba、sklearn、甚至可以直接对接预训练模型Web端用Flask或Django都行轻量就用Flask图省事可以用Django自带的后台管理。我这里选的是requests BeautifulSoup Selenium 做采集MySQL做存储SnowNLP 自训练朴素贝叶斯做情感分析Flask ECharts做展示。这套组合的好处是每个环节都有成熟的替代方案出了问题好排查而且论文里可以逐个介绍“备选方案对比”内容瞬间就充实了。2.2 整体数据流向整个系统的核心是一条数据流水线商品搜索/评论URL → 爬虫采集 → 原始数据 → 清洗去重 → 结构化存储(MySQL) → 情感分析引擎 → 得分与标签 → 统计聚合接口 → Web前端可视化每一级都尽量解耦。爬虫只管采集不管存储格式——采集到的数据先落到临时表经过清洗后再转入正式表。情感分析模块只负责输入文本、输出情感标签和分数不关心数据从哪里来。Web端通过API读取的已经是聚合好的统计结果不直接操作原始数据。这种分层设计最大的好处是调试的时候能快速定位问题爬虫挂了不影响情感分析情感分析模型调参不需要重新爬数据。2.3 数据库设计要点针对多平台数据我设计的核心表大致如下表名主要字段用途productid, platform, product_id, title, price, shop, url商品信息commentid, product_id, platform, user, content, rating, comment_time, like_count用户评论文本及元数据sentiment_resultid, comment_id, sentiment_label, positive_score, negative_score情感分析结果task_logid, keyword, platform, total_count, success_count, create_time爬虫任务记录有一个细节容易忽略comment表里一定要存原始评分rating因为淘宝的评分是1~5星京东也有评分字段这是计算“真实好评率”的重要参考不能只存评论文本。另外要加唯一索引防止重复数据比如平台评论ID的组合否则多跑几次爬虫任务表里全是垃圾。3. 爬虫模块的实现细节与反爬应对3.1 京东评论接口的抓取思路京东的评论数据有一个公开的接口路径返回JSON格式相比直接解析HTML要省力很多。大体流程是先通过商品搜索页找到商品IDskuId然后根据skuId请求评论分页接口拿到评论列表。核心代码如下import requests import json def fetch_jd_comments(sku_id, page0, page_size20): url https://club.jd.com/comment/productPageComments.action params { productId: sku_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), Referer: fhttps://item.jd.com/{sku_id}.html, } resp requests.get(url, paramsparams, headersheaders, timeout10) if resp.status_code 200: data resp.json() comments data.get(comments, []) result [] for c in comments: result.append({ user: c.get(nickname, ), content: c.get(content, ), rating: c.get(score, 0), time: c.get(creationTime, ), like_count: c.get(usefulVoteCount, 0), }) return result return []这里有个小技巧score0表示全部评论如果只需要差评可以改成score1好评是score3这样可以直接分档采集做情感分析时候还能做交叉验证。sortType5是推荐排序换成sortType6可以按时间排序。3.2 淘宝评论的采集难点淘宝比京东麻烦不少。主要问题是评论数据不是直接能拿到的需要通过商品ID去请求rate/itemRate.htm这个接口而且请求参数里有一堆动态生成的token和签名肉眼很难直接构造。我的做法是分两步走第一步用Selenium模拟浏览器打开商品页面从页面源码中提取关键参数第二步构造请求获取评论数据。Selenium本质上就是一个自动化浏览器能执行页面的JavaScript所以能绕过那些纯静态分析很难搞定的渲染逻辑。from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC def get_taobao_comments(item_id, max_pages5): options webdriver.ChromeOptions() options.add_argument(--headless) options.add_argument(--disable-blink-featuresAutomationControlled) options.add_experimental_option(excludeSwitches, [enable-automation]) driver webdriver.Chrome(optionsoptions) driver.get(fhttps://item.taobao.com/item.htm?id{item_id}) comments [] try: for _ in range(max_pages): # 等待评论区加载 WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.CLASS_NAME, tm-rate-full)) ) # 滚动评论区触发懒加载 driver.execute_script(window.scrollTo(0, document.body.scrollHeight)) time.sleep(2) items driver.find_elements(By.CSS_SELECTOR, .tm-rate-content) for el in items: comments.append({ content: el.text.strip(), platform: taobao, }) # 点击下一页 next_btn driver.find_element(By.CSS_SELECTOR, .tm-rate-pager .next) if not next_btn.is_enabled(): break next_btn.click() time.sleep(2) except Exception as e: print(采集淘宝评论出错:, e) finally: driver.quit() return comments这里必须要提醒Selenium采集的效率和稳定性都不如直接调接口且平台反爬升级后CSS选择器可能会失效。所以写这块代码的时候就别想着一步到位基于当时页面结构写但现在留好配置项比如把选择器放到配置文件里页面改版了改配置就行不用改代码。3.3 反爬应对的常规策略淘宝京东的反爬都在动态升级没有一劳永逸的办法。但从工程角度以下几条是被验证有效的User-Agent轮换准备一个UA池每次请求随机取一个伪装成不同浏览器和设备。请求频率控制控制单次请求的间隔时间随机在1到3秒之间避免固定的请求频率被识别。代理IP池当IP被限制时切换代理这个可以自建也可以买现成的代理服务。登录态维护京东的某些接口需要登录Cookie可以用Selenium自动登录一次把Cookie持久化到本地文件下次直接用。还有一点很重要务必控制爬取规模。做毕设和学术研究每类商品抓几百条到一千条评论足够了不需要也不应该去抓全量数据。爬虫代码里设置一个MAX_PAGES上限既是给自己省事也是对目标网站负责。规模太大不仅容易被封也超出了系统的设计目标。4. 商品评价的情感分析核心4.1 情感分析方案对比情感分析是整篇论文的理论核心这块做好了对答辩帮助很大。我实际测试了三种方案效果差异明显方案优点缺点实际效果SnowNLP 直接用零成本无需标注数据它是针对社交媒体的电商评论效果差准确率约60%差评经常判成好评基于情感词典可控可解释性强需要整理领域词典工作量不小准确率约65%~70%SnowNLP 自训练朴素贝叶斯效果明显提升需要人工标注一部分训练数据准确率约80%以上我最终选的是第三种方案。思路很简单SnowNLP自带一个训练好的模型但它在电商评论上表现不好。我们可以拿一部分电商评论数据人工打标成“好评/中评/差评”然后用这些数据对朴素贝叶斯模型做训练让模型“校准”到电商语料上。4.2 训练数据准备与模型实现我准备了大约2000条带情感倾向的评论数据其中好评、中评、差评大约按5:3:2的比例分布。标注完数据后用jieba分词再用TF-IDF把文本转成向量最后训练朴素贝叶斯分类器。import jieba from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.naive_bayes import MultinomialNB from sklearn.model_selection import train_test_split from sklearn.metrics import classification_report import pandas as pd # df: 包含 content 和 label 两列, label 取值为 positive/neutral/negative df pd.read_csv(labeled_comments.csv) def tokenize(text): return .join(jieba.cut(text)) df[cut] df[content].apply(tokenize) vectorizer TfidfVectorizer(max_features3000) X vectorizer.fit_transform(df[cut]) y df[label] X_train, X_test, y_train, y_test train_test_split( X, y, test_size0.2, random_state42 ) model MultinomialNB() model.fit(X_train, y_train) pred model.predict(X_test) print(classification_report(y_test, pred))实测下来这个组合的具体指标大致是好评识别精确率85%上下差评识别精确率75%上下中评容易跟两边混因为中评的文本特征本来就不明显。答辩的时候能拿出这组数据比空口说“我用的情感分析模型”有说服力得多。4.3 为什么不用大模型做情感分析现在大模型很热很多人问直接用大模型做情感分析不香吗确实香效果可能比这个方案还好但不太适合作为毕设主体。原因有三个一是成本问题大规模调用大模型接口算下来成本不低还得考虑并发限制二是可解释性问题评分的依据很难在论文里分析清楚导师评审时容易“追问到死角”三是训练过程本身也是学习过程自己动手标注数据、训练模型、调整参数这个过程才是毕设的核心价值。不过可以在系统里预留一个“大模型对比”的入口拿几十条数据跑一次跟传统模型做对比分析这比直接用大模型代替全部功能更有创新点。4.4 情感得分与商品量化指标单条评论的情感判断只是基础商品维度的分析才是给用户看到的最终结果。我设计了几个量化指标综合好评率(positive数量0.5*neutral数量) / 总评论数平均情感得分将情感标签映射为得分positive2neutral1negative0然后求平均。有趣的是我还计算了“评分与情感一致性”——即用户打了高分但情感被判断为负、或打了低分但情感为正的比例。这个比例能反映出评论的“藏话率”在分析某些争议商品时很有意思。5. Web系统设计与结果展示5.1 功能模块划分Web端我用Flask实现前端页面用Bootstrap ECharts整体分三个页面搜索页输入关键词选择平台触发爬虫任务。商品列表页展示爬取到的商品按好评率、评论数、情感得分排序。商品详情页展示一个商品的分析结果包括评论情感饼图、好评率趋势、关键词云、最新评论列表。这版Web端没有做登录注册因为毕设重点不在这。整体就是个仪表盘形态能看能查就够了。5.2 接口设计与数据聚合后端API我设计了几个REST接口用JSON格式返回GET /api/search?keyword手机platformjd POST /api/crawl GET /api/product/{id}/summary GET /api/product/{id}/sentiment_trend GET /api/product/{id}/wordcloud情感分析的API返回设计成如下结构方便前端直接渲染图表{ product_id: 100012345, total_comments: 368, sentiment_dist: {positive: 210, neutral: 98, negative: 60}, avg_score: 4.2, rating_gap: 0.12, top_keywords: [性价比, 快递, 屏幕, 续航, 拍照] }前端拿到这个结构后用ECharts画饼图和柱状图不需要再做二次计算。注意这里top_keywords是在后端提前算好的如果放在前端做高频词统计用户浏览器得跑分词体验差很多。5.3 前端布局与图表选型页面的视觉呈现上我用的是暗色系仪表盘风格。图表方面情感占比用饼图最直观商品对比用横向柱状图关键词用词云。ECharts有现成的词云扩展直接引入就能用。这里有个经验一开始我图省事把所有的统计数据都放在一个长长的页面里结果用户看完第一个商品就划不动了。后来改成“搜索页 → 列表页 → 详情页”的三级跳转模式页面短了数据聚焦了操作路径也清晰了。6. 实战中遇到的高频问题与解决思路6.1 爬虫被反爬限制这是做电商爬虫几乎一定会遇到的情况具体表现为请求返回空数据、验证码弹出、甚至IP被临时限制。我的排查套路是这样的先看返回的状态码和响应体确认是被跳转到了登录页还是接口返回了错误提示。对比浏览器的真实请求和代码请求的差异——很多请求缺失的关键Header比如Referer、X-Requested-With就是在这一步发现的。检查请求频率如果之前的爬虫任务里设的间隔太短先降低频率试一轮。如果被限制的是IP切换代理后等待一段时间再继续。另外有个容易忽略的点requests的Session要复用连接不要每次请求都新建一个Session这既是性能优化也能降低被识别为脚本的风险。6.2 数据质量问题电商评论里噪声很多比如“此用户未填写评价内容”大量无意义占位文本、重复评论、广告评论引流微信号、夹杂大量表情符号等。我的清洗策略比较务实去除长度小于5个字符的评论。去除相似度超过0.9的重复文本用simhash或者直接字符串相似度。过滤掉含“加微信”“优惠券领取”等明显广告词条的评论。表情符号统一转换为文本标签比如[微笑]避免后面分词的时候被丢弃。6.3 情感分析在中评上的“迷茫”情感分析最拉胯的环节就是中评。原因是中评表达普遍比较含蓄比如“一般般吧”“还行”“凑合”这类模糊表达用规则很难判断。我的经验是中评文本中加入“但是”“不过”这类转折词的比例特别高可以专门提取转折词后面的内容来判断真实情感倾向。这里可以作为一个可选的优化策略import re def handle_but(text): # 简单处理但是/不过/可是后的文本用于补充判断 pattern re.compile(r(但是|不过|可是|然而)) match pattern.search(text) if match: return text[match.end():] return text不过要提醒这个策略对样本量大的时候有一定改善但对单条短评论可能适得其反要根据验证结果决定要不要用。6.4 常见问题速查问题现象可能原因解决办法京东评论接口返回空列表商品ID错误或该商品无评论换个商品ID验证接口检查skuId是否有效淘宝评论页一直加载中需要登录提前用Selenium保存登录CookieMySQL写入报错编码问题或字段超长建库用utf8mb4content字段用TEXT类型情感分析全判为好评训练样本不均衡重采样或增加差评样本的比例词云全是“这个”“那个”未加载停用词表加载中文停用词表过滤无意义虚词7. 一些想对后来者说的话整个项目做下来我最大的感受可以归结成一句话别让任何一个模块成为全系统的瓶颈。爬虫做得好但情感分析是摆设系统演示就撑不住情感分析做得好但Web页面没法稳定展示答辩也拿不了高分。把各个环节控制在“能跑、可讲、有数据支撑”的水平比在一个点上追求极致更实际。最后再分享一个对毕设尤其有用的小技巧把每个模块的核心结果都导出成图表和截图分类放好。爬虫的采集日志、评论数据的统计分布、模型训练的准确率变化、系统页面的截图这些素材在写论文和做答辩PPT的时候都是硬通货临时去补截图非常痛苦。还有一个容易被忽视的点系统的README和文档说明要写得足够详细。这个项目本身带文档但很多同学的README只会写“如何运行”不会写“模块设计思路”和“数据字典”等到论文需要描述系统架构的时候再回看代码就晚了。开发的过程中顺手写文档比项目结束后再回忆要省力得多文档质量也高得多。本文还有配套的精品资源点击获取