京东天猫苏宁商品数据抓取工具包+京东评论情感打分脚本(含Scrapy/Requests双实现、词典规则分析、多平台适配)
本文还有配套的精品资源,点击获取
简介:一套可直接运行的电商数据采集与评论情感分析工具,支持京东、天猫、苏宁三家平台的商品标题、价格、销量、店铺等结构化信息批量获取;内置京东评论爬虫模块,覆盖动态渲染页面处理、代理轮换、反爬策略应对;评论分析部分提供轻量级NLP预处理流程——从原始评论清洗、中文分词,到基于自定义词典与规则匹配的情感倾向判定(正向/中性/负向),附带预置语料库、示例情感词典(sample_dic.txt)、分词预处理脚本(Preprocessor.py)及简易模型训练入口(train.py);代码兼容Windows/macOS/Linux,依赖通过requirements.txt统一管理,所有模块均经本地实测验证;配套README.md详述各脚本用途、启动方式、参数说明与常见问题排查步骤,适用于数据分析入门练习、课程设计、毕设原型开发或教学演示场景;资源仅供学习研究与非商业用途。
1. 这不是“爬虫教程”,而是一套能直接跑通、能交作业、能进答辩的电商数据实战工具包
你是不是也经历过:老师布置了“用Python分析某平台商品评论情感倾向”的课程设计,结果查了一晚上资料,连京东商品页的标题都还没稳定抓下来?或者毕设开题写着“基于电商评论的用户满意度研究”,可卡在第一步——怎么把真实、带时间戳、带星级、带用户等级的评论批量拿回来?更别说清洗、分词、打分了。市面上的所谓“爬虫项目”要么是静态页面的Hello World,要么是过时的Selenium硬渲染方案,一换个SKU就403;所谓的“情感分析”要么调个jieba+TextRank走个过场,要么直接扔个BERT模型,显存不够、环境报错、连训练脚本都跑不起来。
这套工具包,就是为解决这些“真实卡点”而生的。它不讲抽象原理,不堆高大上术语,而是把你在课程设计、毕业设计、数据分析入门中真正会遇到的每一个坑,都提前踩过、记下、填平。核心关键词——电商爬虫、评论情感分析、京东数据采集、Python实战、词典规则打分——每一个都不是虚的:
- “电商爬虫”意味着它真能绕过京东的anti-content头检测、天猫的tb_token动态参数、苏宁的callbackJSONP封装,不是靠F12复制粘贴几个URL;
- “评论情感分析”不是调个现成API,而是从原始HTML里抠出每一条带用户ID和时间的评论,清洗掉广告话术和无意义符号,用中文分词切出有效词根,再用你可读、可改、可调试的规则逻辑(比如“超赞”+2分,“失望”-3分,“还行”±0)打出正/中/负三档分数;
- “京东数据采集”特指对京东商品详情页(含SKU变体)、评论区(含翻页、动态加载、用户等级标识)的双方案实现——Scrapy负责高并发、稳态抓取,Requests+Playwright负责精准控制、应对强反爬;
- “Python实战”体现在每一行代码都有明确目的:JD_Spider_for_bishe.py里用scrapy-splash处理JS渲染,DataSpider.py里用requests.Session()复用连接池并自动管理Cookie,Preprocessor.py里用jieba.lcut_for_search()做搜索引擎级分词而非简单切分;
- “词典规则打分”是整套分析链路的锚点——它不依赖GPU、不依赖预训练模型、不依赖网络请求,只靠一个sample_dic.txt文本文件(你打开就能看懂、能增删、能按业务调整权重),配合几条if-elif-else逻辑,就能输出可解释、可审计、可复现的情感得分。
它适合谁?不是给算法工程师造轮子的,而是给正在赶DDL的学生、需要快速产出分析报告的运营新人、想带学生做实操的高校教师准备的。你可以今天下午装好环境,明天上午就跑出京东某款手机的500条评论及其情感分布柱状图;可以把它嵌进你的毕设系统里,作为“数据获取与预处理模块”直接截图进论文;也可以删掉Tianmaoscrap-master目录,只留京东部分,专注打磨情感分析逻辑——因为它的结构是解耦的、模块是独立的、配置是外置的。这不是玩具,是经过Windows/macOS/Linux三端实测、requirements.txt锁死版本、README里连“为什么不能用urllib3 2.x”都写清楚的生产级学习工具。
2. 整体架构设计:为什么必须是Scrapy+Requests双实现?为什么情感分析要回归词典规则?
2.1 双引擎爬虫架构:不是炫技,而是应对现实反爬的必然选择
很多初学者以为“爬虫=Requests”,但当你面对京东商品页时,会发现:
- 商品价格常藏在<script>标签的JSON字符串里,需执行JS解析;
- 评论区初始只加载前10条,后续靠滚动触发XHR请求,返回的是加密的callback函数包裹的JSONP;
- 天猫详情页大量使用Vue.js动态渲染,源码里只有<div id="root"></div>;
- 苏宁则采用jsonp+callback参数组合,且每次请求需携带上一次响应中的token。
单靠Requests硬解析,要么写一堆正则去抠JSON,要么手动拼接XHR URL,维护成本极高。而纯Scrapy又面临两个硬伤:一是对JS渲染支持弱(需额外集成Splash或Playwright,增加部署复杂度),二是对高度定制化反爬策略(如京东的Referer校验、天猫的tb_token时效性)缺乏细粒度控制能力。
因此,本工具包采用分工明确的双引擎架构:
-Scrapy引擎(JD_Spider_for_bishe.py等):负责稳定、批量、结构化的数据抓取。它被设计为“管道工”角色——专注将目标URL列表(如商品ID列表)转化为标准JSON格式的商品信息(标题、价格、销量、店铺名、好评率)。其优势在于:
- 内置CrawlSpider规则自动提取翻页链接,无需手动构造URL;
-DOWNLOADER_MIDDLEWARES中预置代理轮换中间件,支持从proxies.txt读取IP池并自动剔除失效代理;
-ITEM_PIPELINES中集成数据清洗管道,自动过滤掉“仅退款”“刷单”等无效评论关键词;
- 所有配置(如并发数、下载延迟、重试次数)均通过settings.py集中管理,符合工程规范。
- Requests+Playwright引擎(
DataSpider.py):负责精准、可控、高适应性的动态页面交互。它被定位为“外科医生”角色——当Scrapy在某个SKU上失败时,它能接管并执行精确操作: - 启动Playwright Chromium实例,模拟真实用户行为(滚动到评论区、点击“全部评价”按钮、等待AJAX加载完成);
- 截获浏览器发出的所有XHR请求,从中提取真实的评论接口URL及必要参数(如
callback、score、sortType); - 用Requests复现该请求,避免启动完整浏览器带来的性能损耗;
- 对返回的JSONP响应,用正则
re.search(r'callback\((.*)\)', response.text)安全剥离外壳,转为标准JSON。
提示:双方案并非冗余。Scrapy用于日常批量采集(如监控100款手机周价格变化),Requests+Playwright用于攻坚难点(如新上线商品的首评抓取、被封IP后的应急采集)。二者共用同一套数据模型(
items.py定义的ProductItem和CommentItem),确保下游分析模块无缝切换数据源。
2.2 情感分析为何放弃深度学习,坚持词典规则?
当前NLP教学中存在一个普遍误区:一提“情感分析”,必上LSTM、BERT、Transformer。但回到课程设计场景,你会发现:
- 训练一个可用的中文情感分类模型,至少需要5000条标注数据,而你的毕设可能只爬到300条评论;
- BERT-base模型加载需500MB显存,学生笔记本根本跑不动,强行用CPU训练,一个epoch要2小时;
- 模型输出是概率值(如“正面:0.82”),但老师问“这个0.82是怎么算出来的?”,你无法向评审组解释注意力权重;
- 商业项目中,业务方常要求“把‘性价比高’的权重调高一点”“把‘客服态度差’单独列为负向”,规则方案改一行代码即可,模型方案需重新标注、训练、验证。
因此,本工具包的情感分析模块(JD_NLP_Comments_Preprocessor-master)采用词典驱动+规则增强的轻量级方案,其设计哲学是:“可解释性优先于准确率,可维护性优先于前沿性”。具体包含三层结构:
1.基础词典层(sample_dic.txt):纯文本格式,每行一个词+权重,如超赞 2、失望 -3、一般 0、推荐 1。词典来源兼顾通用性(哈工大《同义词词林》)与电商特性(爬取京东TOP100商品高频评论自建)。
2.规则增强层(Preprocessor.py内嵌逻辑):
- 程度副词修饰:识别“非常”“极其”“有点”“略微”,对后续形容词权重进行×2、×1.5、×0.5、×0.3缩放;
- 否定词反转:检测“不”“没”“未”“非”,将紧邻形容词权重取反(如“不满意”→原词权重×(-1));
- 情感反转短语:硬编码常见反转结构,如“虽然…但是…”取后半句情感,“不是…而是…”取后半句,“除了…其他都…”取“其他”部分。
3.聚合决策层(train.py入口):对单条评论分词后的所有词根,累加其加权得分,按阈值划分为三类:
- 得分 ≥ 1.5 → 正向(⭐⭐⭐⭐⭐)
- 得分 ∈ [-0.5, 1.5) → 中性(⭐⭐⭐)
- 得分 < -0.5 → 负向(⭐⭐)
注意:
train.py并非训练神经网络,而是训练词典——它接收你提供的corpus/目录下的正/负样本评论(如positive_001.txt),自动统计高频情感词及其共现模式,生成优化版词典。这比盲目调参更贴近实际需求。
3. 核心模块详解与实操要点:从环境搭建到跑出第一份情感报告
3.1 环境准备与依赖管理:为什么requirements.txt里锁死了playwright==1.32.0?
本工具包对环境的要求看似宽松(Windows/macOS/Linux均可),但实操中最大的坑往往来自依赖冲突。以Playwright为例:
- Playwright 1.40+ 版本强制要求Chromium 120+,而某些Linux发行版(如Ubuntu 20.04)默认源中的libicu库版本过低,导致Chromium启动失败;
- Playwright 1.25以下版本不支持page.route()拦截XHR,无法实现评论接口的精准捕获;
- 因此,requirements.txt中明确指定playwright==1.32.0,并在README.md中强调:“安装后务必运行playwright install chromium,否则DataSpider.py将报错BrowserType.launch: Executable doesn't exist”。
完整的环境初始化流程如下(以Windows为例,macOS/Linux仅命令微调):
1.创建隔离环境:bash python -m venv jd_env jd_env\Scripts\activate.bat
2.安装核心依赖:bash pip install -r requirements.txt # 此步骤会自动安装:scrapy==2.8.0, requests==2.31.0, jieba==0.42.1, pandas==1.5.3, playwright==1.32.0
3.安装浏览器二进制:bash playwright install chromium # 若国内网络慢,可先设置镜像:set PLAYWRIGHT_DOWNLOAD_HOST=https://npmmirror.com/mirrors/playwright
4.验证安装:bash python -c "import scrapy; print(scrapy.__version__)" python -c "from playwright.sync_api import sync_playwright; print('OK')"
实操心得:曾有学生反馈“Scrapy运行时报
ModuleNotFoundError: No module named 'twisted'”,根源是未激活虚拟环境,直接在全局pip中安装。务必养成activate后操作的习惯。另,requirements.txt中pydantic==1.10.12被锁定,因新版pydantic v2与Scrapy 2.8存在兼容问题,此细节在README.md的“常见问题”章节有专门说明。
3.2 商品数据抓取实操:以京东某款iPhone为例,跑通Scrapy全流程
假设你要抓取京东商品ID为100042373691(iPhone 15 Pro)的实时价格、销量、店铺名。操作步骤如下:
1.配置起始URL:编辑JD_Spider_for_bishe.py,定位到start_urls变量:python start_urls = [ 'https://item.jd.com/100042373691.html', # 可追加更多ID,如 'https://item.jd.com/100042373692.html' ]
2.设置代理(可选但推荐):在settings.py中取消注释并修改:python # 启用代理中间件 DOWNLOADER_MIDDLEWARES = { 'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware': 110, 'your_project.middlewares.ProxyMiddleware': 100, } # 代理列表文件路径(自行准备proxies.txt,每行一个http://user:pass@ip:port) PROXY_LIST_FILE = 'proxies.txt'
3.启动爬虫:在项目根目录执行:bash scrapy crawl jd_spider -o iphone15_pro.json-o参数指定输出文件,Scrapy会自动将ProductItem序列化为JSON。
- 查看结果:打开
iphone15_pro.json,内容类似:json { "title": "Apple iPhone 15 Pro (A17 Pro芯片)", "price": "7999.00", "sales": "20万+", "shop_name": "Apple京东自营旗舰店", "good_rate": "98%" }
关键实现细节解析:
-价格提取:京东价格藏在<script>中var priceInfo = {...},Scrapy使用response.css('script::text').re_first(r'var priceInfo = (\{.*?\});')匹配,再用json.loads()解析,避免正则误匹配其他JS变量;
-销量清洗:"20万+"经re.sub(r'[^\d.]', '', sales_str)转为200000,便于后续数值分析;
-反爬应对:settings.py中DEFAULT_REQUEST_HEADERS已预置京东认可的User-Agent和Referer,且DOWNLOAD_DELAY = 1.5(1.5秒延迟)规避频率限制。
注意:若抓取失败,先检查
scrapy crawl jd_spider -s LOG_LEVEL=DEBUG输出的DEBUG日志,重点关注403 Forbidden是否由Referer缺失导致——此时需在start_requests()方法中手动添加headers={'Referer': 'https://www.jd.com/'}。
3.3 京东评论爬取与情感打分:从原始评论到可视化图表的完整链路
这是整个工具包最具教学价值的部分。我们以抓取100042373691商品的最新200条评论为例:
1.启动评论爬虫:bash python DataSpider.py --sku 100042373691 --count 200 --output comments_raw.csv--count指定抓取条数,--output指定输出CSV路径。脚本会自动调用Playwright打开页面,滚动加载评论,截获XHR请求,最终生成含user_id,score,content,date字段的CSV。
数据清洗与分词:
bash python Preprocessor.py --input comments_raw.csv --output comments_cleaned.csv
此步骤执行:
- 去除广告(正则匹配【.*?】|<.*?>|https?://\S+);
- 过滤短评(长度<5字符的评论视为无效);
- 中文分词:jieba.lcut_for_search(content)确保“苹果手机”被切为['苹果', '手机']而非['苹果手机'],提升词典匹配覆盖率。情感打分:
bash python train.py --input comments_cleaned.csv --dict sample_dic.txt --output sentiment_result.csvtrain.py并非训练模型,而是:
- 读取comments_cleaned.csv的content列;
- 对每条评论执行分词→查词典→应用程度/否定规则→累加得分→按阈值分类;
- 输出sentiment_result.csv,新增sentiment_score,sentiment_label两列。可视化分析(可选):
工具包附带analysis.py脚本,一键生成:
- 情感分布饼图(正/中/负占比);
- 评分-情感散点图(验证打分合理性:5星评论是否多为正向);
- 高频情感词云(wordcloud库生成)。
执行:python analysis.py --input sentiment_result.csv,图表保存至img/目录。
实操心得:曾有用户反馈“打分全是中性”,排查发现其
sample_dic.txt中情感词权重全为0。正确做法是:先用corpus/example_comments.txt(含10条已标注样本)测试train.py,确认输出与预期一致后再扩展。另外,Preprocessor.py中STOPWORDS集合已内置电商停用词(如“京东”“物流”“快递”),避免这些高频词干扰情感判断。
4. 常见问题与排查技巧实录:那些文档里不会写的“血泪经验”
4.1 爬虫类问题速查表
| 问题现象 | 根本原因 | 排查步骤 | 解决方案 |
|---|---|---|---|
scrapy crawl jd_spider报403 Forbidden | 京东服务器识别出非浏览器请求 | 1. 用浏览器访问目标URL,F12查看Network中Headers的User-Agent和Referer2. 对比Scrapy日志中实际发送的Headers | 在settings.py中更新DEFAULT_REQUEST_HEADERS,确保Referer指向商品列表页(如https://list.jd.com/list.html?cat=9987,653,655) |
DataSpider.py启动Playwright报Executable doesn't exist | Chromium未安装或路径错误 | 1. 运行playwright install-deps chromium(Linux需)2. 检查 playwright install chromium输出路径 | Windows/macOS用户只需执行playwright install chromium;Linux用户需先apt-get install libnss3 libatk1.0-0 libatk-bridge2.0-0 libcups2 libdrm2 libxkbcommon0 libxcomposite1 libxdamage1 libxfixes3 libxrandr2 libgbm1 libpango-1.0-0 libcairo2 libasound2 |
抓取的销量显示为"0"或"null" | 销量数据通过AJAX异步加载,Scrapy未等待 | 1. 在浏览器中禁用JS,刷新页面,观察销量是否仍显示 2. 查看Network面板,筛选XHR,找包含 sale或comment的请求 | 改用DataSpider.py方案,或在Scrapy中集成scrapy-splash,配置SPLASH_URL = 'http://localhost:8050'并启动Splash服务 |
| 代理IP频繁失效,爬虫速度骤降 | 免费代理池质量差,响应超时率高 | 1. 在ProxyMiddleware.py中添加日志:self.logger.debug(f"Using proxy {proxy}")2. 观察日志中连续失败的代理IP | 将PROXY_LIST_FILE指向高质量代理文件(如购买的住宅代理),或临时关闭代理(注释DOWNLOADER_MIDDLEWARES中代理相关行) |
4.2 情感分析类问题速查表
| 问题现象 | 根本原因 | 排查步骤 | 解决方案 |
|---|---|---|---|
所有评论得分集中在[-0.2, 0.3]区间,几乎全是中性 | 词典覆盖不足,或规则未生效 | 1. 取一条典型正向评论(如“太棒了,超出预期!”),在Preprocessor.py中print(seg_list)查看分词结果2. 检查 sample_dic.txt是否包含“棒”“超出”“预期” | 手动向sample_dic.txt添加:棒 2、超出 1、预期 1;重启train.py |
| “不推荐”被判为正向(得分>0) | 否定词规则未匹配到“不推荐”中的“不” | 1. 在Preprocessor.py的否定词列表中检查是否包含'不'2. 添加调试: print(f"Neg word found: {neg_word}, next word: {next_word}") | 确保否定词列表为NEG_WORDS = ['不', '没', '未', '非', '勿', '莫'],且规则逻辑为if word in NEG_WORDS and i < len(words)-1: words[i+1] = -words[i+1] |
分词结果出现['苹', '果', '手', '机'](单字切分) | jieba未启用精准模式或词典未加载 | 1. 检查Preprocessor.py中是否调用jieba.load_userdict('user_dict.txt')2. 运行 python -c "import jieba; print(jieba.lcut('苹果手机'))" | 在Preprocessor.py开头添加:jieba.suggest_freq(('苹果手机'), True),或创建user_dict.txt写入苹果手机 100 nz |
4.3 独家避坑技巧:那些让我熬过三个通宵才总结的经验
技巧1:用“最小可行评论集”验证情感逻辑
不要一上来就跑200条评论。先在corpus/下新建test_comments.txt,写3条人工标注的评论:【正向】手机非常好,拍照清晰,电池耐用! 【中性】颜色和图片一样,没什么特别的。 【负向】发货太慢,包装破损,客服态度差。
然后运行python train.py --input test_comments.txt --dict sample_dic.txt,检查输出是否严格匹配你的预期。这比调试200条数据快10倍。技巧2:Scrapy Pipeline的“防重复插入”设计
课程设计常需多次运行爬虫,但-o参数会覆盖旧文件。在pipelines.py中加入:
```python
import os
from scrapy.exporters import JsonLinesItemExporter
class DeduplicatePipeline:
definit(self):
self.seen_ids = set()
def process_item(self, item, spider): if item.get('id') in self.seen_ids: # 假设商品有唯一id字段 raise DropItem(f"Duplicate item found: {item}") self.seen_ids.add(item.get('id')) return item`` 并在settings.py`中启用,从此告别重复数据污染分析结果。
- 技巧3:
requirements.txt的“版本锁死”哲学
工具包中所有包版本均经实测兼容。若你升级scrapy到2.9,可能因Twisted版本冲突导致CrawlerProcess无法启动。牢记:学术项目追求稳定性而非前沿性。如需升级,务必在虚拟环境中pip install scrapy==2.9后,逐个测试scrapy crawl jd_spider、python DataSpider.py、python train.py三大主流程。
5. 教学与毕设场景下的灵活应用:如何把这套工具变成你的“加分项”
这套工具包的价值,远不止于“能跑通”。在课程设计或毕业设计中,它能成为你展示工程思维、问题拆解能力、学术规范意识的绝佳载体。以下是几种高阶用法:
5.1 课程设计:用“对比实验”体现科研素养
不要只写“我用了Scrapy”,而是设计对比实验:
-实验组A:Scrapy方案(默认配置);
-实验组B:Scrapy + 代理池(proxies.txt含10个IP);
-实验组C:Requests+Playwright方案。
记录三组在抓取100个SKU时的:
- 总耗时(分钟);
- 成功率(成功抓取SKU数/100);
- 平均单SKU耗时(秒);
- 内存占用峰值(MB)。
用pandas生成对比表格,结论不是“B最快”,而是:“代理池在高并发下提升成功率12%,但因IP质量参差,平均耗时增加18%;Playwright方案虽单次耗时最长,但对动态渲染页面成功率100%,适合攻坚任务”。——这便是评审老师眼中的“科研能力”。
5.2 毕业设计:将工具包作为“数据基石”,延伸业务分析
工具包本身是数据获取层,你的毕设应在此之上构建分析层。例如:
-选题:“基于京东手机评论情感分析的用户关注点演化研究(2020-2023)”;
-操作:用本工具包分别抓取2020、2021、2022、2023年各季度TOP10手机的评论;
-分析:
- 统计每年“拍照”“续航”“发热”“信号”等关键词的提及频次;
- 计算各关键词对应评论的情感得分均值;
- 绘制折线图:X轴为年份,Y轴为“发热”词的情感均值,观察是否逐年下降(反映厂商改进)。
此时,工具包是你论文中“数据采集方法”章节的扎实支撑,而非全文重点。
5.3 教学演示:用“可调试代码”让学生真正看懂
作为助教或讲师,在课堂上演示时,切忌直接运行python train.py。而是:
1. 打开sample_dic.txt,现场添加一个新词卡顿 -2;
2. 打开Preprocessor.py,找到def calculate_sentiment()函数,在for word in seg_list:循环内插入print(f"Word: {word}, Score: {score_dict.get(word, 0)}");
3. 运行python train.py --input corpus/example_comments.txt,让学生亲眼看到“卡顿”如何被识别、如何贡献负分。
这种“代码即教案”的方式,远胜于PPT上罗列10条规则。
最后分享一个小技巧:在你的毕设答辩PPT中,不要放满屏代码。而是放一张工具包架构图(文字描述即可):
[京东商品页] → [Scrapy引擎] → [清洗后JSON] ↓ [京东评论区] → [Playwright+Requests] → [原始CSV] → [Preprocessor.py] → [清洗CSV] → [train.py] → [情感标签CSV] ↓ [analysis.py] → [饼图/词云]然后指着图说:“我的工作聚焦于绿色箭头部分——即如何让train.py的规则逻辑更贴合电商语境,比如针对‘发烫’‘烧屏’等专业词汇扩充词典,并验证其对负向评论识别率的提升”。——瞬间,你从“工具使用者”升维为“方案改进者”。
本文还有配套的精品资源,点击获取
简介:一套可直接运行的电商数据采集与评论情感分析工具,支持京东、天猫、苏宁三家平台的商品标题、价格、销量、店铺等结构化信息批量获取;内置京东评论爬虫模块,覆盖动态渲染页面处理、代理轮换、反爬策略应对;评论分析部分提供轻量级NLP预处理流程——从原始评论清洗、中文分词,到基于自定义词典与规则匹配的情感倾向判定(正向/中性/负向),附带预置语料库、示例情感词典(sample_dic.txt)、分词预处理脚本(Preprocessor.py)及简易模型训练入口(train.py);代码兼容Windows/macOS/Linux,依赖通过requirements.txt统一管理,所有模块均经本地实测验证;配套README.md详述各脚本用途、启动方式、参数说明与常见问题排查步骤,适用于数据分析入门练习、课程设计、毕设原型开发或教学演示场景;资源仅供学习研究与非商业用途。
本文还有配套的精品资源,点击获取
