python 爬取京东指定商品评论并进行情感分析


Posted in Python onMay 27, 2021

项目地址

https://github.com/DA1YAYUAN/JD-comments-sentiment-analysis

爬取京东商城中指定商品下的用户评论,对数据预处理后基于SnowNLP的sentiment模块对文本进行情感分析。

运行环境

  • Mac OS X
  • Python3.7 requirements.txt
  • Pycharm

运行方法

数据爬取(jd.comment.py)

  1. 启动jd_comment.py,建议修改jd_comment.py中变量user-agent为自己浏览器用户代理
  2. 输入京东商品完整URL
  3. 得到京东评论词云,存放于jd_ciyun.jpg(词云轮廓形状存放于jdicon.jpg)
  4. 得到京东评论数据,存放于jd_comment.csv
import os
import time
import json
import random
import csv
import re

import jieba
import requests
import numpy as np
from PIL import Image
import matplotlib.pyplot as plt
from wordcloud import WordCloud

# 词云形状图片
WC_MASK_IMG = 'jdicon.jpg'
# 评论数据保存文件
COMMENT_FILE_PATH = 'jd_comment.txt'
# 词云字体
WC_FONT_PATH = '/Library/Fonts/Songti.ttc'


def spider_comment(page=0, key=0):
    """
    爬取京东指定页的评价数据
    :param page: 爬取第几,默认值为0
    """

    url = 'https://club.jd.com/comment/productPageComments.action?callback=fetchJSON_comment98vv4646&productId=' + key + '' \
          '&score=0&sortType=5&page=%s&pageSize=10&isShadowSku=0&fold=1' % page
    kv = {'user-agent': 'Mozilla/5.0', 'Referer': 'https://item.jd.com/'+ key + '.html'}#原本key不输入值,默认为《三体》

    try:
        r = requests.get(url, headers=kv)
        r.raise_for_status()
    except:
        print('爬取失败')
    # 截取json数据字符串
    r_json_str = r.text[26:-2]
    # 字符串转json对象
    r_json_obj = json.loads(r_json_str)
    # 获取评价列表数据
    r_json_comments = r_json_obj['comments']
    # 遍历评论对象列表
    for r_json_comment in r_json_comments:
        # 以追加模式换行写入每条评价
        with open(COMMENT_FILE_PATH, 'a+') as file:
            file.write(r_json_comment['content'] + '\n')
        # 打印评论对象中的评论内容
        print(r_json_comment['content'])


def batch_spider_comment():
    """
        批量爬取某东评价
        """
    # 写入数据前先清空之前的数据
    if os.path.exists(COMMENT_FILE_PATH):
        os.remove(COMMENT_FILE_PATH)
    key = input("Please enter the address:")
    key = re.sub("\D","",key)
    #通过range来设定爬取的页面数
    for i in range(10):
        spider_comment(i,key)
        # 模拟用户浏览,设置一个爬虫间隔,防止ip被封
        time.sleep(random.random() * 5)


def cut_word():
    """
    对数据分词
    :return: 分词后的数据
    """
    with open(COMMENT_FILE_PATH) as file:
        comment_txt = file.read()
        wordlist = jieba.cut(comment_txt, cut_all=False)#精确模式
        wl = " ".join(wordlist)
        print(wl)
        return wl


def create_word_cloud():
    """44144127306
    生成词云
    :return:
    """
    # 设置词云形状图片
    wc_mask = np.array(Image.open(WC_MASK_IMG))
    # 设置词云的一些配置,如:字体,背景色,词云形状,大小
    wc = WordCloud(background_color="white", max_words=2000, mask=wc_mask, scale=4,
                   max_font_size=50, random_state=42, font_path=WC_FONT_PATH)
    # 生成词云
    wc.generate(cut_word())
    # 在只设置mask的情况下,你将会得到一个拥有图片形状的词云
    plt.imshow(wc, interpolation="bilinear")
    plt.axis("off")
    plt.figure()
    plt.show()
    wc.to_file("jd_ciyun.jpg")


def txt_change_to_csv():
    with open('jd_comment.csv', 'w+', encoding="utf8", newline='')as c:
        writer_csv = csv.writer(c, dialect="excel")
        with open("jd_comment.txt", 'r', encoding='utf8')as f:
            # print(f.readlines())
            for line in f.readlines():
                # 去掉str左右端的空格并以空格分割成list
                line_list = line.strip('\n').split(',')
                print(line_list)
                writer_csv.writerow(line_list)

if __name__ == '__main__':
    # 爬取数据
    batch_spider_comment()

    #转换数据
    txt_change_to_csv()

    # 生成词云
    create_word_cloud()

模型训练(train.py)

  1. 准备正负语料集online_shopping_10_cats.csv,分别存入negative.txt和positive.txt
  2. 启动train.py,新建文件sentiment.marshal,存入训练后的模型
  3. 找到外部库中snownlp中sentiment模块,将训练得到的sentiment.marshal.3文件覆盖sentiment模块中自带的sentiment.marshal.3
# -*-coding:utf-8-*-

def train():
    from snownlp import sentiment
    print("开始训练数据集...")
    sentiment.train('negative.txt', 'positive.txt')#自己准备数据集
    sentiment.save('sentiment.marshal')#保存训练模型
    #python2保存的是sentiment.marshal;python3保存的是sentiment.marshal.3
    "训练完成后,将训练完的模型,替换sentiment中的模型"

def main():
    train()  # 训练正负向商品评论数据集
    print("数据集训练完成!")

if __name__ == '__main__':
    main()

情感分析(sentiment.analysis.py)

  1. 启动sentiment.analysis.py
  2. 开始对jd_comment.csv中评论进行数据处理,处理后文件存入processed_comment_data.csv
  3. sentiment模块根据sentiment.marshal.3对评论进行情感评分,评分结果存入result.csv
  4. 评分结果可视化,生成文件fig.png
from snownlp import sentiment
import pandas as pd
import snownlp
import matplotlib.pyplot as plt
from matplotlib.font_manager import FontProperties

#from word_cloud import word_cloud_creation, word_cloud_implementation, word_cloud_settings

def read_csv():
    '''读取商品评论数据文件'''
    comment_data = pd.read_csv('jd_comment.csv', encoding='utf-8',
                               sep='\n', index_col=None)
    #返回评论作为参数
    return comment_data


def clean_data(data):
    '''数据清洗'''
    df = data.dropna()  # 消除缺失数据 NaN为缺失数据
    df = pd.DataFrame(df.iloc[:, 0].unique())  # 数据去重
    return df
    # print('数据清洗后:', len(df))


def clean_repeat_word(raw_str, reverse=False):
    '''去除评论中的重复使用的词汇'''
    if reverse:
        raw_str = raw_str[::-1]
    res_str = ''
    for i in raw_str:
        if i not in res_str:
            res_str += i
    if reverse:
        res_str = res_str[::-1]
    return res_str


def processed_data(filename):
    '''清洗完毕的数据,并保存'''
    df = clean_data(read_csv())#数据清洗
    ser1 = df.iloc[:, 0].apply(clean_repeat_word)#去除重复词汇
    df2 = pd.DataFrame(ser1.apply(clean_repeat_word, reverse=True))
    df2.to_csv(f'{filename}.csv', encoding='utf-8', index_label=None, index=None)


def train():
    '''训练正向和负向情感数据集,并保存训练模型'''
    sentiment.train('negative.txt', 'positive.txt')
    sentiment.save('seg.marshal')#python2保存的是sentiment.marshal;python3保存的是sentiment.marshal.3


sentiment_list = []

res_list = []


def test(filename, to_filename):
    '''商品评论-情感分析-测试'''
    with open(f'{filename}.csv', 'r', encoding='utf-8') as fr:
        for line in fr.readlines():
            s = snownlp.SnowNLP(line)
            #调用snownlp中情感评分s.sentiments
            if s.sentiments > 0.6:
                res = '喜欢'
                res_list.append(1)
            elif s.sentiments < 0.4:
                res = '不喜欢'
                res_list.append(-1)
            else:
                res = '一般'
                res_list.append(0)
            sent_dict = {
                '情感分析结果': s.sentiments,
                '评价倾向': res,
                '商品评论': line.replace('\n', '')
            }
            sentiment_list.append(sent_dict)
            print(sent_dict)
        df = pd.DataFrame(sentiment_list)
        df.to_csv(f'{to_filename}.csv', index=None, encoding='utf-8',
                  index_label=None, mode='w')


def data_virtualization():
    '''分析结果可视化,以条形图为测试样例'''
    font = FontProperties(fname='/System/Library/Fonts/Supplemental/Songti.ttc', size=14)
    likes = len([i for i in res_list if i == 1])
    common = len([i for i in res_list if i == 0])
    unlikes = len([i for i in res_list if i == -1])

    plt.bar([1], [likes], label='喜欢')#(坐标,评论长度,名称)
    plt.bar([2], [common], label='一般')
    plt.bar([3], [unlikes], label='不喜欢')

    x=[1,2,3]
    label=['喜欢','一般','不喜欢']
    plt.xticks(x, label)

    plt.legend()#插入图例
    plt.xlabel('评价种类')
    plt.ylabel('评价数目')
    plt.title(u'商品评论情感分析结果-条形图', FontProperties=font)
    plt.savefig('fig.png')
    plt.show()
'''
def word_cloud_show():
    #将商品评论转为高频词汇的词云
    wl = word_cloud_creation('jd_comment.csv')
    wc = word_cloud_settings()
    word_cloud_implementation(wl, wc)
'''

def main():
     processed_data('processed_comment_data')#数据清洗
     #train()  # 训练正负向商品评论数据集

     test('jd_comment', 'result')

     print('数据可视化中...')
     data_virtualization()  # 数据可视化

     print('python程序运行结束。')

if __name__ == '__main__':
    main()

 

词云轮廓图

python 爬取京东指定商品评论并进行情感分析

商品评论词云

python 爬取京东指定商品评论并进行情感分析

情感分析结果可视化

python 爬取京东指定商品评论并进行情感分析

以上就是python 爬取京东指定商品评论并进行情感分析的详细内容,更多关于python 爬取京东评论并进行情感分析的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
在Python中使用__slots__方法的详细教程
Apr 28 Python
python登录pop3邮件服务器接收邮件的方法
Apr 30 Python
Python for Informatics 第11章之正则表达式(四)
Apr 21 Python
Python实现的人工神经网络算法示例【基于反向传播算法】
Nov 11 Python
使用实现pandas读取csv文件指定的前几行
Apr 20 Python
python执行精确的小数计算方法
Jan 21 Python
解决Django生产环境无法加载静态文件问题的解决
Apr 23 Python
python实现批量视频分帧、保存视频帧
May 31 Python
python中下标和切片的使用方法解析
Aug 27 Python
使用pytorch和torchtext进行文本分类的实例
Jan 08 Python
基于virtualenv创建python虚拟环境过程图解
Mar 30 Python
pytorch DataLoader的num_workers参数与设置大小详解
May 28 Python
python b站视频下载的五种版本
May 27 #Python
教你怎么用python selenium实现自动化测试
Python Django框架介绍之模板标签及模板的继承
May 27 #Python
python 算法题——快乐数的多种解法
May 27 #Python
用Python监控你的朋友都在浏览哪些网站?
Python图片处理之图片裁剪教程
用Python进行栅格数据的分区统计和批量提取
You might like
php下使用SimpleXML 处理XML 文件
2010/02/27 PHP
PHP使用JpGraph绘制折线图操作示例【附源码下载】
2019/10/18 PHP
一个基于jQuery的树型插件(OrangeTree)使用介绍
2012/05/03 Javascript
在JavaScript中typeof的用途介绍
2013/04/11 Javascript
Google (Local) Search API的简单使用介绍
2013/11/28 Javascript
弹出窗口并且此窗口带有半透明的遮罩层效果
2014/03/13 Javascript
使用VS开发 Node.js指南
2015/01/06 Javascript
JQuery报错Uncaught TypeError: Illegal invocation的处理方法
2015/03/13 Javascript
jQuery实现固定在网页顶部的菜单效果代码
2015/09/02 Javascript
mvc中form表单提交的三种方式(推荐)
2016/08/10 Javascript
AngularJS入门教程之Helloworld示例
2016/12/25 Javascript
简化vuex的状态管理方案的方法
2018/06/02 Javascript
node.js读取Excel数据(下载图片)的方法示例
2018/08/02 Javascript
JQuery模拟实现网页中自定义鼠标右键菜单功能
2018/11/14 jQuery
JQuery搜索框自动补全(模糊匹配)功能实现示例
2019/01/08 jQuery
使用 vue 实例更好的监听事件及vue实例的方法
2019/04/22 Javascript
详解在Angular4中使用ng2-baidu-map的方法
2019/06/19 Javascript
js正则匹配多个全部数据问题
2019/12/20 Javascript
Vue axios获取token临时令牌封装案例
2020/09/11 Javascript
python实现合并两个数组的方法
2015/05/16 Python
Python两个字典键同值相加的几种方法
2019/03/05 Python
值得收藏的10道python 面试题
2019/04/15 Python
用python打印1~20的整数实例讲解
2019/07/01 Python
在Python中使用turtle绘制多个同心圆示例
2019/11/23 Python
基于Python数据分析之pandas统计分析
2020/03/03 Python
Python 面向对象静态方法、类方法、属性方法知识点小结
2020/03/09 Python
CSS3等相关属性制作分页导航实现代码
2012/12/24 HTML / CSS
德国内衣、泳装和睡衣网上商店:Bigsize Dessous
2018/07/09 全球购物
什么是Smarty变量操作符?如何使用Smarty变量操作符
2014/07/18 面试题
TCP协议通讯的过程和步骤是什么
2015/10/18 面试题
ruby如何进行集成操作?Ruby能进行多重继承吗?
2013/10/16 面试题
新闻编辑求职信
2014/07/13 职场文书
2015年元旦晚会活动总结(学生会)
2014/11/28 职场文书
2014年机关后勤工作总结
2014/12/16 职场文书
婚宴邀请函
2015/01/30 职场文书
2015年煤矿工作总结
2015/04/28 职场文书