前言:用rvest包爬取豆瓣图书Top250榜单数据,然后做简单的数据分析,练习一下用ggplot2包画图。
豆瓣读书官网上有个豆瓣图书Top250,依次展示了250本图书,根据豆瓣网的介绍:
豆瓣用户每天都在对“读过”的书进行“很差”到“力荐”的评价,豆瓣根据每本书读过的人数以及该书所得的评价等综合数据,通过算法分析产生了豆瓣图书 Top 250。
打开榜单,页面是这样的:
基本上都是大家很熟悉的书,很多书就算你没看过,多少也听说过书名。
为了更好地了解上榜图书,我用RStudio写了代码,爬下了榜单图书的数据。
先观察一下页面,发现一共10个页面,每一页上25本书, 第二页网址为:https://book.douban.com/top250?start=25,每个页面的网址只有最后的数字不同。
爬数据的代码如下:
library("rvest")
library("xml2") #加载用到的包
book <-data.frame() #先建立一个空的数据框
for (i in 1:10){ #写一个循环,批量爬取10个页面的数据
url <- paste0("https://book.douban.com/top250?start=",(i-1)*25) #paste0()用来连接字符串
web <- read_html(url,encoding="UTF-8")
name <- web %>% html_nodes("tr>td:nth-child(2)>div.pl2>a") %>% html_text() #爬取书名
info <-web %>% html_nodes("tr>td:nth-child(2)>p.pl") %>% html_text() #爬取图书具体信息,包括作者、出版社、出版时间等
point<-web %>% html_nodes("div.star.clearfix>span.rating_nums") %>% html_text() %>% as.numeric() #爬取评分
value<-web %>% html_nodes("div.star.clearfix>span.pl") %>% html_text() %>% as.character() #爬取评分人数
bookinfo <-data.frame(name,info,point,value)
book <-rbind(book,bookinfo)
}
write.csv(book,file="E:/douban_book.csv") #保存数据
csv文件打开是这样的:
直接在excel里面对数据进行清洗,数据分列、去除冗余字符等,再将清洗完成的数据保存为csv格式。
接下来就可以用ggplot2包来画图分析。
library("sqldf")
library("ggplot2") #加载所用到的包
book <- read.csv("E:/doubanbook250.csv") #打开文件
head(book,10)#查看数据前10行
数据一共包含八个属性,书名(name)、作者国籍(nation)、作者(author)、译者(translator)、出版社(press)、评分(rating)、评价人数(comments)、出版年份(year)。
1
看一下这些书作者的国籍分布。
ggplot(book,aes(x=nation)) + geom_bar() #画频数分布条形图
超过一半的书作者都是中国人,将国籍为“中”的数据筛选出去,看一下榜单上外国图书情况。
用subset()筛选出作者不是中国人的图书,然后画一个频数分布条形图。
foreign_book <- subset(book,nation !="中")
ggplot(foreign_book,aes(x=nation)) + geom_bar()
美国、英国、日本和法国比较瞩目。
2
画箱型图,看一下榜单上不同国家图书的评分情况。
ggplot(sqldf("select*from book where nation in ('中','英' ,'美' ,'日','法')")
,aes(x=factor(nation),y=rating)) + geom_boxplot()
榜单上英国图书的平均评分是最高的,其次是中国、美国。
3
rating_order <- sqldf("select * from book order by rating desc")
head(rating_order,10)$name #查看评分最高的十本书
按照评分对数据做降序处理,显示出评分最高的十本书,分别是《红楼梦》、《海贼王》、《活着》、《三体Ⅱ: 黑暗森林 》、《飘》、《1984》、《 一九八四·动物农场》、《 冰与火之歌: 权力的游戏》、《百年孤独》、《三体Ⅲ: 死神永生》。
4
comments_order <- sqldf("select * from book order by comments desc")
head(comments_order,10)$name #查看评价人数最高的十本书
评价人数一定程度上也能说明图书目前的火热程度,筛选出评价人数最多的十本书,分别是《追风筝的人 》、《 解忧杂货店 》、《小王子 》、《白夜行》、《围城 》、《挪威的森林》、《三体: “地球往事”三部曲之一》、《嫌疑人X的献身》、《百年孤独》、《 看见 》。
5
ggplot(book,aes(x=year)) + geom_freqpoly(binwidth = 1)
#出版年份频数多边形
TOP榜单上的图书大多都是在2000年到2015年之间出版的。
6
press_group <- sqldf("select press,count(*) as press_num from book group by press ")
press_group_top <- sqldf("select * from press_group where press_num > 9")
press_group_top
结果如下:
press press_num
1 上海译文出版社 23
2 人民文学出版社 36
3 南海出版公司 15
4 生活·读书·新知三联书店 12
TOP榜单中的“明星出版社”分别是人民文学出版社、上海译文出版社、南海出版公司 和生活·读书·新知三联书店。榜单中超过10%的书都是由人民文学出版社出版的。
7
author_top <- sqldf("select author,count(*) as author_num from book group by author")
sqldf("select * from author_top where author_num > 3 order by author_num desc")
结果如下:
author author_num
1 村上春树 9
2 J. K. 罗琳 7
3 王小波 7
4 金庸 6
5 东野圭吾 5
6 三毛 5
7 阿加莎·克里斯蒂 4
8 刘慈欣 4
9 幾米 4
10 张爱玲 4
11 鲁迅 4
12 龙应台 4
看一下哪些作者上榜的图书数量比较多,结果表明这250本书,村上春树一人就贡献了9本
其次是J. K. 罗琳,上榜了7本,王小波是7本。其他如金庸、东野圭吾、 三毛、阿加莎·克里斯蒂 、刘慈欣,都是大家耳熟能详的名字。
总结:用rvest包爬取豆瓣图书Top250榜单的数据,并做了简单的分析,主要练习了ggplot2画图,还使用了sqldf。在使用R语言分析数据时,可以借助sqldf的帮助直接编写sql语句来处理数据,十分方便快捷。
网友评论