全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 R语言论坛
7524 4
2014-05-16
目前一些介绍网页数据抓取的方法往往局限在一页上进行,如《在R语言中使用正则表达式》。需要说明的是,尽管《在R语言中使用正则表达式》介绍的方法也是针对豆瓣电影250的数据,但其实已不适合目前分5页显示的豆瓣电影250。为此,如果仿照该方法来抓取数据,只能抓取第一页而不是全部的电影数据,为此,本文的目的在于扩展运用《在R语言中使用正则表达式》介绍的方法,实现多页数据的一次性动态提取和整合。
movie.all<-NULL    #设定汇总数据框初始状态;
for (n in 0:4){        #循环提取页面信息;
movie<-NULL;
url=paste("http://movie.douban.com/top250?start=",n*50,"&filter=&format=text",sep="")
# 获取网页源代码,以行的形式存放在web变量中
web <- readLines(url,encoding="UTF-8")

# 找到包含电影名称的行编号,并据此提取行内容;
name <- web[grep('<td headers="m_name">',web)+1]
# 用正则表达式来提取电影名
gregout <- gregexpr('>\\w+',name)
getcontent <- function(s,g){
substring(s,g+1,g+attr(g,'match.length')-1) #注substing(字符串,起始位,结束位)
}

movie.names = 0
for(i in 1:length(gregout)){
movie.names<-getcontent(name,gregout[])
}

# 找到包含电影发行年份的行编号并进行提取
year <- web[grep('<span class="year">',web)]
movie.year <- substr(year,36,39)

# 找到包含电影评分的行编号并进行提取
score <- web[grep('<td headers="m_rating_score">',web)+1]
movie.score <- substr(score,21,23)

# 找到包含电影评价数量的行编号并进行提取
rating <- web[grep('<td headers="m_rating_num">',web)+1]
movie.rating <- sub(' *','',rating)

movie<- data.frame(names=movie.names,year=as.numeric(movie.year),
score=as.numeric(movie.score),rate=as.numeric(movie.rating))         #将每页数据整合到一个临时数据框中;
movie.all<-rbind(movie.all,movie)               #将多页数据整合到一个数据框中;
}
复制代码
    整合好的250部电影的数据存放在movie.all数据框中,结果为:

str(movie.all)
'data.frame': 250 obs. of 4 variables:
$ names: Factor w/ 249 levels "阿凡达","阿甘正传",..: 43 46 2 3 10 16 26 35 44 12 ...
$ year : num 1994 1994 1994 1993 2010 ...
$ score: num 9.5 9.4 9.3 9.4 9.2 9.1 9.4 9.1 9.3 9.1 ...
$ rate : num 475026 449389 408079 316811 4546
现在我们就可以进行数据分析了
(1)目前评分最高的这250部电影的时间分布:

(2)时间+评分分布情况(热力图)


3)时间+评分+评分人数情况(气泡图)


二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

全部回复
2014-5-16 15:51:33
有XML包为啥不用, 非要用grep硬抓呢?
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2015-5-25 21:15:17
看不到图啊
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2015-6-9 16:47:20
for循环的时候会下标越界,这是为什么啊?
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2016-4-28 20:51:30
显示这个结果是什么原因??:Error in g + 1 : 二进列运算符中有非数值参数
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群