2021/5/11 数据科学实验笔记 周三
随着电子商务的迅速发展和网络购物的流行,人们对于网络购物的需求变得越来越高,也给电商企业带来巨大的发展机遇,与此同时,这种需求也推动了更多电商企业的崛起,引发了激烈的竞争。而在这种激烈竞争的大背景下,除了提高商品质量、压低价格外,了解更多消费者的心声对电商企业来说也变得越来越有必要。其中非常重要的方式就是对消费者的评论文本数据进行内在信息的分析。
评论信息中蕴含着消费者对特定产品和服务的主观感受,反应了人们的态度、立场和意见,具有非常宝贵的研宄价值。一方面,对企业来说,企业需要根据海量的评论文本数据去更好的了解用户的个人喜好,从而提高产品质量,改善服务,获取市场上的竞争优势。另一方面,消费者需要在没有看到真正的产品实体、做出购买决策之前,根据其他购物者的评论了解产品的质量、性价比等信息,为购物抉择提供参考依据。
即如何使用R进行爬虫
步骤
1、在官网下载google chrome浏览器并安装
2、在该浏览器打开“京东商城”,
并在京东商城网页右上角位置找到“Web开发者工具”按钮。
3、打开网络(Network)面板,再点击京东商城网页中的评论项,找到评论项的网址(URL)。
详细步骤:
1)打开京东商城 选择一个商品【以小米手机K40 PRO 为例】
2)打开该商品页面,并打开评论区域
3)打开开发者工具
4)点击代码页面里面的 network
5)点击网页页面里面的 “好评”
6)点击代码框里面 “好评ProductPageComment” 的选项
7)点击“Headers”
得到URL如下:
Request URL: https://club.jd.com/comment/productPageComments.action?callback=fetchJSON_comment98&productId=100018642156&score=3&sortType=5&page=0&pageSize=10&isShadowSku=0&fold=1
接下来在R中输入代码:
(如果第一次使用,要下载#后面所示的两个包)
# 代码 8-1 京东商品文本爬虫
# 设置工作目录
#setwd("F:/第8章/01-任务程序")
# 对一个URL进行测试,注意网络打开状态
url <- 'https://club.jd.com/comment/productPageComments.action?callback=fetchJSON_comment98vv80998&productId=1106432&score=0&sortType=5&page=0&pageSize=10&isShadowSku=0&rid=0&fold=1'
#url <- 'https://club.jd.com/comment/productPageComments.action?callback=fetchJSON_comment98&productId=100018642156&score=3&sortType=5&page=0&pageSize=10&isShadowSku=0&fold=1'
# 加载需要的包
#install.packages("RCurl")
#install.packages("jsonlite")
library(RCurl) # 需要使用getURL函数
library(jsonlite) # Version:1.5 需要使用fromJSON函数
# 读取网页源码
web <- getURL(url, .encoding = 'GBK')
—————————————————————————————————
(其中到这一行代码一直报错,如下所示:
# 读取网页源码
web <- getURL(url, .encoding = 'GBK')
我现在也不知道为什么,其中报错的结果是这样的:
> web <- getURL(url, .encoding = 'GBK')
Warning message:
In grepl("\\\\u[0-9A-Fa-f]", str) : 输入的字符串1不适用于此语言环境
如果等我解决了我就把解决方法更新在下面
wait to be edit
—————————————————————————————————
接下来的R代码为:
# 代码 8-2
# 由于读取到的源码不是标准的JSON格式,因此需要将符合JSON格式的内容提取出来
web <- substr(web,
nchar("fetchJSON_comment98") + 2,
nchar(web) - 2)
#注意:引号里的东西在路径里查找
# 将JSON格式数据转为R语言列表格式
result <- jsonlite::fromJSON(web)
# 提取评论数据(注意:只有第一页的数据被提取了)
result$comments$referenceName # 品牌名
result$comments$nickname # 用户昵称
result$comments$creationTime # 发表时间
result$comments$content # 评论内容
# 代码 8-3
# 批量提取评论数据
# 首先先构建评论地址
# 其中score=1表示差评数据,3表示好评数据
pos_url <- list() # 初始化好评评论地址集
neg_url <- list() # 初始化差评评论地址集
n <- 100 # 该商品评论页数最大100页
for(i in 1:n){
pos_url[[i]] <- paste0('https://club.jd.com/comment/productPageComments.action?callback=fetchJSON_comment98vv80998&productId=1106432&score=3&sortType=5&page=',i-1,'&pageSize=10&isShadowSku=0&rid=0&fold=1')
neg_url[[i]] <- paste0('https://club.jd.com/comment/productPageComments.action?callback=fetchJSON_comment98vv80998&productId=1106432&score=1&sortType=5&page=',i-1,'&pageSize=10&isShadowSku=0&rid=0&fold=1')
}
content_url <- data.frame(pos_url = unlist(pos_url),
neg_url = unlist(neg_url))
#查看内容
dim(content_url)#100行2列
str(content_url)
head(content_url)
# 批量提取评论数据
pos_content <- list()
neg_content <- list()
# 这里是20页,也可以是100
for(i in 1:20){
# 好评数据提取
#获取源代码
pos_web <- getURL(as.character(content_url[i, 1]), .encoding = 'GBK')
#转换json格式为R语言格式
pos_web <- substr(pos_web,
nchar("fetchJSON_comment98vv80926") + 2,
nchar(pos_web) - 2)
#提取JSON格式
pos_result <- jsonlite::fromJSON(pos_web)
pos_content[[i]] <- data.frame(referenceName = pos_result$comments$referenceName,
nickname = pos_result$comments$nickname,
creationTime = pos_result$comments$creationTime,
content = pos_result$comments$content)
message("pos_page ", i)
Sys.sleep(2)
# 差评数据提取
neg_web <- getURL(as.character(content_url[i, 2]), .encoding = 'GBK')
neg_web <- substr(neg_web,
nchar("fetchJSON_comment98vv80926") + 2,
nchar(neg_web) - 2)
neg_result <- jsonlite::fromJSON(neg_web)
neg_content[[i]] <- data.frame(referenceName = neg_result$comments$referenceName,
nickname = neg_result$comments$nickname,
creationTime = neg_result$comments$creationTime,
content = neg_result$comments$content)
message("neg_page ", i)
Sys.sleep(2)
}
str(pos_content)
pos_reviews <- Reduce(rbind, pos_content)
pos_reviews$type <- rep('pos', nrow(pos_reviews)) #标记好评
head(pos_reviews)
neg_reviews <- Reduce(rbind, neg_content)
neg_reviews$type <- rep('neg', nrow(pos_reviews)) #标记差评
head(neg_reviews)
reviews <- rbind.data.frame(pos_reviews, neg_reviews)
head(reviews)
# 将评论数据输出
write.csv(reviews, "./tmp/reviews.csv", row.names = FALSE)
LDA(Latent Dirichlet Allocation)是一种文档主题生成模型,也称为一个三层贝叶斯概率模型,包含词、主题和文档三层结构。所谓生成模型,就是说,我们认为一篇文章的每个词都是通过“以一定概率选择了某个主题,并从这个主题中以一定概率选择某个词语”这样一个过程得到。文档到主题服从多项式分布,主题到词服从多项式分布。
本案例向读者展示了如何使用R语言处理电商文本评论数据。通过R语言进行案例数据爬取,对文本数据进行预处理,分词,去除停用词等操作,在知网情感词表上进行优化,进行基于词表的情感分析,最后使用LDA主题模型对正负面评论进行主题分析。