[开源] 用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万条评价分析结果展示

44 回复

可以啊。大数据收集起来可以做电商热度智能推荐呢,类似 SMZDM


这个项目挺有意思的,分布式爬虫抓京东评价确实是个经典练手项目。核心思路一般是把爬虫任务拆解成URL生产、数据抓取、数据存储几个独立模块,用消息队列(比如RabbitMQ或Redis)串联起来。

下面给个基于requestsredisconcurrent.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

目前只支持 python2。因为我的所有开发都是在 python2 上。以后会迁移到 python3.

谢谢推荐,我试试你说的这个

楼主厉害了!争取今年之内我也能像楼主一样自己能捣鼓出类似的东西

这些评价信息能做啥呢?

之前在站里看过一个抓了 100W 内衣数据进行分析的帖子

我也看到过

可以对数据进行可视化分析

忘记了问最重要的问题。 你访问是那个链接?用的是是浏览器打开,出现的错误是什么?

首先你得翻墙。。

好评!!!真好在买东西就试了一下,因为是三方卖家不是很放心,现在感觉至少没有刷评价的。给这个作者💯!!!

牛逼,已收藏

想办法和你的微信机器人结合一下
,可能效果更好

感谢,已收藏。

666, NB, mark

碉堡了§

chrome 呀 大概过了一会儿之后再开 就可以开了 当时不管翻墙不翻墙都出不来 黑体的几个大字 Server Error (500)

好想法。如果你又可行的想法请告诉我。

好的。谢谢你。我再测试测试。

报错 表不存在 是创建表失败了嘛。。。

可能是数据库版本问题,昨天一个哥们说过。你关注下日志。日志在 log/id.log。

感谢,看日志 找到原因了,是我的数据库版本太低了

好的。运行愉快

你在生成图表的时候没有遇到字体问题吗?

有遇到

能不能接个图,或者说一下你怎么解决的。我忘记写在 README 中了。

好厉害,先收藏了,回头好好学习

回到顶部