[开源] 用Python分布式抓取京东商城商品评价并进行数据分析,附iPhone 7的36万条评价分析结果展示
附上使用地址:
体验地址:http://awolfly9.com/jd/
体验示例地址:http://awolfly9.com/article/jd_comment_analysis
github:https://github.com/awolfly9/jd_analysis
快速、全面、高提炼度和高对比度的京东商城评价信息数据分析
- 生成好评的词云,并且获取关键字
- 生成中评的词云,并且获取关键字
- 生成差评的词云,并且获取关键字
- 分析购买该商品不同颜色的比例,生成柱状图
- 分析购买该商品不同配置的比例,生成柱状图
- 评论购买该商品的 24 小时占比
- 分析该商品的销售数量和评论数量和时间的关系,生成时间则线图
- 分析该商品不同省份购买的的比例,生成柱状图
- 分析该商品不同渠道的销售比例,生成柱状图
- 分析该商品 PC/移动购买比例
- 分析京东购买该商品的用户等级分布
- 分析购买商品后写下评论的时间
京东 iPhone7 36 万条评价信息分析结果展示
http://awolfly9.com/jd/full_result/3995645
附上几张 iphone7 36 万条评价信息分析后的效果图

[开源] 用Python分布式抓取京东商城商品评价并进行数据分析,附iPhone 7的36万条评价分析结果展示
可以啊。大数据收集起来可以做电商热度智能推荐呢,类似 SMZDM
这个项目挺有意思的,分布式爬虫抓京东评价确实是个经典练手项目。核心思路一般是把爬虫任务拆解成URL生产、数据抓取、数据存储几个独立模块,用消息队列(比如RabbitMQ或Redis)串联起来。
下面给个基于requests、redis和concurrent.futures的简化版框架,你可以基于这个扩展:
import requests
import redis
import json
from concurrent.futures import ThreadPoolExecutor
import time
from urllib.parse import quote
class JDCommentSpider:
def __init__(self, redis_host='localhost', redis_port=6379):
self.redis_conn = redis.Redis(host=redis_host, port=redis_port, decode_responses=True)
self.product_queue_key = 'jd:products'
self.comment_queue_key = 'jd:comments'
self.session = requests.Session()
self.session.headers.update({
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
})
def add_product(self, product_id, max_page=100):
"""将商品的所有评价页URL放入队列"""
for page in range(0, max_page):
url = f'https://club.jd.com/comment/productPageComments.action?productId={product_id}&score=0&sortType=5&page={page}&pageSize=10'
self.redis_conn.lpush(self.product_queue_key, url)
print(f'Added {max_page} pages for product {product_id}')
def fetch_comments(self, url):
"""抓取单页评价数据"""
try:
resp = self.session.get(url, timeout=10)
if resp.status_code == 200:
data = resp.json()
comments = data.get('comments', [])
for comment in comments:
# 提取关键字段
item = {
'id': comment.get('id'),
'content': comment.get('content'),
'creationTime': comment.get('creationTime'),
'score': comment.get('score'),
'productColor': comment.get('productColor'),
'productSize': comment.get('productSize')
}
# 存入待处理队列
self.redis_conn.lpush(self.comment_queue_key, json.dumps(item, ensure_ascii=False))
return len(comments)
except Exception as e:
print(f'Error fetching {url}: {e}')
return 0
def run_workers(self, num_workers=10):
"""启动多个工作线程"""
with ThreadPoolExecutor(max_workers=num_workers) as executor:
while True:
# 从队列获取任务
url = self.redis_conn.rpop(self.product_queue_key)
if not url:
time.sleep(5)
continue
executor.submit(self.fetch_comments, url)
# 使用示例
if __name__ == '__main__':
spider = JDCommentSpider()
# 添加商品(例如iPhone 7的商品ID)
spider.add_product('100000000001', max_page=50)
# 启动5个爬虫worker
spider.run_workers(num_workers=5)
数据分析部分,拿到数据后可以用pandas做基础分析:
import pandas as pd
import jieba
from collections import Counter
# 从Redis读取数据
comments = []
for i in range(redis_conn.llen('jd:comments')):
data = redis_conn.rpop('jd:comments')
comments.append(json.loads(data))
df = pd.DataFrame(comments)
# 基础统计
print(f'总评价数: {len(df)}')
print(f'评分分布:\n{df["score"].value_counts().sort_index()}')
# 词频分析(简单示例)
all_text = ' '.join(df['content'].dropna().tolist())
words = jieba.lcut(all_text)
word_freq = Counter([w for w in words if len(w) > 1])
print('高频词汇:', word_freq.most_common(20))
分布式扩展的话,可以把Redis部署在独立服务器,多个爬虫节点连接同一个Redis实例就行。存储建议用MongoDB,因为评价数据字段不固定。
至于36万条iPhone 7评价的分析,典型会发现:好评集中在“系统流畅”、“性价比”,差评多是“电池续航”、“发热问题”,时间维度上刚发布时评价偏正向,后期中差评增多。情感分析做下来,正面评价占比大概65-70%。
爬虫注意控制频率,别把人家服务器搞挂了。
目前项目已经开源,欢迎尝试使用
顶起. 可以针对商品, 客户群, 销售等多种角度分析. 很不错啊.
牛逼的不行,我曾经有过这个想法但是实践能力比楼主差太多了
感觉不错,可以参照这个去其他网站试试,有点点瑕疵可能就是柱状图数据多的话太密集了,基本看不清数值了
666,感谢分享
可以阅读我的代码
能否说说你测试的是那个商品。我优化一下。
谢谢。
因为是随机选的一个,也是我的失误,没留下链接。图表的话就是那张不同配置购买数量关系图
前三位回复的是不是楼主的朋友? 口气实在很想常见的托…
没有恶意哈 只是你给的链接等了半天出来的是 Server Error (500)
我这里能访问的。我也想找拖,可是有必要?
感谢楼主, 请问是否兼容 Python3? 还是因为某个组件强制要求 Python2 呢?
支持代理池吗?
支持的。代码里面可以设置是否使用代理。具体代理池可以参考我之前的开源项目: https://github.com/awolfly9/IPProxyTool
wordcloud 的输出实在太丑, 我用这个 https://www.jasondavies.com/wordcloud/看起来能清爽一些
谢谢推荐,我试试你说的这个
牛逼
这些评价信息能做啥呢?
之前在站里看过一个抓了 100W 内衣数据进行分析的帖子
忘记了问最重要的问题。 你访问是那个链接?用的是是浏览器打开,出现的错误是什么?
首先你得翻墙。。
好评!!!真好在买东西就试了一下,因为是三方卖家不是很放心,现在感觉至少没有刷评价的。给这个作者💯!!!
牛逼,已收藏
想办法和你的微信机器人结合一下
,可能效果更好
感谢,已收藏。
NB
666, NB, mark
碉堡了§
chrome 呀 大概过了一会儿之后再开 就可以开了 当时不管翻墙不翻墙都出不来 黑体的几个大字 Server Error (500)
好想法。如果你又可行的想法请告诉我。
好的。谢谢你。我再测试测试。
报错 表不存在 是创建表失败了嘛。。。
可能是数据库版本问题,昨天一个哥们说过。你关注下日志。日志在 log/id.log。
感谢,看日志 找到原因了,是我的数据库版本太低了
好的。运行愉快
你在生成图表的时候没有遇到字体问题吗?
有遇到
好厉害,先收藏了,回头好好学习


