楼主: ZQZ520
7523 4

[实际应用] 多网页数据的动态提取与整合 [推广有奖]

  • 2关注
  • 49粉丝

院士

17%

还不是VIP/贵宾

-

威望
4
论坛币
-1176554 个
通用积分
6481.7315
学术水平
99 点
热心指数
203 点
信用等级
94 点
经验
31773 点
帖子
656
精华
7
在线时间
2457 小时
注册时间
2014-5-7
最后登录
2021-8-4

楼主
ZQZ520 在职认证  发表于 2014-5-16 15:29:35 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
目前一些介绍网页数据抓取的方法往往局限在一页上进行,如《在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)时间+评分+评分人数情况(气泡图)


二维码

扫码加我 拉你入群

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

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

关键词:正则表达式 Movie 豆瓣电影 数据抓取 抓取数据 表达式 动态 网页




CDA数据分析交流群 217748971

沙发
马甲1号 发表于 2014-5-16 15:51:33
有XML包为啥不用, 非要用grep硬抓呢?
归欤!归欤!吾党之小子狂简,斐然成章,不知所以裁之。

藤椅
hhy1204 发表于 2015-5-25 21:15:17
看不到图啊

板凳
blackgcm 发表于 2015-6-9 16:47:20
for循环的时候会下标越界,这是为什么啊?

报纸
何武德 发表于 2016-4-28 20:51:30
显示这个结果是什么原因??:Error in g + 1 : 二进列运算符中有非数值参数

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2026-1-11 15:27