在上期学习笔记中,记录了使用rvest包抓取宝贝搜索结果页的过程,其中记录了宝贝ID和sellerID。这次学习使用宝贝ID和sellerID抓取评价。
分析宝贝评价页面结构
上个月刚承老婆大人赏了台Mate9,这次试试看能不能抓到Mate9的评价。
- 打开Mate 9的宝贝页面,记得打开F12(浏览器开发工具),先选到"网络"项目。
- 打开网页上的"累计评价",观察打开此页面后,网页进行了哪些网络请求。
- 评价数据应该不少,找个最大的,把网址复制下来,用浏览器打开一看,哈哈,评价内容果然在里面。(谢谢猫爹!这个要想保密真不是啥难事。顺便给阿里云镜像打个广告,资源挺好的)
该链接返回的是JSON格式的数据,其特点是所有数据都是按照Key:Value的键:值对的形式保存的。Key保存该数据的名称,Value保存值。只是Value值的类型千变万化,啥都可以存。
把返回的JSON数据处理一下,大致能看到对咱们有用的数据主要有:lastPage评价的总页数,page当前的页数,以及rateList中保存的当前页的评价记录。
https://rate.tmall.com/list_detail_rate.htm?itemId=540677983314&spuId=707705213&sellerId=2838892713&order=3¤tPage=1&append=0&content=1&tagId=&posi=&picture=&ua=103UW5TcyMNYQwiAiwTR3tCf0J%2FQnhEcUpkMmQ%3D%7CUm5Ockt%2BSnVMcUt%2FQ39BfSs%3D%7CU2xMHDJ%2BH2QJZwBxX39RaVV7W3UpSC5CJVshD1kP%7CVGhXd1llXGldYltmXGhUaFZqXWBCeExxRXFPcE14QH9EfEl8RWs9%7CVWldfS0SMg03DS0RLg4gWmJSYkZiXy4QfkA1G00b%7CVmhIGCwWNgsrFyMeIAA5BD4KKhYiHSAAPAE0CSkVIR4jAz8COwZQBg%3D%3D%7CV25OHjAePgYyDy8UKBw8BDwFPWs9%7CWGFBET8RMQs0DCwWKBw8AD0DPQZQBg%3D%3D%7CWWBAED5bMlYyagduFX4eMBAsEC8XNwg9HSYfIxwncSc%3D%7CWmNDEz19KWIfYhlHAS8POwc%2FHyMZIBg4AzYNMgheCA%3D%3D%7CW2JCEjwSMgc7Di4SKRYsDDcDPgU%2BaD4%3D%7CXGVFFTteN1YwTjVcJQsrECQdPQE1DjMTKRAvES95Lw%3D%3D%7CXWVFFTsVNWVQbVBwTHRBe1thX2FDe1tnU2pIdEB0QHRPe0J3SHFOcVFtU25OckocPAEhDyEBOwA1ATRiNA%3D%3D%7CXmdHFzl5LXQZZgdqFG5AYFthX39DeU1zU2lTZlNuOG4%3D%7CX2ZbZkZ7W2REeEF9XWNbYUF4WGRZeU1tWHhCYll5QWFdY0N9Kw%3D%3D&isg=AhwcqzXoqOvxDFxK0_jFBVci7DoAO8C_03_Q5vYcaoflQb3LHqawT1uz1xJW&needFold=0&_ksTS=1489240871266_2014&callback=jsonp2015
这个链接真的好长啊,不过没事,咱们记住,一般像这种https://rate.tmall.com/list_detail_rate.htm?... "?"问号后面跟着的大都是参数,参数和参数之间用”&“分隔。然后试一下就发现这个长长的链接可以简化一下。只需要三个参数就可以返回查询结果了,itemId,sellerId和currentPage
https://rate.tmall.com/list_detail_rate.htm?itemId=540677983314&sellerId=2838892713¤tPage=1
- 好了,现在可以抓取评价记录了。代码如下
getAllRate <- function(itemId,sellerId){
# 按商品ID和sellerId抓取评价
# 定义按抓取数据的函数
getURL <- function(url) {
# 按查询商品评价的查询URL抓取评价
# 加载相关包
library(rvest)
library(jsonlite)
tmp <- url %>% read_html(encoding="GBK") %>%
html_nodes("p") %>%
html_text %>%
gsub(pattern="\"rateDetail\":|,\"searchinfo\"(.*)\"", replacement="") %>%
fromJSON
ratetmp <- list(lastPage=tmp$paginator[[2]],
currentPage=tmp$paginator[[3]],
rateLog=data.frame(userNick=tmp$rateList$displayUserNick,
rateDate=tmp$rateList$rateDate,
rateContent=tmp$rateList$rateContent,
check.rows=TRUE)
)
return(ratetmp)
}
# 拼接初始链接currentPage=
gurl <- paste("https://rate.tmall.com/list_detail_rate.htm?itemId=",itemId,
"&sellerId=",sellerId,
"¤tPage=",
sep="",collapse="")
# 抓取第一页的评价
tmp <- getURL(paste0(gurl,1))
tmpData <- tmp$rateLog
# 记录评价的总页数
lastPage <- tmp$lastPage
# 循环抓取每一页的评价记录
if (lastPage > 1){
for (i in 2:lastPage){
tmpData <- rbind(tmpData,
getURL(paste0(gurl,i))$rateLog)
}
}
tmpData$sellerId <- sellerId
tmpData$itemId <- itemId
return(tmpData)
}
- 运行脚本,抓取宝贝评价,并保存到对象td
sellerId <- 2838892713
itemId <- 540677983314
td <- getAllRate(itemId, sellerId)
- 开始绘制词云前,需要对评价进行分词。
分词,就是把巴拉巴拉的一堆文字拆成词,以及统计每个词的出现频次。R语言中常用的分词包有rwordseg和jiebaR。rwordseg的可控制性比较好,能比较方便地搞自定词典,但需要说明的地方太多了,都能再写个几篇出来了。还是用jiebaR吧,注释能省好多字呢。_
# 分词和统计词频
install.packages("jiebaR")
install.packages("wordcloud2")
library(jiebaR)
library(wordcloud2)
# 把要分词的评价提出来,保存入对象wd
wd <- paste(td$rateContent,sep="",collapse="")
# 创建分词引擎
mixseg <- worker("mix")
# 分词和词频统计
kd <- segment(wd,jiebar=mixseg)
kd <- kd[nchar(kd)>1] # 筛选掉字符数只有1的无意义词
sd <- data.frame(table(kd)) # 统计各个词的频数
sd <- sd[sd$Freq>5,] # 只保留频数多于5的词
sd <- sd[-grep(pattern="华为|手机",sd$kd),] # 删除一些无实际意义的中性词
sd <- sd[order(sd$Freq,decreasing=TRUE),] # 排序
wordcloud2(sd) # 绘图,提供很丰富的参数,可以做得很漂亮
简单看一下:1.Mate 9的评价挺不错的,对客服、流畅、速度方面的评价较好。2.苹果又躺枪了,行业标杆伤不起啊。3.光学镜头关注的人挺多,我个人试了下确实不错,点个赞。
另外,wordcloud2包制作的词云图可以保存为交互式网页,回头试一下就知道了。
- 自定义词云形状。
做个黑白的图片,放在wordcloud2的examples目录下,就可以用了。哎,以前出神入话的画猪头技术退步了
piggy <- system.file("examples/pig.png",package="wordcloud2")
wordcloud2(sd,figPath=piggy)