我的收藏@IT·互联网程序员

R语言学习:抓取天猫评价,以及制作词云图

2017-03-12  本文已影响1334人  无鱼二饼

在上期学习笔记中,记录了使用rvest包抓取宝贝搜索结果页的过程,其中记录了宝贝ID和sellerID。这次学习使用宝贝ID和sellerID抓取评价。

分析宝贝评价页面结构

上个月刚承老婆大人赏了台Mate9,这次试试看能不能抓到Mate9的评价。

该链接返回的是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&currentPage=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&currentPage=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,
                  "&currentPage=",
                  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)
}
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) # 绘图,提供很丰富的参数,可以做得很漂亮
图片.png

简单看一下:1.Mate 9的评价挺不错的,对客服、流畅、速度方面的评价较好。2.苹果又躺枪了,行业标杆伤不起啊。3.光学镜头关注的人挺多,我个人试了下确实不错,点个赞。
另外,wordcloud2包制作的词云图可以保存为交互式网页,回头试一下就知道了。

做个黑白的图片,放在wordcloud2的examples目录下,就可以用了。哎,以前出神入话的画猪头技术退步了

piggy <- system.file("examples/pig.png",package="wordcloud2")
wordcloud2(sd,figPath=piggy)
图片.png
上一篇下一篇

猜你喜欢

热点阅读